![]() |
HexEditor
Werte Gemeinde!
Ich bin dabei eine kleine Anwendung zu schreiben, die Files nach bestimmten Kriterien untersuchen soll. Dazu würde ich dem User gern auch einen HexEditor zur Verfügung stellen. Nun ist mir auf ![]() Hat jemand damit schon Erfahrung sammeln können? Ich frage deshalb, weil ich die Unit nicht compilieren kann, weil der Compiler bei der Stelle:
Delphi-Quellcode:
folgendes auswirft:
ctEBCDICToISO : array [0..255] of Char = (
#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 , #0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 , #0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 , #0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 , ' ',#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,#0 ,'.','<','(','+','', // hier!
Delphi-Quellcode:
Und das an einigen ähnlichen Stellen. (Ich frage mich, ob ich die Unit vielleicht im falschen Format gespeichert habe...)
E2010 Inkompatible Typen: 'Char' und 'String'
Meine zweite Frage wäre dann, wie man das Ding zum Fliegen bringt -- leider kein Beispiel (oder ich habe es nicht gesehen) dabei. Vielleicht hat das Ding ja schon jemand eingesetzt -- oder kennt einen besseren freien HexEditor (mit Source, nicht als Component, da ich nur TurboDelphi habe). Vielen Dank & schönen Gruß Jazzman |
Re: HexEditor
Der Fehler ist klar: An der Stelle steht ein leerer String. Ein Char wird aber erwartet, und ein Buchstabe kann entweder ein einbuchstabiger String sein oder ein Zeichen direkt (#). Aber eben kein String ohne Buchstabe. ;-)
Heißt: Einfach nen Leerzeichen rein und schon sollte es kompilieren. Ob das an der Stelle richtig ist, ist ne andere Frage. :mrgreen: |
Re: HexEditor
:-D Super!
Das hat schon geholfen -- beim Download oder Speichern müssen da wohl ein paar Blanks flöten gegangen sein. Vielen Dank! Jazzman |
Re: HexEditor
Hier ist ein Programm, in dem diese Unit verwendet wird:
![]() |
Re: HexEditor
Zitat:
Vielen Dank für den Hinweis -- aber geht es wohl auch eine Nummer kleiner? Auf ein Anwendungsbeispiel hatte ich tatsächlich gehofft -- aber bei diesen Beispiel brauche ich wohl Tage um zu verstehen, wie man den HexEditor im eigenen Programm verwendet. Hat denn niemand bisher den HexEditor von ![]() ![]() Wenn sich da vielleicht noch jemand fände, der mir die Bretter vor den Augen entfernt? Auf der genannten Seite findest sich sogar ein Beispiel für einen HexViewer (genau das was ich suche) -- aber da wird auch auf die TMPHexEditorEx Komponente zugegriffen -- die ich ja so nicht gebrauchen kann. In der Hoffnung, es findet sich noch ein Experte diesbezüglich grüßt Jazzman |
Re: HexEditor
Kannst Du die Komponente denn nicht einfach zur Laufzeit auf Dein Form klatschen?
|
Re: HexEditor
Zitat:
das verstehe ich nicht: a) Komponenten klatsche ich doch nur zur Designzeit auf die Form, oder?! b) Komponente ist grundsätzlich schlecht bei TurboDelphi, da nicht möglich. Oder habe ich Deinen Hinweis missverstanden? Danke & Gruß, Jazz |
Re: HexEditor
Natürlich ist das möglich, nur eben nicht zur Designtime. Es hält Dich aber niemand davon ab, die entsprechende Unit einzubinden und die Komponente zur Laufzeit dynamisch zu erzeugen.
|
Re: HexEditor
Hmmm,
also ich habe die beiden Units eingebunden:
Delphi-Quellcode:
Beim OnCreate meiner Anwendung steht dann:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MPHexEditor, MPHexEditorex; ... VAR MyEditor1 := TMPHexEditorEx;
Delphi-Quellcode:
Nach einem F9 kommt aber die Exception:
procedure TForm1.FormCreate(Sender: TObject);
begin MyEditor1.Create(Self); end;
Delphi-Quellcode:
Dachtest Du an so etwas?
EAccessViolation "Zugriffsverletzung bei Adresse...
Sehr verwirrend das. Jazzman |
Re: HexEditor
Zitat:
Delphi-Quellcode:
heißen ;)
MyEditor1 := TMPHexEditorEx.Create(Self);
|
Re: HexEditor
Um es zu erklären: Sonst wird von dem nicht existenten Objekt in MyEditor1 die Methode Create aufgerufen. Da an der Adresse kein Zugriff möglich ist gibt es eine Schutzverletzung.
Die Deklaration von MyEditor1 hat aber nichts als globale Variable suchen. Das gehört in das Formular hinein...
Delphi-Quellcode:
TfrmYourForm = class(TForm)
... private FMyEditor: TMPHexEditorEx; public end; |
Re: HexEditor
Ich hab mal schnell ein Beispiel mit einem dynamisch erzeugten Memo erstellt. Ich hoffe, das macht das Prinzip etwas klarer. Zur Designtime handelt es sich einfach nur um ein leeres Formular.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls{für TMemo}; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } FDynamicMemo: TMemo; procedure OnMemoClick(Sender: TObject); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin //Erzeugen des Memos FDynamicMemo := TMemo.Create(nil); FDynamicMemo.Parent := self; //Setzen einiger Properties FDynamicMemo.Height := 80; FDynamicMemo.Align := alBottom; FDynamicMemo.Lines.Clear; FDynamicMemo.Lines.Add('Ich bin hier unten angewurzelt,'); FDynamicMemo.Lines.Add('dass niemand aus dem Fenster purzelt.'); //Zuweisung eines Event-Handlers FDynamicMemo.OnClick := OnMemoClick; end; procedure TForm1.FormDestroy(Sender: TObject); begin //Freigeben des Memos FDynamicMemo.Free; end; procedure TForm1.OnMemoClick(Sender: TObject); begin if Sender is TMemo then ShowMessage(TMemo(Sender).Lines.Text); end; end. |
Re: HexEditor
Nagut, nagut :mrgreen:
die Deklaration ist nun die Form verschoben:
Delphi-Quellcode:
Deweiteren heisst es im OnCreste der Form1 nun richtigerweise:
type
TForm1 = class(TForm) Panel1: TPanel; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } MyEditor1: TMPHexEditorEx; public ...
Delphi-Quellcode:
Aus dem mitgeliefertem Beispiel lese ich weiters, dass ein Assert folgt:
MyEditor1 := TMPHexEditorEx.Create(Self);
Delphi-Quellcode:
Soweit kein Fehler beim Compilieren, aber sobald ich versuche (wie im Beispiel) dem Editor eine Datei zu übergeben:
procedure TForm1.FormCreate(Sender: TObject);
begin MyEditor1 := TMPHexEditorEx.Create(Self); Assert(MyEditor1 is TCustomGrid);
Delphi-Quellcode:
fliegt mir das Projekt um die Ohren ('Test1.TXT' existiert):
procedure TForm1.FormCreate(Sender: TObject);
begin MyEditor1 := TMPHexEditorEx.Create(Self); Assert(MyEditor1 is TCustomGrid); MyEditor1.LoadFromFile('Test1.TXT'); // Exception!
Delphi-Quellcode:
Eine Idee, was ich da noch falsch mache?
"EInvalidOperation: Element hat kein übergeordnetes Fenster"
(Vielen Dank für die bisherigen, wertvollen Hinweise!) Jazzman |
Re: HexEditor
Du musst noch den Parent zuweisen (siehe mein Beispiel).
|
Re: HexEditor
Haaalt!
Letzter Beitrag hat sich erledigt. Aus dem Beispiel von Detlef: "Du musst noch den Parent zuweisen (siehe mein Beispiel)." Dann hat es tatsächlich gekplappt!!! Suuper! Vielen, vielen Dank! Jazzman |
Re: HexEditor
Dass es so klappt, ist aber Zufall, denn du hast vergessen den Pfad mit dazuzuschreiben:
![]() Aber ich vermute einmal das war ohnehin nur für den Test so. |
Re: HexEditor
Abschlußkommentar
Zunächst großes Dankeschön an alle Mitwirkenden! Ohne diese Hilfe hätte ich es nicht hinbekommen. Hier noch mal eine vollständige Zusammenfassung wie man den HexEditor von ![]() Benötigt werden: MPDELVER.INC MPHexEditor.RES MPHexEditor.PAS MPHexEditorEx.PAS und zusätzlich die GRIDS-Unit Dann im Projekt:
Delphi-Quellcode:
Und schon klappts!
unit U_Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MPHexEditor, MPHexEditorex, ExtCtrls, Grids; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } MyEditor1: TMPHexEditorEx; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin MyEditor1 := TMPHexEditorEx.Create(Self); Assert(MyEditor1 is TCustomGrid); MyEditor1.Parent := self; MyEditor1.LoadFromFile('Test1.TXT'); end; end. Vielleicht hilft es ja noch jemanden. Also, schönen Sonntag noch weiters und vielen Dank. Gruß Jazzman |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 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