Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.09.2023, 16:50
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Вопрос Как вывести размер файла

Здравствуйте! как вывести размер файла
Код:
procedure TForm1.FileSearch(const dirName:string);
var
  searchResult: TSearchRec;  a : array [1..255] of Integer;
begin
  if FindFirst(dirName+'\*', faAnyFile, searchResult)=0 then begin
    try
      repeat
        if (searchResult.Attr and faDirectory)=0 then begin
          if SameText(ExtractFileExt(searchResult.Name), '.jpg') then begin
            ListBox2.Items.Append(IncludeTrailingBackSlash(dirName)+searchResult.Name);
            memo3.Lines.Add(inttostr(searchResult.Size)); //size image

            // a[i]:=searchResult.Size;
            // memo5.Lines.Add(inttostr(a[i]));

          end;
        end else if (searchResult.Name<>'.') and (searchResult.Name<>'..') then begin
          FileSearch(IncludeTrailingBackSlash(dirName)+searchResult.Name);
         end;
      until FindNext(searchResult)<>0
    finally
      FindClose(searchResult);
    end;
  end;
end;

Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
FileSearch('d:\image');
memo5.Lines.Add(a);
end;
Спасибо!
Ответить с цитированием
  #2  
Старый 19.09.2023, 21:13
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение тест

вернее как его вывести я знаю:
Код:
memo5.Lines.Add(inttostr(a[i]));
как сделать чтобы значение передавались по кнопке:
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
FileSearch('d:\image');
memo5.Lines.Add(a);
end;
Ответить с цитированием
  #3  
Старый 19.09.2023, 23:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну сделай call-back в функции поиска, например.
Или я просто не понимаю что ты хочешь. Вывод информации о файле при клике на его имя в ListBox? Ну так для этого эту информацию надо где-то сохранять. Тут есть разные варианты. Надо понимать что надо сделать, как это должно работать с точки зрения пользователя, а уж как это сделать - вопрос чисто технический, тем более, что задача типовая...
Ответить с цитированием
  #4  
Старый 20.09.2023, 04:33
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка на самом деле

я тоже подумал записать в простой listbox и считывать от туда
Код:
ListBox2.Items.Append(IncludeTrailingBackSlash(dirName)+searchResult.Name);
а в массив можно записать?
Код:
procedure TForm1.FileSearch(const dirName:string);
var
    searchResult: TSearchRec;
begin
Result:=searchResult.Size;
end;
 
Код:
procedure TForm1.Button6Click(Sender: TObject);
var i:integer;
begin
FileSearch('d:\image');
memo5.Lines.Add(Result);
end;
это чтобы понять. а так ругается здесь:
Код:
SqlQuery1.ParamByName('size').AsString := '4456874mb'; //inttostr(imgsize);
Ответить с цитированием
  #5  
Старый 20.09.2023, 07:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Еще раз.
Какой функционал ты пытаешься сделать?
Поиск файлов и вставка их в БД? Т.е. пользовательского интерфейса нет.
Соответсвенно, вполне можно сделать CallBack в процедуре поиска которая и будет всталять записи в БД. Да, можно заполнить массив/список и уже из него вставлять. А зачем промежуточный код?

Например, возьмем твой код и немного его переделаем:
Код:
type
  TInsertImageToDbCallBack = procedure(AFileName : String; ASize : Integer) of object;

procedure TForm1.FileSearch(const dirName:string; ACallBack : TInsertImageToDbCallBack);
var
  searchResult: TSearchRec;  a : array [1..255] of Integer;
begin
  if FindFirst(dirName+'\*', faAnyFile, searchResult)=0 then begin
    try
      repeat
        if (searchResult.Attr and faDirectory)=0 then begin
          if SameText(ExtractFileExt(searchResult.Name), '.jpg') then begin
            ACallBack(IncludeTrailingBackSlash(dirName)+searchResult.Name,searchResult.Size);           end;
        end else if (searchResult.Name<>'.') and (searchResult.Name<>'..') then begin
          FileSearch(IncludeTrailingBackSlash(dirName)+searchResult.Name);
         end;
      until FindNext(searchResult)<>0
    finally
      FindClose(searchResult);
    end;
  end;
end;

Теперь вызов.
Делаем раз (делаем 2 callback'а, один для отладки, второй для вставки данных):
Код:
procedure TForm1.AddToMemoCb(AFileName : String; ASize : Integer);
begin
  Memo1.Lines.Add(Format('File: %s; Size: %d',[AFileName,ASize]));
end;

procedure TForm1.AddToDbCb(AFileName : String; ASize : Integer);
begin
  SQLQuery1.SQL.Clear;
  SQLQuery1.SQL.Add(Format('INSERT INTO tablename (name, size) VALUES (%s, %d)',[AFileName,ASize]));
  SQLQuery1.Exec;
end;

Ну и, собственно, вызов:
Код:
FileSearch('c:\images\',AddToMemoCb); // Показали в Memo
FileSearch('c:\images\',AddToDbCb); // Записали в БД

А вообще, это еще и в отдельный поток можно "вытолкнуть", что бы основной процесс (интерфейс) не подвисал.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
leon2009 (20.09.2023)
  #6  
Старый 20.09.2023, 10:54
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение про id

про id забыли
Код:
FileSearch(IncludeTrailingBackSlash(dirName)+searchResult.Name,AddToMemoCb);
Код:
procedure TForm1.AddToMemoCb(AFileName : String; ASize : Integer);
begin
inc(id);
  Memo5.Lines.Add(Format('id: %id, File: %s; Size: %d',[AFileName,ASize]));
end;
Ответить с цитированием
  #7  
Старый 20.09.2023, 11:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, во первых, сам добавишь что там тебе надо.
Во вторых, главное что бы принцип понял, а конкретные поля принципиально ничего не меняют.
В третьих, как я понимаю, id - это уникальный идентификатор в БД. Проблема в том, что значение этого поля обычно не доступно до тех пор. пока запись не будет добавлена в таблицу. Более того, обычно новый id либо запрашивается из БД, либо вообще добавляется триггером автоматически (его в этом случае даже не указывают в запросе вставки записи). В подобном коде, когда идет вставка большого кол-ва записей, назначение id оставляется на БД. Потом, если надо, эти записи после вставки вычитываются из БД обратно и тогда получишь эти id.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter