![]() |
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:
Im Anschluss möchte ich nun den Buffer visuell darstellen.
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; Dazu verwende ich derzeit eine TStringGrid
Delphi-Quellcode:
Mein Problem ist, dass diese Art der Umsetzung sehr langsam ist.
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; 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 |
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; |
AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
Hallo,
Grid.Items.BeginUpdate/ EndUpdate verwenden. Heiko |
AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
Byteweises einlesen von Dateien.
Auch ein Möglichkeit Zeit zu schinden :-) |
AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
Hallo,
es wird ein TFileStream benutzt. Der liest das nicht byteweise. Heiko |
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 |
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 |
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. |
AW: TFileStream.read-> Binärdaten darstellen; Geschwindigkeit
Zitat:
|
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 00:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz