[gelöst] Mehrzeilige Textausgabe
[gelöst] Mehrzeilige Textausgabe
Hallo, ich werde versuchen, mich kurz zu fassen:
Nach über 10 Jahren Pause habe ich mich wieder etwas dem Programmieren zugewendet - leider beschränken sich meine Erfahrungen ganz auf Pascal. Wie ihr vermutlich wisst, gibt es dort einige Beschränkungen in der Textausgabe (insbesondere hinsichtlich der Textmenge und der farblichen Aufarbeitung... der 'Grafikmodus' hilft da ja auch nicht wirklich weiter - wobei ich hier niemanden mit Pascal-Problemen langweilen möchte), was mich wiederum mit meinem Vorhaben zu Lazarus führt und damit auch zum 'objektorientierten' Ansatz.
Mein - im wahrsten Sinne des Wortes - Einsteigerproblem:
In Pascal kann man ja mit WriteLn & co. ganz kompfortabel viel Text ausgeben... in Delphi/Lazarus bin ich in Tutorials etc. immer nur auf Lösungen wie Label1.Caption:='..'; gestoßen... Soweit ist alles klar und die Sache funktioniert ja auch ganz toll, solange ich nur kleine strings raushaun möchte; nun aber geht es mir darum, mehrere 1000 Zeilen (der Input kommt teils vom User, teils aus mehreren Datein, natürlich mit User-Unterbrechung und Scrolling) darzustellen. Meine Frage: wie mach ich das am cleversten? Label-Caption etc. scheint mir nicht der richtige Ansatz zu sein.... kurzum: ich hätte gerne 20-40 Zeilen Ausgabe, die ich idealerweise einzeln ansteuern kann (so, wie ich's mit gotoxy von Pascal aus kenne...).
Nungt; Ich denke, ihr versteht, was ich meine... Im Voraus schonmal besten Dank für eure Rückmeldungen
Nach über 10 Jahren Pause habe ich mich wieder etwas dem Programmieren zugewendet - leider beschränken sich meine Erfahrungen ganz auf Pascal. Wie ihr vermutlich wisst, gibt es dort einige Beschränkungen in der Textausgabe (insbesondere hinsichtlich der Textmenge und der farblichen Aufarbeitung... der 'Grafikmodus' hilft da ja auch nicht wirklich weiter - wobei ich hier niemanden mit Pascal-Problemen langweilen möchte), was mich wiederum mit meinem Vorhaben zu Lazarus führt und damit auch zum 'objektorientierten' Ansatz.
Mein - im wahrsten Sinne des Wortes - Einsteigerproblem:
In Pascal kann man ja mit WriteLn & co. ganz kompfortabel viel Text ausgeben... in Delphi/Lazarus bin ich in Tutorials etc. immer nur auf Lösungen wie Label1.Caption:='..'; gestoßen... Soweit ist alles klar und die Sache funktioniert ja auch ganz toll, solange ich nur kleine strings raushaun möchte; nun aber geht es mir darum, mehrere 1000 Zeilen (der Input kommt teils vom User, teils aus mehreren Datein, natürlich mit User-Unterbrechung und Scrolling) darzustellen. Meine Frage: wie mach ich das am cleversten? Label-Caption etc. scheint mir nicht der richtige Ansatz zu sein.... kurzum: ich hätte gerne 20-40 Zeilen Ausgabe, die ich idealerweise einzeln ansteuern kann (so, wie ich's mit gotoxy von Pascal aus kenne...).
Nungt; Ich denke, ihr versteht, was ich meine... Im Voraus schonmal besten Dank für eure Rückmeldungen
Zuletzt geändert von mulcheo am Do 8. Aug 2013, 12:23, insgesamt 2-mal geändert.
Re: Mehrzeilige Textausgabe
das hilft in der Tat erstmal weiter, Super.
Ich bin jetzt auf eine Kombination aus 'Stringlist' und Tmemo gestoßen (Youtube Tutorial), das scheint mir ganz gängig...
Danke, vermutlich ergeben sich in Zukunft noch ein paar weitere Fragen :>
Ich bin jetzt auf eine Kombination aus 'Stringlist' und Tmemo gestoßen (Youtube Tutorial), das scheint mir ganz gängig...
Danke, vermutlich ergeben sich in Zukunft noch ein paar weitere Fragen :>
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Mehrzeilige Textausgabe
Das HTML Panel wäre noch eine Lösung oder ein TPanel.
Oder auf die "Harte Tour", selbst Zeichnen mit Canvas...
Oder auf die "Harte Tour", selbst Zeichnen mit Canvas...
MFG
Michael Springwald
Michael Springwald
Re: Mehrzeilige Textausgabe
jetzt muss ich meine Anfrage doch noch erheblich erweitern:
mit TMemo komme ich inzwischen halbwegs klar, Danke soweit, allerdings ist das für meine Zwecke zu limitiert: was mir insbesondere fehlt, ist die Möglichkeit, einzelne Wörter einzufärben... Nach einigem Suchen im Forum bin ich auf RichMemo (http://directory.fsf.org/wiki/RichMemo) als Alternative gestoßen - das muss aber erst installiert werden - allerdings komme ich da genau auf diesen Fehler: http://www.lazarusforum.de/viewtopic.php?f=2&t=6900
Ich denke, hier läuft aber schon einiges vorher falsch; Wenn ich das Paket (Mehtode: http://wiki.freepascal.org/Install_Packages/de) installieren will, erscheint 'benötigte Packages': 'LCL' und 'FCL>=1.0' - ich dachte, die wären als Basispakete schon enthalten, oder nicht? Wenn ja, wie installiere ich die (leider konnte ich keine Links finden, die mich - wie bei Richmemo zu einer Lazarus-Package-file geführt hätten - wenn ihr helfen könnt, dann bitte dummy-Erklärungen. ich steh' hier grad wirklich aufm Schlauch). Nunja, jedenfalls kommt diese Fehlermeldung, sobald ich auf kompilieren klicke (von der Option 'installieren', die im Wiki erwähnt wird, fehlt übrigens jede Spur). Btw ich habe hier WinXP und Lazarus 1.0.10
Nun bin ich doch recht verwirrt... Gibt es simple Alternativen zu richmemo, falls ich das mit der Installation nicht hinbekomme? Ich suche eigentlich nur nach einer Möglichkeit, nachdem eine Datei (in meinem Fall viele strings) eingelesen wurde, diese auf dem Bildschirm auszugeben und nach einem best. Algorithmus ungefähr Folgendes zu tun (Pseudo-Pascal-Lösung): gotoxy(); textcolor(n); write(''); textcolor(15); usw...
mit TMemo komme ich inzwischen halbwegs klar, Danke soweit, allerdings ist das für meine Zwecke zu limitiert: was mir insbesondere fehlt, ist die Möglichkeit, einzelne Wörter einzufärben... Nach einigem Suchen im Forum bin ich auf RichMemo (http://directory.fsf.org/wiki/RichMemo) als Alternative gestoßen - das muss aber erst installiert werden - allerdings komme ich da genau auf diesen Fehler: http://www.lazarusforum.de/viewtopic.php?f=2&t=6900
Ich denke, hier läuft aber schon einiges vorher falsch; Wenn ich das Paket (Mehtode: http://wiki.freepascal.org/Install_Packages/de) installieren will, erscheint 'benötigte Packages': 'LCL' und 'FCL>=1.0' - ich dachte, die wären als Basispakete schon enthalten, oder nicht? Wenn ja, wie installiere ich die (leider konnte ich keine Links finden, die mich - wie bei Richmemo zu einer Lazarus-Package-file geführt hätten - wenn ihr helfen könnt, dann bitte dummy-Erklärungen. ich steh' hier grad wirklich aufm Schlauch). Nunja, jedenfalls kommt diese Fehlermeldung, sobald ich auf kompilieren klicke (von der Option 'installieren', die im Wiki erwähnt wird, fehlt übrigens jede Spur). Btw ich habe hier WinXP und Lazarus 1.0.10
Nun bin ich doch recht verwirrt... Gibt es simple Alternativen zu richmemo, falls ich das mit der Installation nicht hinbekomme? Ich suche eigentlich nur nach einer Möglichkeit, nachdem eine Datei (in meinem Fall viele strings) eingelesen wurde, diese auf dem Bildschirm auszugeben und nach einem best. Algorithmus ungefähr Folgendes zu tun (Pseudo-Pascal-Lösung): gotoxy(); textcolor(n); write(''); textcolor(15); usw...
-
- Beiträge: 768
- Registriert: Mo 4. Mai 2009, 13:24
- OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
- CPU-Target: x86_64-linux-qt/gtk2
- Kontaktdaten:
Re: Mehrzeilige Textausgabe (neues Problem)
Du kannst den Text in HTML "umwandeln" und z.B. per THMLPort darstellen oder über Gecko rendern. Vielleicht nützt dir auch die Komponente THTMLPanel von Pluto.
Für mehrzeiligen Text gibt es DrawText() (definiert in den units LCLIntf und LCLType). Wenn es um unterschiedliche Textstile (aka Farben) geht, dann kannst du den ersten Teil per Textout() zeichen, dann umstellen, die Distanz des bisher gezeichneten über Textwidth() berechnen und an der richtigen Stelle den nächsten Teil ausgeben (alles Methoden von TCanvas, dem GUI Äquivalent deiner CRT Befehle). Das ist nicht allzu schwierig bei einzeiligen Texten, aber wenn noch ein Umbruch dazu kommt...
Etwas Pseudocode:
Für mehrzeiligen Text gibt es DrawText() (definiert in den units LCLIntf und LCLType). Wenn es um unterschiedliche Textstile (aka Farben) geht, dann kannst du den ersten Teil per Textout() zeichen, dann umstellen, die Distanz des bisher gezeichneten über Textwidth() berechnen und an der richtigen Stelle den nächsten Teil ausgeben (alles Methoden von TCanvas, dem GUI Äquivalent deiner CRT Befehle). Das ist nicht allzu schwierig bei einzeiligen Texten, aber wenn noch ein Umbruch dazu kommt...
Etwas Pseudocode:
Code: Alles auswählen
procedure TForm1.DrawWithColor(const aText:string);
var
i,j,z:integer;
begin
i:=pos('<blue>',aText);//utf8pos wenn umlaute drin sind
j:=pos('</blue>',aText);//utf8pos wenn umlaute drin sind
Canvas.Textout(1,1,copy(aText,1,i));
z:=Canvas.TextWidth(copy(aText,1,i));
Canvas.Brush.Color:=clBlue;
Canvas.Textout(1+z,1,copy(aText,i,length(aText)-j)); //utf8length wenn umlaute drin sind; die Berechnung stimmt sicher nicht
z:=z+Canvas.TextWidth(copy(aText,i,length(aText)-j));
Canvas.Brush.Color:=clBlack;
Canvas.Textout(1+z,1,copy(aText,j,length(aText))); //utf8length wenn umlaute drin sind
end;
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Mehrzeilige Textausgabe (neues Problem)
Das HTMLPort ist ebenfalls nicht schlecht. Über Gecko würde ich es nicht machen. Nach Tagelangen Versuchen konnte ich es endlich Kompilieren, nur nutzten konnte ich es nicht.Du kannst den Text in HTML "umwandeln" und z.B. per THMLPort darstellen oder über Gecko rendern. Vielleicht nützt dir auch die Komponente THTMLPanel von Pluto.
Wenn der Text nicht zu "lang" ist, könnte das HTMLPanel oder der HTML Port was für dich sein oder ach LazRichView(Ich meine so hies das). Aber die ist ebenfalls zu langsam bei größeren Dokumenten. Schon beim Beispiel Dokument. Außerdem kann man hier keine Dateien laden. Jedenfalls habe ich seiner Zeit keine entsprechende Methode gefunden.
Was genau möchtest du da stellen? Kannst du mal ein Beispiel geben. Vielleicht gibt es noch mehr Möglichkeiten.
MFG
Michael Springwald
Michael Springwald
Re: Mehrzeilige Textausgabe (neues Problem)
@Pluto: ok, also eine kurze Beschreibung des Vorhabens:
im Moment geht es mir darum, zu lateinischer Lyrik (speziell Ovids elegische Distichen - das sind ca 5700 Zeilen oder 250 Buchseiten) eine Art elektronischen Kommentar zu machen. Die Texte habe ich schon alle einlesen und von Pascal formatieren lassen (jeweils in einem typed binary file aus einem record mit Versnummer und einem Textstring für den jeweiligen Vers). Ich hab soweit eine Unit fertig, die verschiedene Funktionen über die strings laufen lassen kann (Versmaßbestimmung, Wortfindung etc.). Das alte Pascal aber ist, was die Ausgabe angeht, auf die Dos-console beschränkt und das ist doch deutlich zu wenig (ich habe Ähnliches früher schon im Dos-Fenster gemacht - aber bei bis zu 80 chars pro Vers reicht der Platz einfach nicht für die nötigen Editfenster, Versnummern, 'Scrollbalken' etc.). Geplant ist nun Folgendes:
Es soll ein Fenster geben, das zunächst den lateinischen Text ausgibt, vorzugsweise mit einem highlight für die jeweils 'aktuelle' Zeile. Pfeiltasten etc. scrollen dann durch die einzelnen Verse. Auf click des users werden dann weitere 'Dateien' über den Text gelegt. Z.b. werden alle Wörter orange markiert, die sich in einer bestimmten Datenbank finden (Vokabel, Personenregister, Querverweise etc.). Zusätzlich soll der user eigene Beiträge zu einzelnen Wörter anlegen können (beispielsweise falls er eine Vokabel nicht kennt). Weitere farbige Markierungen geben an, ob man den Vers schon bearbeitet hat etc. Ich suche also nach einer Möglichkeit relativ kompfortabel in großen Textmengen zu navigieren und dort bestimmte Sachen zu markieren... Vielleicht kann man es auch so drehen, dass später einzelne Wörter anklickbar werden wobei Maussupport kein Muss ist. Zeilenumbruch ist übrigens nicht nötig, das würde ohnehin das ganze System der lat. Lyyrik ad absurdum führen.
ein Stück der Ausgabe könnte dann so ausschauen...
und jetzt soll beispielsweise der User in der Lage sein, in Zeile 5 (via Tasten oder Maus) das siebte Wort anwählen zu können, um dazu einen eigenen Eintrag zu erstellen (saucius 3 = verletzt etc.). Im Idealfall lässt sich der Text flüssig scrollen (falls nicht wird eben immer nur der Teil ausgelesen, der ohnehin auch auf den Bildschirm passt).
@scotty
ok, ich hab's angetestet. Das Problem hier ist, dass Canvas.brush.color die Hintergrundfarbe festlegt. Aber es klingt schonmal nach einem praktikablen Plan-B, falls alles Weitere scheitern sollte...
Nachtrag:
Ich bin nunmehr bei Canvas.Textoutxy geblieben, das scheint mir ganz flüssig zu gehen und entspricht ungefähr dem 'gotoxy(); write();', das ich kenne.
Danke an alle, die geholfen haben =)
im Moment geht es mir darum, zu lateinischer Lyrik (speziell Ovids elegische Distichen - das sind ca 5700 Zeilen oder 250 Buchseiten) eine Art elektronischen Kommentar zu machen. Die Texte habe ich schon alle einlesen und von Pascal formatieren lassen (jeweils in einem typed binary file aus einem record mit Versnummer und einem Textstring für den jeweiligen Vers). Ich hab soweit eine Unit fertig, die verschiedene Funktionen über die strings laufen lassen kann (Versmaßbestimmung, Wortfindung etc.). Das alte Pascal aber ist, was die Ausgabe angeht, auf die Dos-console beschränkt und das ist doch deutlich zu wenig (ich habe Ähnliches früher schon im Dos-Fenster gemacht - aber bei bis zu 80 chars pro Vers reicht der Platz einfach nicht für die nötigen Editfenster, Versnummern, 'Scrollbalken' etc.). Geplant ist nun Folgendes:
Es soll ein Fenster geben, das zunächst den lateinischen Text ausgibt, vorzugsweise mit einem highlight für die jeweils 'aktuelle' Zeile. Pfeiltasten etc. scrollen dann durch die einzelnen Verse. Auf click des users werden dann weitere 'Dateien' über den Text gelegt. Z.b. werden alle Wörter orange markiert, die sich in einer bestimmten Datenbank finden (Vokabel, Personenregister, Querverweise etc.). Zusätzlich soll der user eigene Beiträge zu einzelnen Wörter anlegen können (beispielsweise falls er eine Vokabel nicht kennt). Weitere farbige Markierungen geben an, ob man den Vers schon bearbeitet hat etc. Ich suche also nach einer Möglichkeit relativ kompfortabel in großen Textmengen zu navigieren und dort bestimmte Sachen zu markieren... Vielleicht kann man es auch so drehen, dass später einzelne Wörter anklickbar werden wobei Maussupport kein Muss ist. Zeilenumbruch ist übrigens nicht nötig, das würde ohnehin das ganze System der lat. Lyyrik ad absurdum führen.
ein Stück der Ausgabe könnte dann so ausschauen...
Code: Alles auswählen
Legerat huius [b][color=#FFBF40]Amor[/color][/b] titulum nomenque libelli:
'Bella mihi, video, bella parantur' ait.
'Parce tuum [color=#80BFFF]vatem[/color] sceleris damnare, [b][color=#FFBF40]Cupido[/color][/b],
[size=150] Tradita qui toties te duce signa tuli.[/size]
Non ego [b][color=#FFBF40]Tydides[/color][/b], a quo tua saucia mater 5
In liquidum rediit aethera [color=#FFBF40][b]Martis[/b][/color] equis.
@scotty
ok, ich hab's angetestet. Das Problem hier ist, dass Canvas.brush.color die Hintergrundfarbe festlegt. Aber es klingt schonmal nach einem praktikablen Plan-B, falls alles Weitere scheitern sollte...
Nachtrag:
Ich bin nunmehr bei Canvas.Textoutxy geblieben, das scheint mir ganz flüssig zu gehen und entspricht ungefähr dem 'gotoxy(); write();', das ich kenne.
Danke an alle, die geholfen haben =)