![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
упростить алгоритм TStrings.SetDelimiterText
Scott Storch © (2011-01-19 13:14:00)есть строка имен файлов, разделенных запятой:
tmp\log_2011_01_17_22_07.dat, tmp\log_2011_01_18_12_24.dat, tmp\log_2011_01_18_17_11.dat
задача: сформировать из строки список типа TFile
TFile = record
Name: string;
Size: Int64;
CRC32: Cardinal;
end;
Для разбиения строки взял за основу алгоритм TStrings.SetDelimitedText, получилось так:
procedure list_of_file_names(const AVal: string; AList: TList<TFile>);
var
P1, P2: PChar;
S: string;
begin
P1 := PChar(AVal);
while P1^ in [ #1..' '] do
P1 := CharNext(P1);
while P1^ <> #0 do
begin
P2 := P1;
while (P1^ > ' ') and (P1^ <> ',') do
P1 := CharNext(P1);
SetString(S, P2, P1 - P2);
AList.Add(TFile(ExtractFileName(S), get_file_size(S), get_file_crc32(S)));
while P1^ in [ #1..' '] do
P1 := CharNext(P1);
if P1^ = ',' then
repeat
P1 := CharNext(P1);
until
not (P1^ in [ #1..' ']);
end;
end;
Может алгоритм можно упростить, где-то что-то лишнее и можно заменить?
Slym (2011-01-20 05:53:00) [1]а мне нравится Fetch из Indy
procedure list_of_file_names(AVal: string; AList: TList<TFile>);
var
S: string;
begin
while length(AVal)>0 do
begin
s:=Fetch(AVal,',');
AList.Add(TFile(ExtractFileName(S), get_file_size(S), get_file_crc32(S)));
end;
end;
KSergey (2011-01-19 13:37:00) [2]А зочем?
Взять как раз TStringList, использовать из него метод SetDelimitedText
После пробежать по items и заполнить структуры, привязанные к свойству Object
Какой смысл копировать имеющийся код?
RWolf (2011-01-19 13:37:00) [3]Почему бы просто не использовать TStrings.CommaText?
sl.CommaText:=AVal;
for i:=0 to sl.Count-1 do
begin
s:=Trim(sl[i]);
AList.Add(TFile(ExtractFileName(), get_file_size(S), get_file_crc32(S)));
end;