Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi mysteriöse EAccessViolation (https://www.delphipraxis.net/2382-mysterioese-eaccessviolation.html)

nailor 21. Jan 2003 23:20

function Read(var Buffer; Count: Longint): Longint; override;

Sagt meine Hilfe. Aber dein Buffer ist ein String. Also erst mal mit Zahlen arbeiten, und dann in String umwandeln, oder TextFile nehmen.

BrainCode 22. Jan 2003 20:00

Liste der Anhänge anzeigen (Anzahl: 2)
Mit dem Datentyp hatte ich mich geirrt, es ist ein Longint.

Code:
Memo1.Lines.LoadfromFile('c:\Test.txt');
Das hier funktioniert zwar bei Textdateien, ich will aber auch, wie Notepad, binäre Dateien wie z.B. exe oder gif-Dateien öffnen können.

Der Tip mit buffer[1] hat mir sehr geholfen, auch dieser funzt mit Textfiles wunderbar, aber wie das mit einer Gif-Datei aussieht, könnt ihr im Anhang bestaunen :zwinker: ...

Die Screenshots sind von einem Programmablauf mit folgendem Code entstanden:
Code:
const
  count = 1024;
var
  datei: tfilestream;
  buffer: string;
  r: longint;
begin
  if opendialog1.Execute then begin
    datei := tfilestream.Create(opendialog1.FileName,fmopenread or fmsharedenynone);
    setlength(buffer,count);
    repeat
      r := datei.Read(buffer[1],sizeof(buffer));
      memo1.Text := memo1.Text + buffer;
      //showmessage(inttostr(r));
    until (r < sizeof(buffer));
    datei.Free;
  end;
end;
Der Dateiname, der in dem Screenshot ständig zu sehen ist, ist der des gif-Bildes.

nailor 23. Jan 2003 13:37

So, lieber Braincode, teste mal den folgenden Code:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
const
  Count = 1024;
var
  Datei: TFileStream;
  Buffer: array[0..(Count-1)] of Char;
  l,i:   Word;
  Result: TCaption;
begin
if not OpenDialog1.Execute then Exit;

Memo1.Clear;
Result := '';

Datei := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
try
  while true do
    begin
      l := Datei.Read(Buffer, Count);
      if l <> Count then
        begin
          if not (l = 0) then
            for i := 0 to (l - 1) do
              Result := Result + Buffer[i];
          Break;
        end;
      Result := Result + Buffer;
    end;
finally
  Datei.Free;
end;

Memo1.Text := Result;
end;
sollte eigentlich jede Datei brav einlesen. Nur nicht Count auf 0 stellen, oder andere idiotische Sachen. Ähm, so Sachen wie Fortschrittsanzeige oder so, kann man wenn man Lust hat auch noch einbauen.


PS: nochmal zu deinem Ursprungscode:

Delphi-Quellcode:
r := datei.Read(buffer[1],sizeof(buffer));
Scheint mir ein wenig verdächtig.

Edit: ich nenne nie mehr eine Variable "l" (kleines L) das ist ja schlimm zu lesen, wenn die Zahlen keine andere Farbe bekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:52 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz