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.
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.
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.
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?
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.
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.
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.
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.