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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.01.2023, 18:45
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Сообщение как прописать в DLL код загрузки

Здравствуйте! как процедуру упаковать в dll на 64б D11 Alex
под 32б работает отлично, но на 64б пишет не найдет файл.
может и сам код устарел.? нужно чтобы большой файл (огромный), загружался в memo и это отображалась в progressbar
пр:
Код:
procedure TForm1.LoadFile(const FileName: string);
const
  BufferSize = 65536;
var
  StrBuffer: array[0..BufferSize - 1] of Char;
  F: file;
  MemoryStream: TMemoryStream;
  Result, Max, Curr, Progress: Integer;
begin
  AssignFile(F, FileName);
  Reset(F, 1);
  Curr := 0;
  Max := FileSize(F) div BufferSize + 1;
  MemoryStream := TMemoryStream.Create;
  try
    repeat
      BlockRead(F, StrBuffer, BufferSize, Result);
      MemoryStream.Write(StrBuffer, Result);
      Inc(Curr);
      Progress := Curr * 100 div Max;
      ProgressBar1.Position	 := Progress;
      Application.ProcessMessages;
    until Result <= 0;

    MemoryStream.Seek(0, soBeginning);
    Memo1.Lines.LoadFromStream(MemoryStream);
  finally
    MemoryStream.Free;
  end;
  CloseFile(F);
  ProgressBar1.Position	 := 0;
  form1.Caption:= ' Super_dll' + inttostr(Memo1.Lines.Count);
  Button1.Enabled:=true;
 // form1.progressbar4.Position:=0;
 end;
здесь устраивает сама загрузка из файла, НО не устраивает как это показано в progressbar
таким же образом можно :
Код:
function GetFileSize(FileName: string): Int64;
var f:TMemoryStream;SizeOfApp: Int64;
begin
    F:=TMemoryStream.Create;
try
    F.LoadFromFile(FileName);
    form1.ProgressBar1.Max:=F.Size;
    form1.ProgressBar1.Position:=F.Size;
    form1.memo1.Lines.LoadFromStream(f);
   // F.Seek(0, soBeginning);
  finally
   form1.Caption:= inttostr(SizeOfApp);
    F.Free;
end;
end;
сначала загрузит а потом отобразит
Может кто подсказать как это сделать по байтам. пр: файл весит 500кб значит progressbar.max=500;
и кусками загружать с отображением сколько байт загрузилось ....
НЕ Progressbar=progressbar+1
Ответить с цитированием
  #2  
Старый 31.01.2023, 21:41
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка супер способ

есть такой способ
Код:
procedure TForm1.ReadMyFile;
var
  i, j: integer; s:string;
begin
  ProgressBar1.Max := GetFileSize('send2100816.txt');
  ProgressBar1.position := 0;
  assignfile(f, 'send2100816.txt');
  Canceled := False;
  reset(f);
  i := 0;
  j := 0;
  while not eof(f) do
  begin
    inc(j);
    readln(f, s);
    i := i + length(s) + 2;
    if (j mod 1000) = 0 then
    begin
      ProgressBar1.position := i;
      Application.ProcessMessages;
      if canceled then
        break;
    end;
    memo1.Lines.Add(s);
  end;
  CloseFile(f);
end;
я успел попить чай, пройтись два раза во круг дома ....
Ответить с цитированием
  #3  
Старый 02.02.2023, 21:39
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Печаль проба

Код:
procedure LoadFile(FileName: TFileName);
var
 MemStr: TMemoryStream;
 Title: String;
begin
 MemStr:= TMemoryStream.Create;
 try
  MemStr.LoadFromFile(FileName);
  MemStr.Seek(0, soFromBeginning);
  //Title := ReadStreamStr( MemStr );
 finally
   MemStr.Free;
  end;
end;
exports
  LoadFile index 1;
begin
end.
Код:
function LoadFile(FileName: TFileName); external 'project1.dll' index 1;
procedure TForm1.Button1Click(Sender: TObject);
begin
LoadFile('111111.txt');
 memo1.Lines.LoadFromFile(LoadFile);
 ProgressBar1.position:= LoadFile;
end;
Ответить с цитированием
  #4  
Старый 03.02.2023, 15:15
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 340
Версия Delphi: 11.3
Репутация: 429
Сообщение

Я вот не понимаю для чего такие трудности. Вы же имеете дело с простым текстовым файлом, который собираетесь отображать в Memo, у которого собственная процедура LoadFromFile, работающая через TFileStream, прекрасно с этим справится.
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    begin
      Memo1.Clear;
      Memo1.Lines.BeginUpdate;
      Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
      Memo1.Lines.EndUpdate;
    end;
end;
Любая визуализация значительно замедляет процессы. При загрузке больших файлов можно сообщать пользователю, что это займет некоторое время. Этого будет вполне достаточно.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #5  
Старый 03.02.2023, 16:29
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Лампочка загрузить

загрузить просто текстовый документ проблем нет.
я его гружу чуть по другому через функцию.
Код:
 function LoadFile(FileName: TFileName):string;
var
 MemStr: TMemoryStream;  i:integer;
 Title: String;
begin
 MemStr:= TMemoryStream.Create;
 try
  MemStr.LoadFromFile(FileName);
  MemStr.Seek(0, soFromBeginning);
  //Title := ReadStreamStr( MemStr );
 finally
   MemStr.Free;
  end;
end;
проблема, что не могу сообразить, чтобы функция возвращала что нибудь в замен.
пр:
label1.caption:= MemStr.size;
и
memo1.Lines.LoadFromStream(LoadFile);
Ответить с цитированием
  #6  
Старый 09.02.2023, 19:19
leon2009 leon2009 вне форума
Новичок
 
Регистрация: 18.03.2009
Сообщения: 71
Репутация: 10
Стрелка ошибка_DLL_64

опять ошибки на 64бит, под 32бит все отлично. на 64 глюк
Код:
library Project1;
uses
  System.SysUtils,
  System.Classes;

{$R *.res}
function LoadFile(const FileName: TFileName):string;
var
  MemStr: TStringStream;
begin
  MemStr:= TStringStream.Create;
  try
    MemStr.LoadFromFile(FileName);
    MemStr.Seek(0, soFromBeginning);
    Result := MemStr.DataString;
  finally
    MemStr.Free;
  end;
end;

function SaveFile(const FileName: TFileName; text:string):string;
var
  MemSave: TStringStream;
begin
  MemSave:= TStringStream.Create;
  try
    MemSave.WriteString(text);
    MemSave.savetofile(FileName);
  finally
    MemSave.Free;
  end;
end;
exports
  LoadFile, SaveFile;
begin
end.
супер_кнопка
Код:
with OpenDialog1 do
    if Execute then memo1.Lines.Text:=LoadFile(OpenDialog1.FileName);
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter