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.
Du kannst die String-Umwandlung nur machen, wenn sie zur Anzeige benötigt wird und somit die fertigen Komponenten verwenden.
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.
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.
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
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.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.