![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загрузка файла из списка ComboBox [D7]
Кос © (2012-03-02 10:05:00)
procedure TForm1.FormCreate(Sender: TObject);
var
SR: TSearchRec;
FindRes: Integer;
begin
ComboBox1.Clear;
FindRes := FindFirst('C:\1\*.*', faAnyFile, SR);
while FindRes = 0 do
begin
ComboBox1.Items.Add(SR.Name);
FindRes := FindNext(SR);
end;
FindClose(SR);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
List : TStringList;
i,j : integer;
S : String;
begin
List := TStringList.Create;
S:=ComboBox1.Items[5];
List.LoadFromFile(S);
StringGrid1.RowCount := List.Count;
for i:=0 to StringGrid1.RowCount-1 do
with StringGrid1.Rows[i] do
begin
Delimiter:=' ';
DelimitedText:=List[i];
end;
end;
Собственно в выпадающем списке имена файлов находящихся в папке 1 диска С. Кстати как их отсортировать по дате и выбросить из списка ComboBox ( . и ..), которые при поиске записываются в Items ComboBox'a ? Далее хочу при выборе файла из списка загружать его в StringGrid, если ручками прописать конкретный файл, то код работает. Не получается реализовать с изменяющимся файлом S.
(2012-03-28 19:22:00) [1]Удалено модератором
(2012-03-28 19:21:00) [2]Удалено модератором
(2012-03-28 19:21:00) [3]Удалено модератором
Anatoly Podgoretsky (2012-03-28 15:11:00) [4]FormatDateTime описан в справке
Кос (2012-03-28 14:13:00) [5]А как правильно тогда будет описать ?
И вообще структура правильная ? Или такой нет в delphi ?
Anatoly Podgoretsky (2012-03-28 13:13:00) [6]
> Вопрос резонный сам впервые с таким сталкиваюсь
F1 - FILETIME по MS SDK и Add по Delphi
Anatoly Podgoretsky (2012-03-28 13:10:00) [7]> Кос (28.03.2012 12:48:24) [24]
Неверный формат вызова, тебе же сказали что ожидается ) а у тебя что -
структура filetime
Кос (2012-03-28 12:59:00) [8]нет переводить не надо и так понятно.
Вопрос резонный сам впервые с таким сталкиваюсь
Плохиш (2012-03-28 12:55:00) [9]
> [Error] Unit2.pas(47): '(' expected but ')' found
>
Тебе перевести что ли?
> List2.Add(FormatDateTime('yyyy-mm-dd-hh-nn-ss-zzz', FileTime) + '=' + SR.Name);
Этот маразм на каком языке программирования поддерживатся?
Кос (2012-03-28 12:48:00) [10]
> Можно строки в списке хранить в виде =, например:
>
> List.Add(FormatDateTime('yyyy-mm-dd-hh-nn-ss-zzz', FileTime)
> + '=' + SR.Name)
>
> тогда для сортировки достаточно List.Sort, а в комбобокс
> в цикле скопировать List.ValueFromIndex[i]
>
>
List2 := TStringList.Create;
FindRes := FindFirst('C:\êîíòðîëüíûå ôàéëû\*.*', faAnyFile, SR);
while FindRes = 0 do
begin
if (SR.Name '.') and (SR.Name '..') then
List2.Add(FormatDateTime('yyyy-mm-dd-hh-nn-ss-zzz', FileTime) + '=' + SR.Name);
List2.Sort;
ComboBox1.Items.Add(List2.ValueFromIndex[i]);
FindRes := FindNext(SR);
end;
FindClose(SR);
List2.Free;
Ошибка в строке
List2.Add(FormatDateTime('yyyy-mm-dd-hh-nn-ss-zzz', FileTime) + '=' + SR.Name);
[Error] Unit2.pas(47): '(' expected but ')' found
Loginov Dmitry (2012-03-03 00:29:00) [11]
> А сортировку как по дате применить не подскажите ?
Можно строки в списке хранить в виде <дата>=<имя>, например:
List.Add(FormatDateTime('yyyy-mm-dd-hh-nn-ss-zzz', FileTime) + '=' + SR.Name)
тогда для сортировки достаточно List.Sort, а в комбобокс в цикле скопировать List.ValueFromIndex[i]
Anatoly Podgoretsky (2012-03-02 16:27:00) [12]Легко можешь проверить, увеличить длину строк как минимум в 10 раз и повтори измерение
AV (2012-03-02 16:10:00) [13]
> а передавал пустую строку?
не, "йцу"
> В обеих случаях передается указатель строки или прямо, или
> его копия.
похоже, так.
Скопировать указатель - как раз, наверное, и будет это потраченное-выигрышное время.
Anatoly Podgoretsky (2012-03-02 15:50:00) [14]> CRLF (02.03.2012 14:46:16) [16]
В обеих случаях передается указатель строки или прямо, или его копия.
CRLF (2012-03-02 15:46:00) [15]Проверил с функцией, возвращающей первый символ строки, на строках 255 символов, оптимизация отключена, миллиард циклов. 25654мс против 6808мс. Почти четыре раза. При включенной оптимизации 24596 против 1951.
CRLF (2012-03-02 15:17:00) [16]а передавал пустую строку? для сравнения производительности передавай непустую строку и выполняй над нею хоть какие-то действия. А то делфовый оптимизатор мало ли что наоптимизирует.
AV (2012-03-02 14:57:00) [17]
> Второй вариант в разы быстрее.
хм, да, есть такое дело.
Но, копейки.. на 10 000 000 вызовов пустой процедуры с const и без выигрыш составил 150 тиков.
всего-то...
CRLF (2012-03-02 14:46:00) [18]
> а оно по умолчанию не так разве?
По умолчанию строка копируется и передаётся копия, над которой можно измываться. Со спецификатором const передаётся адрес строки и изменять её нельзя. Второй вариант в разы быстрее.
AV (2012-03-02 14:16:00) [19]
> CRLF
не учу, просто идея.
да и идея - так себе :), да.
Каждый раз дергать файлы - на больших списках долго будет
Согласен что
Надо либо items.objects[] заюзать
либо второй список, подходящий.
> 1. Параметризуешь -- так уж параметризуй по-людски...
прямо тут писал, на скопированном коде свыше ( :) )
> 2. В TSearchRec.FindData лежат дата-время создания, модицикации
> и последнего доступа. Игнорировать эту уже найденную информацию
> и гонять в цикле FileAge и FileExist крайне глупо.
+
> 3. Да ещё и строку без const передаёшь :-(
а оно по умолчанию не так разве?
CRLF (2012-03-02 13:25:00) [20]3. Да ещё и строку без const передаёшь :-(