Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TFileStream.read-> Binärdaten darstellen; Geschwindigkeit (https://www.delphipraxis.net/173663-tfilestream-read-binaerdaten-darstellen%3B-geschwindigkeit.html)

merovinger 9. Mär 2013 12:47

Delphi-Version: XE2

TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Hallo Community,

ich bin derzeit dabei, ein Programm zu schreiben, dass eine Datei visuell in Bytes darstellen soll.
Ich lese diese Datei wie folgt aus:
Delphi-Quellcode:
procedure TForm1.Date1Click(Sender: TObject);
var
  fs: TFilestream;
  buf : array of byte;
  l : int64;
  i,j:integer;
begin
  with Opendialog1 do begin
    if Execute then begin
      fs := TFilestream.Create(FileName, fmOpenread or fmShareDenyNone);
      try
        l := fs.Size;
        SetLength(Buf, l);
        fs.Seek(0, soFromBeginning);
        l := fs.Read(buf[0], l);
      finally
        fs.Free;
      end;
    end;
    {.....}
  end;
end;
Im Anschluss möchte ich nun den Buffer visuell darstellen.
Dazu verwende ich derzeit eine TStringGrid
Delphi-Quellcode:
procedure TForm1.Date1Click(Sender: TObject);
var
  fs: TFilestream;
  buf : array of byte;
  l : int64;
  i,j:integer;
begin
    {.......}
    //Form1.byteSG == TStringGrid;

    last := -16; //last wird lediglich verwendet, um den Pointer im Buffer zu steuern
    byteSG.RowCount := ceil((length(buf)-1) / 16)+1;
    for I := 1 to byteSG.RowCount-1 do begin
      last:=last+16;
      byteSG.Cells[0,i] := inttohex(last,8); //linke Spalte der TStrinGrid

      for j := 0 to 16 do begin
        if(last+j <= length(buf)-1) then begin
          byteSG.Cells[1+j,i] := inttohex(buf[i+j],2); //Bytewerte eintragen
        end;
      end;
      application.ProcessMessages;
    end;
end;
Mein Problem ist, dass diese Art der Umsetzung sehr langsam ist.
Bei einer Dateigröße von rund 7MB brauch der PC ca. 13 sec.

Wie kann ich die Darstellung beschleunigen?
Falls eine TStringGrid zur Darstellung ungeeignet/langsam ist, welches Objekt eigent sich besser?


Ich hoffe Ihr könnt mir da weiterhelfen.
Vielen Dank schon mal im Vorraus.

MfG Merovinger

Bummi 9. Mär 2013 13:40

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Du kannst ja mal
ein Listview vwersuchen
Delphi-Quellcode:
   Listview1.ViewStyle := vsReport;
   Listview1.OwnerData := true;
   Listview1.Items.Count := Länge/WasauchImmerDuAufEinmalAnzeigenWillst;

......

procedure TForm2.ListView1Data(Sender: TObject; Item: TListItem);
begin
   Item.Caption := DeineDarstellungDerDaten;
end;

hoika 9. Mär 2013 14:46

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Hallo,

Grid.Items.BeginUpdate/ EndUpdate verwenden.


Heiko

Bernhard Geyer 9. Mär 2013 16:29

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Byteweises einlesen von Dateien.
Auch ein Möglichkeit Zeit zu schinden :-)

hoika 9. Mär 2013 20:20

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Hallo,

es wird ein TFileStream benutzt.
Der liest das nicht byteweise.

Heiko

Aphton 9. Mär 2013 21:15

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Nun du zeigst ja nicht die ganze Datei an sondern nur ein Segment (~500 bytes evt).
Daher solltest du auch nicht alles Laden sondern nur das, was gebraucht wird - das geht dann dementsprechend schneller.

Dabei musst du halt immer beim Scrollen laden usw

p80286 9. Mär 2013 22:59

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Erstell doch einfach einen String aus den 16 Bytes/Zeile diesen String gibst Du dann in einem Tmemo oder TLabel aus oder du nutzt eine Canvas und schreibst mit Textout.

Gruß
K-H

merovinger 10. Mär 2013 08:34

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Vielen Dank schon mal für die ganzen Antworten!

@Bummi
Diese Idee Funktioniert recht gut.
Die ListView erscheint mir nur recht langsam bei dem Prozess, so dass man beobachten kann, wie der Inhalt stets neu aufgebaut wird. Kennst du einen Trick, wie man das umgehen kann?

@p80286
Die Idee hört sich sehr gut an. Mir mangelt es jedoch leider an der Umsetzung. Wie sähe dafür ein Codeschnipsel aus?

@Aphton
Lediglich Teile zu laden, ist auch eine sehr gute Idee. Dies könnte gerade für größere Dateien wichtig werden, damit diese den Arbeitsspeicher nicht überfordern.
Ich werde das im Hinterkopf behalten.

@hoika
Begin/EndUpdate funktioniert recht gut. Die Ladezeit wird auf etwa 3 sec verkürzt. Bei entsprechend größeren Datei natürlich verlängert. Mit einer Kombination mit der Idee von Aphton denke ich, kann man es so sehr gut anstellen.

@Bernhard Geyer
Vor der oben vorgestellten Version hatte ich die Bytes einzelt aus dem Stream gelesen. Diese Option ist enorm langsam. By 7 MB wird ca. eine Minute benötigt.

Bernhard Geyer 10. Mär 2013 09:12

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Zitat:

Zitat von merovinger (Beitrag 1206702)
@Bernhard Geyer
Vor der oben vorgestellten Version hatte ich die Bytes einzelt aus dem Stream gelesen. Diese Option ist enorm langsam. By 7 MB wird ca. eine Minute benötigt.

Oh. Hatte das l als 1 interpretiert un die Zeile l := fs.Size; übersehen.

p80286 10. Mär 2013 10:58

AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab da eine ältere Version (stammt noch aus TP-Zeiten) einer Unit für Hex-Darstellung ausgegraben.
Ich denke, da ist die eine oder andere Anregung dabei.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:28 Uhr.
Seite 1 von 2  1 2      

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