|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
как прописать в 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; таким же образом можно : Код:
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
|
|||
|
|||
ошибка_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); |