Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exe Dateien als Text laden (https://www.delphipraxis.net/71698-exe-dateien-als-text-laden.html)

Neutral General 19. Jun 2006 17:30


Exe Dateien als Text laden
 
Hi,

Wie kann ich Exe Dateien und auch andere Dateien (wav, dat, ka was) in z.B ein Memo laden?
Also wenn man die Datei normal reinlädt bekommt man ja nur die ersten paar Zeichen. Hab mir gedacht das es vielleicht an den #0 in der Datei liegen könnte und hab mit Hilfe von nem Freund was gebaut, aber es funktioniert nicht :(
Was ist da falsch? Oder ist das der komplett falsche Weg?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var FileS: TFileStream;
    StringS: TStringStream;
    Temp: String;
begin
  if Opendialog1.Execute then begin
   FileS := TFilestream.Create(Opendialog1.FileName, fmOpenread);
   StringS := TStringStream.Create('');
   StringS.CopyFrom(FileS,FileS.Size);
   Temp := StringReplace(StringS.DataString,#0,'',[rfReplaceAll]);
   Memo1.Text := Temp;
  end;
end;
Gruß
Neutral General

shmia 19. Jun 2006 17:38

Re: Exe Dateien als Text laden
 
Einfach folgende Procedure auf die Daten anwenden:
Delphi-Quellcode:
procedure ReplaceUnprintableChars(var s:string);
var
   i : Integer;
begin
   for i:=1 to Length(s) do
   begin
      case Ord(s[i]) of
         0..7, 9,11,12, 14..31:
            s[i] := '*';
      end;
   end;
end;
Man kann natürlich anstelle von TMemo eine HexView-Komponente verwenden...dann wird's profesionell.
Vielleicht mal bei Mael nachfragen/betteln ;-)

Neutral General 19. Jun 2006 17:43

Re: Exe Dateien als Text laden
 
ok Danke ich werde es mal ausprobieren.
Also professionell brauch ich es nicht.
Weil der Benutzer den String nichtmal zu Gesicht bekommen wird.

Wobei ich mich grad Frage warum dann die #0 weg müssen... :gruebel:
ehhh.. egal^^

Gruß
Neutral General

shmia 19. Jun 2006 17:54

Re: Exe Dateien als Text laden
 
Zitat:

Zitat von Neutral General
Wobei ich mich grad Frage warum dann die #0 weg müssen... :gruebel:

Weil die Windows Controls, auf denen TMemo aufbaut von Microsoft mit Programmiersprache C/C++ programmiert wurden. In C/C++ sind String üblicherweise 0-terminiert.

Neutral General 19. Jun 2006 17:55

Re: Exe Dateien als Text laden
 
ne ich meine nicht deswegen...
Wenn ich den String ja eh nicht ausgeben will.
Dann kann ich mir das ganze eigentlich auch sparen oder ?^^

sniper_w 19. Jun 2006 18:56

Re: Exe Dateien als Text laden
 
Zitat:

Zitat von shmia
Microsoft mit Programmiersprache C/C++ programmiert wurden

Es war reines C im Einsatz.

OT: Schon wieder werden C und C++ zusammengeschrieben, als wäre das das Gleiche und deswegen egal... :roll:

orion3000 22. Jun 2006 11:37

Re: Exe Dateien als Text laden
 
Hallo Zusammen!
Du kannst mal fogende Procedure versuchen.
Du benötigst ein Richedit1 und eine Statusbar1 mit 3 Panels.
Der Aufruf wird gestartet mit Loadfile.

Delphi-Quellcode:
Procedure TfrmMain.LoadFile(Filename:String);
begin
Screen.Cursor:=crhourglass;

    With Richedit1 do
    begin
    Lines.BeginUpdate;
    text := FileToString(Filename);
    Lines.EndUpdate;

Screen.Cursor:=crdefault;

statusbar1.Panels[0].Text:='Zeilen gesamt: '+formatfloat('0.00',Lines.Count);
statusbar1.Panels[1].Text:=Filename;
ReadOnly:=true;

 end;
Delphi-Quellcode:
function TfrmMain.FileToString(const FileName: String): String;
var
  F: TStream;
  k: Integer;
begin

  With Richedit1 do
  begin
   Readonly:=false;
   lines.Clear;

   font.Name:='Arial';
   font.Color:=clBlack;
   font.Style:=[fsbold];
   Font.Size:=10;

   SelAttributes.Color:=clblack;
   SelAttributes.Name:='Arial';
   SelAttributes.Style:=[fsbold];
    SelAttributes.Size:=10;
   end;

application.ProcessMessages;

     F := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
      try
      SetLength(Result, F.Size);
      F.ReadBuffer(PChar(Result)^, F.Size);

      finally
statusbar1.Panels[2].Text:=winapi1.FileSizeToString(f.Size);
      F.Free;
  end;


      for k :=1 to length(Result) do
      begin
     Gauge1.Progress:=winapi1.CalcProzentsatz(length(Result),k);

     if not (result[k] in [#9, #10, #13, #32..#255]) then result[k] := ' ';
     end;

end;

Gruß Orion


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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