Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Загрузка файла из списка 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.073 c
2-1331717137
QWERTY_
2012-03-14 13:25
2013.03.22
сравнение crc32


15-1329135391
Kerk
2012-02-13 16:16
2013.03.22
KaZaNoVa


1-1297432162
Gu
2011-02-11 16:49
2013.03.22
Доверие виндов


1-1295420389
noob_one
2011-01-19 09:59
2013.03.22
DBGridEh. Как программно скопировать в буфер обмена?


8-1227817299
nuflin
2008-11-27 23:21
2013.03.22
Формат файла *smd





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский