[gelöst] Mehrzeilige Textausgabe

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

[gelöst] Mehrzeilige Textausgabe

Beitrag von mulcheo »

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
Zuletzt geändert von mulcheo am Do 8. Aug 2013, 12:23, insgesamt 2-mal geändert.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Mehrzeilige Textausgabe

Beitrag von Christian »

Schau dir mal TMemo an.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

Re: Mehrzeilige Textausgabe

Beitrag von mulcheo »

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 :>

pluto
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

Beitrag von pluto »

Das HTML Panel wäre noch eine Lösung oder ein TPanel.

Oder auf die "Harte Tour", selbst Zeichnen mit Canvas...
MFG
Michael Springwald

mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

Re: Mehrzeilige Textausgabe

Beitrag von mulcheo »

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

Scotty
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)

Beitrag von Scotty »

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:

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;
 

pluto
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)

Beitrag von pluto »

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

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

mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

Re: Mehrzeilige Textausgabe (neues Problem)

Beitrag von mulcheo »

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

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.
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 =)

Antworten