Forum: PC-Programmierung Wie schreibt man eine GUI zum Anzeigen von Binärdateien?


von rme (Gast)


Lesenswert?

Hallo,

die Frage ist möglicherweise unabhängig von einer speziellen 
Programmiersprache, ich arbeite allerdings mit Java.

Ich möchte eine große Datei in einer GUI darstellen, die ein binäres 
(d.h. kein ASCII oder Unicode) Format hat. Dazu habe ich einen Parser 
geschrieben, der mir zu jedem Offset in der Datei eine oder mehrere 
Zeilen beschreibenden Text zuordnet. Der Text hat eine logische 
Struktur, Aufbau beispielsweise "offset 4010: eintrag Nummer 3, Typ 
float, Wert: 3.1415"

Nun habe ich zwei Probleme, die beide die gleiche Ursache haben: In 
allen GUI-Bibliotheke, die ich mir angeschaut habe, kann man Text nur 
anzeigen, wenn man eine Instanz einer Klasse hat, die den Inhalt in Form 
eines Strings enthält. In Java heißt die Document, in QT z.B. 
QTextDocument. Nun könnte ich meinen Text natürlich in so einen String 
kopieren, das ist aber arg langsam, da das Format der Datei keinen 
sequentiellen Durchlauf ermöglicht, d.h. ich müsste im String ständig 
Dinge einfügen, wodurch diese umkopieren werden muss usw. Außerdem soll 
der Benutzer in der Lage sein, die Basis der angezeigten Zahlen zu 
ändern, beispielsweise Hexadezimal statt Dezimal. Wenn er diese 
Einstellug ändert, möchte ich nicht alle Zahlen im Dokument suchen und 
ersetzen...

Ich habe das Problem umgangen, indem meine Document-Instanz (Java) nun 
gar keinen Inhalt, sondern nur eine logische, baumartige Struktur hat. 
Durch eigene Views, die ich von GlyphView (Element, das Text anzeigt) 
ableite, zeige ich dynamisch die Inhalte meiner Struktur an. Klappt ganz 
gut und ist hinreichend schnell, aber:

Die Klasse, die die Document-Instanz anzeigt (in Java JTextPane, in QT 
QTextEdit) ist nur in der Lage, Text zu markieren und in die 
Zwischenablage zu kopieren, der auch tatsächlich in der 
(Q)Document-Instanz vorhanden ist.

Leider kann man weder in QT noch in Java die Text-Anzeige-Elemente 
verwenden, ohne eine Document-Instanz zu haben. Wenn ich die nicht 
verwende, muss ich ganz viele komplizierte Dinge selbst machen, nämlich 
die Markierung von Text, das Kopieren des markierten Bereichs in die 
Zwischenablage...

Wie würdet ihr so eine GUI prinzipiell schreiben? Für den Benutzer soll 
es wie ein Text-Editor aussehen, nur eben ohne Edit-Funktion.

von user (Gast)


Lesenswert?

Du kannst die String-Umwandlung nur machen, wenn sie zur Anzeige 
benötigt wird und somit die fertigen Komponenten verwenden.

von W.S. (Gast)


Lesenswert?

rme schrieb:
> Wie würdet ihr so eine GUI prinzipiell schreiben?

Ein ganzes Grafisches User Interface selber schreiben?

Du verwechselst da wohl was. Wahrscheinlich meinst du, innerhalb einer 
grafischen Klassenbibliothek sich ein Element schreiben, das den 
genannten Zweck erfüllt.

Also ICH würde als allererstes die VCL benutzen und deswegen mit 
Delphi arbeiten und ich würde mir dort eine simple Listbox hernehmen, 
selbige als virtuell und userdrawn markieren und in der zugehörigen 
OnGet Methode und der OnPaint Methode (oder heißt die OnDraw?) dann eben 
die nötigen Schritte tun. Ist zumindest bei Delphi ganz easy.

W.S.

von rme (Gast)


Lesenswert?

Da hätte man das gleiche Problem, denn eine Listbox fühlt sich mit 
1.000.000 Einträgen bestimmt nicht sehr wohl, oder? Und kann man in 
einer Listbox eintragsübergreifend markieren, so wie in einem 
Texteditor? Also nicht mehrere Zeilen, sondern einen Text, der mehrere 
Zeilen überspannt, aber nicht unbedingt am Anfang der ersten Zeile 
anfängt und dem letzten Zeichen der letzten Zeile endet.

"UserDrawn" klingt so, als ob du den String manuell zeichnen möchtest. 
Dann würde das Markieren von Text aber auch nicht funktionieren.

von Hoi (Gast)


Lesenswert?

Erst sollte man sich im Klaren werden in welcher Form man die Daten 
anzeigen will, und welche Funktionen der Benutzen haben soll.

