Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Загрузка файла из списка ComboBox   Найти похожие ветки 

 
Кос   (2012-03-02 10:05) [0]

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.


 
AV ©   (2012-03-02 10:21) [1]


> выбросить из списка ComboBox ( . и ..)

это директории
faAnyFile xor faDirectory


> как их отсортировать по дате

любым способом сортировки


> хочу при выборе файла из списка загружать его в StringGrid

S:=ComboBox1.Text;
List.LoadFromFile(S);


 
CRLF   (2012-03-02 10:39) [2]


> если ручками прописать конкретный файл, то код работает.
>  Не получается реализовать с изменяющимся файлом S
С путями что-то напутал 100%


 
Кос   (2012-03-02 10:46) [3]

S:=ComboBox1.Text;
List.LoadFromFile(S);

Почему, обращение при этом идёт к каталогу где находится проект. Соответственно закрывается ошибкой файл не найден.


 
AV ©   (2012-03-02 11:00) [4]

если не указанj полное имя, файл ищется в папке по умолчанию(каталогу где находится проект) и папках по путям в %Path%


 
Кос   (2012-03-02 11:36) [5]

А как тогда реализовать ?


 
Кос   (2012-03-02 11:45) [6]

List.LoadFromFile("C:\1\"+S);
Вопрос снят, спасибо


 
CRLF   (2012-03-02 11:46) [7]

можешь сохранять с путями, можешь сначала установить текущий каталог, затем загружать так, как ты сейчас загружаешь


 
Кос   (2012-03-02 11:51) [8]

А сортировку как по дате применить не подскажите ?


procedure TForm1.FormCreate(Sender: TObject);
var
 List:Tstringlist;
 SR: TSearchRec;
 FindRes: Integer;
begin
 List:=Tstringlist.Create;
 ComboBox1.Clear;
 FindRes := FindFirst("C:\контрольные файлы\*.*", faAnyFile, SR);
 while FindRes = 0 do
 begin
   if (SR.Name <> ".") and (SR.Name <> "..") then
   ComboBox1.Items.Add(SR.Name);
   FindRes := FindNext(SR);
 end;
 FindClose(SR);
 List.Sort;
 ComboBox1.Items:=List.Text;
 List.Free;

вот накидал на скорую руку


 
CRLF   (2012-03-02 12:03) [9]

во-первых, почитай про try finally end.
во-вторых, с сортировкой по дате так "в лоб" не получится. нужно хранить пары "дата-имя", сортировать по дате, а затем в список запихивать имена файлов.


 
CRLF   (2012-03-02 12:05) [10]

как вариант: создай список, который будет хранить даты, при нахождении очередного файла определяй, на какую позицию нужно вставить файл, чтобы список оставался отсортированным, вставляй дату файла в этот список, а имя файла в то, что у тебя фигурирует как List.


 
AV ©   (2012-03-02 12:40) [11]

или аля как-то так, т.к. дата уже есть - это же не просто строки, это файлы

 procedure AddIt(s: string);
 begin
   if FileExist() и прочая лабудень then
   for i:= ComboBox1.Items.Count - 1 downto 0 do
   begin
     if FileAge(s) > FileAge(ComboBox1.Items[i]) then
     begin
       ComboBox1.Items.Insert(i, s);  Exit;
     end;
   end;
   ComboBox1.Items.Add(s);


 
Anatoly Podgoretsky ©   (2012-03-02 12:46) [12]


> А сортировку как по дате применить не подскажите ?

У Кнута целый, толстый том посвящен сортировке, а ты хочешь в несколько строк.


 
CRLF   (2012-03-02 13:09) [13]


> AV ©   (02.03.12 12:40) [11]
1. Параметризуешь -- так уж параметризуй по-людски... А то учишь новичка половину запараметризовать, а вторую половину в глобальные переменные распихать :-(
2. В TSearchRec.FindData лежат дата-время создания, модицикации и последнего доступа. Игнорировать эту уже найденную информацию и гонять в цикле FileAge и FileExist крайне глупо.


 
CRLF   (2012-03-02 13:25) [14]

3. Да ещё и строку без const передаёшь :-(


 
AV ©   (2012-03-02 14:16) [15]


> CRLF

не учу, просто идея.
да и идея - так себе :), да.
Каждый раз дергать файлы - на больших списках долго будет
Согласен что
Надо либо items.objects[] заюзать
либо второй список, подходящий.


> 1. Параметризуешь -- так уж параметризуй по-людски...

прямо тут писал, на скопированном коде свыше ( :) )


> 2. В TSearchRec.FindData лежат дата-время создания, модицикации
> и последнего доступа. Игнорировать эту уже найденную информацию
> и гонять в цикле FileAge и FileExist крайне глупо.

+


> 3. Да ещё и строку без const передаёшь :-(

а оно по умолчанию не так разве?


 
CRLF   (2012-03-02 14:46) [16]


> а оно по умолчанию не так разве?
По умолчанию строка копируется и передаётся копия, над которой можно измываться. Со спецификатором const передаётся адрес строки и изменять её нельзя. Второй вариант в разы быстрее.


 
AV ©   (2012-03-02 14:57) [17]


> Второй вариант в разы быстрее.

хм, да, есть такое дело.
Но, копейки.. на 10 000 000 вызовов пустой процедуры с const и без выигрыш составил 150 тиков.
всего-то...


 
CRLF   (2012-03-02 15:17) [18]

а передавал пустую строку? для сравнения производительности передавай непустую строку и выполняй над нею хоть какие-то действия. А то делфовый оптимизатор мало ли что наоптимизирует.


 
CRLF   (2012-03-02 15:46) [19]

Проверил с функцией, возвращающей первый символ строки, на строках 255 символов, оптимизация отключена, миллиард циклов. 25654мс против 6808мс. Почти четыре раза. При включенной оптимизации 24596 против 1951.


 
Anatoly Podgoretsky ©   (2012-03-02 15:50) [20]

> CRLF  (02.03.2012 14:46:16)  [16]

В обеих случаях передается указатель строки или прямо, или его копия.


 
AV ©   (2012-03-02 16:10) [21]


> а передавал пустую строку?

не, "йцу"


> В обеих случаях передается указатель строки или прямо, или
> его копия.

похоже, так.
Скопировать указатель - как раз, наверное, и будет это потраченное-выигрышное время.


 
Anatoly Podgoretsky ©   (2012-03-02 16:27) [22]

Легко можешь проверить, увеличить длину строк как минимум в 10 раз и повтори измерение


 
Loginov Dmitry ©   (2012-03-03 00:29) [23]


> А сортировку как по дате применить не подскажите ?


Можно строки в списке хранить в виде <дата>=<имя>, например:
List.Add(FormatDateTime("yyyy-mm-dd-hh-nn-ss-zzz", FileTime) + "=" + SR.Name)

тогда для сортировки достаточно List.Sort, а в комбобокс в цикле скопировать List.ValueFromIndex[i]


 
Кос   (2012-03-28 12:48) [24]


> Можно строки в списке хранить в виде <дата>=<имя>, например:
>
> List.Add(FormatDateTime("yyyy-mm-dd-hh-nn-ss-zzz", FileTime)
> + "=" + SR.Name)
>
> тогда для сортировки достаточно List.Sort, а в комбобокс
> в цикле скопировать List.ValueFromIndex[i]
>
>


 List2 := TStringList.Create;
 FindRes := FindFirst("C:\&#234;&#238;&#237;&#242;&#240;&#238;&#235;&#252;&#237;&#251;&#229;  &#244;&#224;&#233;&#235;&#251;\*.*", 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


 
Плохиш ©   (2012-03-28 12:55) [25]


> [Error] Unit2.pas(47): "(" expected but ")" found
>

Тебе перевести что ли?

>    List2.Add(FormatDateTime("yyyy-mm-dd-hh-nn-ss-zzz", FileTime) + "=" + SR.Name);

Этот маразм на каком языке программирования поддерживатся?


 
Кос   (2012-03-28 12:59) [26]

нет переводить не надо и так понятно.
Вопрос резонный сам впервые с таким сталкиваюсь


 
Anatoly Podgoretsky ©   (2012-03-28 13:10) [27]

> Кос  (28.03.2012 12:48:24)  [24]

Неверный формат вызова, тебе же сказали что ожидается ) а у тебя что -
структура filetime


 
Anatoly Podgoretsky ©   (2012-03-28 13:13) [28]


> Вопрос резонный сам впервые с таким сталкиваюсь

F1 -  FILETIME по MS SDK и Add по Delphi


 
Кос   (2012-03-28 14:13) [29]

А как правильно тогда будет описать ?
И вообще структура правильная  ? Или такой нет в delphi ?


 
Anatoly Podgoretsky ©   (2012-03-28 15:11) [30]

FormatDateTime описан в справке


 
имя   (2012-03-28 19:21) [31]

Удалено модератором


 
имя   (2012-03-28 19:21) [32]

Удалено модератором


 
имя   (2012-03-28 19:22) [33]

Удалено модератором



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.092 c
15-1338040596
Германн
2012-05-26 17:56
2013.03.22
Для чего нужна функция GradToRad из модуля Math?


15-1312895393
Kerk
2011-08-09 17:09
2013.03.22
Шахматный турнир


15-1339341068
Дмитрий С
2012-06-10 19:11
2013.03.22
TCP


6-1260461403
bob
2009-12-10 19:10
2013.03.22
Сетевая обработка данных


15-1338987676
Давайте будем жрать!
2012-06-06 17:01
2013.03.22
Отладка в XE2