Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];
Внизупростить алгоритм TStrings.SetDelimiterText Найти похожие ветки
← →
Scott Storch (2011-01-19 13:14) [0]есть строка имен файлов, разделенных запятой:
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;
Может алгоритм можно упростить, где-то что-то лишнее и можно заменить?
← →
KSergey © (2011-01-19 13:37) [1]А зочем?
Взять как раз TStringList, использовать из него метод SetDelimitedText
После пробежать по items и заполнить структуры, привязанные к свойству Object
Какой смысл копировать имеющийся код?
← →
RWolf © (2011-01-19 13:37) [2]Почему бы просто не использовать 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;
← →
Slym © (2011-01-20 05:53) [3]а мне нравится 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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c