![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте! как процедуру упаковать в 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;таким же образом можно : Код:
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
|
|||
|
|||
|
есть такой способ
Код:
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
|
|||
|
|||
|
Код:
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
|
||||
|
||||
|
Я вот не понимаю для чего такие трудности. Вы же имеете дело с простым текстовым файлом, который собираетесь отображать в 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
|
|||
|
|||
|
загрузить просто текстовый документ проблем нет.
я его гружу чуть по другому через функцию. Код:
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
|
|||
|
|||
|
опять ошибки на 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); |
|
#8
|
|||
|
|||
|
делаю так:
Код:
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
Result := '111111111';Цитата:
|
|
#9
|
|||
|
|||
|
документ перекодировал в ANSI и заработало
(( это теперь так каждый текст придется ? а ошибка говорит что нужно освобождать память которую беру из dll как я понял ![]() |
|
#10
|
|||
|
|||
|
ShortString= правильный ответ
|
|
#11
|
|||
|
|||
|
забивается - ошибки: два раза файл не откроешь
|
|
#12
|
|||
|
|||
|
ошибка возникает когда я открываю маленькие файлы кб если файл открываю 5 мб работает, меньше глюк.
![]() and dword ptr [r8 + rdx * 4], eax Последний раз редактировалось leon2009, 10.02.2023 в 10:33. |
|
#13
|
|||
|
|||
|
если функция находится в форме = то все отлично работает, но если функция уже в DLL _= то файлы которые меньше 164000 б = выскакивает ошибка (выше).
|
|
#14
|
|||
|
|||
|
Если правильно помню, то там с передачей строк из/в dll есть заморочка. Надо добавить в uses специальный модуль. Или передавать как PChar и, соответсвенно, танцы с выделением и освобождением памяти.
|
|
#15
|
|||
|
|||
|
Когда передаешь Pchar -> Китайские иероглифы в мемо.
если возможность почистить блок? в моем случае. Код:
function LoadFile(const FileName: TFileName):String; stdcall;
var
MemStr: TStringStream;
begin
MemStr:= TStringStream.Create;
try
MemStr.LoadFromFile(FileName);
MemStr.Seek(0, soFromBeginning);
if MemStr.Size >= 262144 then Result := MemStr.DataString
else Result:='File_Size_Error '+inttostr(MemStr.Size);
finally
MemStr.Free;
end;
end;![]() Последний раз редактировалось leon2009, 11.02.2023 в 08:10. |