Sollen die Daten listenmaessig angezeigt werden, oder ehen baummaessig.
Auswahl ist auch machbar, einen Eintrag oder mehrere.

Was spricht denn gegen eine Dokumenten instanz ? Zu klotzig? Dann 
allenfalls eine abgeleitete Klasse, die einfacher ist?

Eine Listbox mit 1E6 Eintraegen ist zwar machbar, aber sinnlos.

Oder vielleicht doch eher eine graphische Anzeige?

von W.S. (Gast)


Lesenswert?

rme schrieb:
> Da hätte man das gleiche Problem, denn eine Listbox fühlt sich mit
> 1.000.000 Einträgen bestimmt nicht sehr wohl, oder?

Kannst du lesen?

Nochmal für Langsamdenker: Eine virtuelle und userdrawn Listbox.

Mit sowas hab ich schon Viewer für CD und DVD-Images gemacht. Das geht 
und zwar richtig schnell.

> "UserDrawn" klingt so, als ob du den String manuell zeichnen möchtest.
> Dann würde das Markieren von Text aber auch nicht funktionieren.

Erstens gibt es keinen String - das solltest du einfach verinnerlichen.
Zweitens kann man markieren und editieren, wenn man dies in die Maus- 
und Keyboard-Ereignisbehandlung implementiert.

Wenn man es ein bissel einfacher haben will, dann braucht die Listbox 
bloß virtuell zu sein, also nicht userdrawn. Dann liefert die OnGet 
(oder OnData) Methode nur den Zeilenstring zum vorgegebenen Index und um 
den Rest kümmert sich die Listbox. Aber weitaus besser ist eben virtuell 
UND userdrawn, dann kann die OnGet leer bleiben und die 
Zeilenaufbereitung erfolgt komplett in der Drawroutine, wo man dann nach 
Gusto Zeichen einfärben kann, ein Caret darstellen kann usw.

W.S.

von rme (Gast)


Lesenswert?

Oh man. Sorry an alle, die sinnvoll geantwortet haben - die Stimmung 
hier ist mir viel zu mies, ich frag woanders und les hier nicht weiter 
mit.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

rme schrieb:
> ist nur in der Lage, Text zu markieren und in die Zwischenablage zu
> kopieren

Dein Problem ist ja, das du erst mal keinen Text hast.
Ein Document (in Java) muss  auch kein Text sein, ABER du musst die 
Umwandlung Text->DOM und DOM->Text passend implementieren. Die Views 
wirst du trotzdem benötigen, das ist also schon mal der richtige Ansatz.

Hier ist eigentlich ganz kurz und Knapp beschrieben, was dein Dokument 
können muss um zu funktionieren: 
http://docs.oracle.com/javase/7/docs/api/javax/swing/text/Document.html 
wenn du kein Editieren des Dokumentes benötigst vereinfacht das die 
Sache natürlich.

Nachtrag: Nimm dir mal als Beispiel das HTMLDokument, das ist zwar 
strukturierter Text, aber auch dort wird nicht alles angezeigt und es 
gibt "Konvertierungen".

Das ganze Dokument-Interface ist aber auch ein Dicker Brocken. ggf. bist 
du besser bedient mit einem Custom-Component was z.B. mittels des 
Scrollableinterfaces immer nur den Teil der Daten lädt, konvertiert und 
Anzeigt welcher gerade sichtbar ist.

: Bearbeitet durch User
von Panke (Gast)


Lesenswert?

Google mal nach Okteta.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich würde das auch mit Lazarus (wie Delphi nur Freeware). Ebenfalls eine 
TListbox bzw. Im Hintergrund eine TStringlist.
Wie das sinnvoll mit Java geht weiß ich nicht.
Die Datei kan mit einem TFilestream geöffnet werden und man muss ja 
nicht alles auf einmal einlesen.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Wie sieht denn die einzulesende Datei genau aus ?
Wenn du mehr aus der Basic-Ecke kommst, kann
ich dir auch XProfan empfehlen.
Das kann auch eine Datei in einen Speicherbereich
laden, wo dann die einzelnen Stellen manipuliert
bzw. geändert werden können und vieles mehr.
GUI-Funktionalität ist natürlich selbstverständlich.
Hier mal ein Link zur 64Bit Free-Version :
http://www.xprofan.de/download/profan64.zip
und zur 32 Bit Free-Version :
http://www.paules-pc-forum.de/forum/xprofan/154264-freeprofan32.html

Als Editor kann man auch den X-ProfPad (32 oder 64Bit)
verwenden. Einfach mal im Forum danach suchen.

: Bearbeitet durch User
von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Guck Dir mal die Sourcen vom Notepad++ an. Da ist einiges dazu bekannt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.