Fontveränderung TRichMemo - Wie machen?

Rund um die LCL und andere Komponenten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von m.fuchs »

and4more hat geschrieben:[...]da es für mich logisch erschien erst die Vorgaben und Formateinstellungen zu tätigen und dann den Text hinzuzufügen [...]
Du sagst also erst wie etwas aussehen soll, was (noch) gar nicht existiert und fügst es dann hinzu. Aha.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von and4more »

O.K. ich habe jetzt mal den verschiedenen Quellcode inkl. Screenshot des Ergebnisses gemacht. Vielleicht wird das Problem etwas klarer. Erstens Code wie von Michl vorgeschlagen:

Code: Alles auswählen

 
    MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
    MemBewertung.SelLength:=UTF8Length('Osteoporose-Risiko Erhebungsbogen');
    fp.Size:=14;
    fp.Style:=[fsbold];
    MemBewertung.SetTextAttributes(UTF8Pos('Osteoporose-Risiko',MemBewertung.Lines.Text),
      MemBewertung.SelLength,fp);
 
    MemBewertung.Lines.Add('');  //Statt FormFeed
 
    MemBewertung.Lines.Add('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    MemBewertung.SelStart:=MemBewertung.SelLength;
    MemBewertung.SelLength:=UTF8Length('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    fp.Size:=10;
    MemBewertung.SetTextAttributes(UTF8Pos('Datum',MemBewertung.Lines.Text)-1,MemBewertung.SelLength,fp);
 
ergibt Ergebnis im Bild
Dateianhänge
Beide.Add vor .SetAttributes
Beide.Add vor .SetAttributes
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Benutzeravatar
theo
Beiträge: 10907
Registriert: Mo 11. Sep 2006, 19:01

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

and4more hat geschrieben:Hier könnte auch eine Fehlerquelle liegen, da die Formatierung in der Hauptunit erstellt wird/werden soll, das Unterformular also noch nicht angezeigt wird. Daher führt auch die "Focus"-Funktion zu einem Laufzeitfehler.
Das liegt nicht am lzRichEdit, das ist bei jeder Komponente so. Man kann nicht fokussieren was nicht angezeigt wird.

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von and4more »

...und beim zweiten Beispiel wird die erste Zeile erst nach Setzen der Attribute hinzugefügt:

Code: Alles auswählen

    MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
    MemBewertung.SelLength:=UTF8Length('Osteoporose-Risiko Erhebungsbogen');
    fp.Size:=14;
    fp.Style:=[fsbold];
    MemBewertung.SetTextAttributes(UTF8Pos('Osteoporose-Risiko',MemBewertung.Lines.Text),
      MemBewertung.SelLength,fp);
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
 
    MemBewertung.Lines.Add('');
    MemBewertung.Lines.Add('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    MemBewertung.SelStart:=MemBewertung.SelLength;
    MemBewertung.SelLength:=UTF8Length('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    fp.Size:=10;
    MemBewertung.SetTextAttributes(UTF8Pos('Datum',MemBewertung.Lines.Text)-1,MemBewertung.SelLength,fp);
 
mit dem Ergebnis im Anhang, was dem was ich möchte deutlich näher kommt. Meine bisherige Erklärung ist, das die von Seiten der IDE vorbestehende Formatierung im ersten Beispiel auf den hinzugefügten Text zunächst angewendet wird und eine nachträgliche Änderung nicht mehr umgesetzt wird.
Dateianhänge
Erstes .Add nach Setzten der Parameter in .SetAttributes
Erstes .Add nach Setzten der Parameter in .SetAttributes
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von and4more »

theo hat geschrieben:
and4more hat geschrieben:Hier könnte auch eine Fehlerquelle liegen, da die Formatierung in der Hauptunit erstellt wird/werden soll, das Unterformular also noch nicht angezeigt wird. Daher führt auch die "Focus"-Funktion zu einem Laufzeitfehler.
Das liegt nicht am lzRichEdit, das ist bei jeder Komponente so. Man kann nicht fokussieren was nicht angezeigt wird.
Das hatte ich auch gar nicht behaupten wollen, dass das an RichEdit liegt. Das war nur eine Feststellung, da die Beispiele, die ich über RichEdit fand immer zunächst den Focus gesetzt haben. Inwieweit das die Funktionalität von RichEdit beeinflusst weiß ich nicht. Mein Problem bei RichEdit war letztlich, dass bei dem Haufen der angebotenen und zum Teil ähnlich klingenden Parameter (z. B. .Font.Style gegenüber .Sel...) unklar war, was die überhaupt machen bzw. welche wofür benötigt werden, um die gewünschte formatierte Darstellung zu realisieren. Da habe ich leider nirgends eine Doku gefunden, die mir eine verständliche Darstellung der Anwendung zeigte. Das mitgelieferte Code-Example (portugiesisch?) beschreibt einen Editor, bei dem die entsprechende Formatierung nach Einstellung über Buttons oder ähnliches initiiert wird. Die Codebeispiele, die es für Delphi gibt verwenden z. T. Parameter, die ich unter Lazarus nicht finde.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Benutzeravatar
theo
Beiträge: 10907
Registriert: Mo 11. Sep 2006, 19:01

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

Das sieht alles für mich ungesund aus.
Mein Vorschlag: Nimm ein IpHtmlPanel und generiere HTML.

Hier ein MinmalBeispiel:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var NewHTML:TIpHtml;
  Strm:TStringStream;
begin
  NewHTML:=TIpHtml.Create;
  Strm:=TStringStream.Create('test <b>test</b> test <br> test <i>test</i> test');
  NewHTML.LoadFromStream(Strm);
  IpHtmlPanel1.SetHtml(NewHTML);
  Strm.Free;
end;    

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von and4more »

m.fuchs hat geschrieben:
and4more hat geschrieben:[...]da es für mich logisch erschien erst die Vorgaben und Formateinstellungen zu tätigen und dann den Text hinzuzufügen [...]
Du sagst also erst wie etwas aussehen soll, was (noch) gar nicht existiert und fügst es dann hinzu. Aha.
Ja klar, so habe ich mir das eigentlich gedacht. Du stellst zuerst das Format der Ausgabe ein und fügst die Ausgabe dann hinzu, sodass das entsprechend eingestellte Format zur Anwendung kommt, Eigentlich genauso, wie wenn du mit einer Textverarbeitung arbeitest, da ist auch zunächst ein Format gewählt in dem dann der eingegebene Text erscheint. Klingt für mich logisch.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von m.fuchs »

Ich komme noch einmal auf meinen Vorschlag der HTML-Ausgabe zurück. Die Ausgabe ist ganz einfach, du brauchst nur ein TIpHtmlPanel (dazu sind nur die Packages turbopoweripro und turbopoweriprodsgn notwendig.

Dann kannst du den HTML-Code einfach mit

Code: Alles auswählen

IpHtmlPanel1.SetHtmlFromStr(MySTring); 
hinzufügen.

Beim Umwandeln in HTML können wir dir sicher auch helfen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von Michl »

Der Fehler liegt darin, dass Du zuvor die SelLength bestimmst und zuvor nicht SelStart gesetzt hast.

Ich habe es mal für Dich debuggt:

Code: Alles auswählen

    MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');   //Hier wird SelStart auf das Ende von MemBewertung.Text gesetzt
    MemBewertung.SelLength:=UTF8Length('Osteoporose-Risiko Erhebungsbogen');  //hier versuchst Du die selektierte Länge des Strings zuzuweisen, geht aber nicht, da SelStart am Ende von MemBewertung liegt -> SelLength wird auf 1 gesetzt
daher die Ausgabe

versuche es mal so:

Code: Alles auswählen

  DummyStr:='Osteoporose-Risiko Erhebungsbogen';    //neu !!!
  MemBewertung.Lines.Add(DummyStr);
//  MemBewertung.SelLength:=UTF8Length('Osteoporose-Risiko Erhebungsbogen');  //Das hier weg!
  fp.Size:=14;
  fp.Style:=[fsbold];
  MemBewertung.SetTextAttributes(UTF8Pos(DummyStr, MemBewertung.Lines.Text), UTF8Length(DummyStr), fp); //geändert auf DummyStr 
Leider funktioniert UTF8Pos fürs TRichMemo nicht korrekt, sodaß Du am besten bei einem konstanten Text die Positionen und Längen Deiner formatierten Textabschnitte per Test bestimmst und per Konstanten setzt, wie zuvor schon einmal geschrieben, z.B.

Code: Alles auswählen

  MemBewertung.SetTextAttributes(0, 33, fp); 
Zuletzt geändert von Michl am Di 18. Feb 2014, 12:49, insgesamt 3-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von and4more »

m.fuchs hat geschrieben:Ich komme noch einmal auf meinen Vorschlag der HTML-Ausgabe zurück. Die Ausgabe ist ganz einfach, du brauchst nur ein TIpHtmlPanel (dazu sind nur die Packages turbopoweripro und turbopoweriprodsgn notwendig.

Dann kannst du den HTML-Code einfach mit

Code: Alles auswählen

IpHtmlPanel1.SetHtmlFromStr(MySTring); 
hinzufügen.

Beim Umwandeln in HTML können wir dir sicher auch helfen.
Wird das HTML-Formular dann im Browser angezeigt oder statt des MemoFelds, also im gleichen Unterfenster?...und eigentlich wollte ich in der nächsten Ausbaustufe ein PDF-Formular generieren!!! Oh je mir schwant Schlimmes :shock: :shock: :shock:
Zuletzt geändert von and4more am Di 18. Feb 2014, 11:40, insgesamt 1-mal geändert.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Benutzeravatar
theo
Beiträge: 10907
Registriert: Mo 11. Sep 2006, 19:01

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

m.fuchs hat geschrieben: Dann kannst du den HTML-Code einfach mit

Code: Alles auswählen

IpHtmlPanel1.SetHtmlFromStr(MySTring); 
hinzufügen.
Stimmt. Macht zwar das gleiche wie mein Vorschlag zwei Beiträge weiter oben, aber die Fkt. gibt's ja auch noch...

Benutzeravatar
theo
Beiträge: 10907
Registriert: Mo 11. Sep 2006, 19:01

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

and4more hat geschrieben: Wird das HTML-Formular dann im Browser angezeigt oder statt des MemoFelds, also im gleichen Unterfenster?
Statt des Memo Felds.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von m.fuchs »

and4more hat geschrieben:
m.fuchs hat geschrieben:
and4more hat geschrieben:[...]da es für mich logisch erschien erst die Vorgaben und Formateinstellungen zu tätigen und dann den Text hinzuzufügen [...]
Du sagst also erst wie etwas aussehen soll, was (noch) gar nicht existiert und fügst es dann hinzu. Aha.
Ja klar, so habe ich mir das eigentlich gedacht. Du stellst zuerst das Format der Ausgabe ein und fügst die Ausgabe dann hinzu, sodass das entsprechend eingestellte Format zur Anwendung kommt, Eigentlich genauso, wie wenn du mit einer Textverarbeitung arbeitest, da ist auch zunächst ein Format gewählt in dem dann der eingegebene Text erscheint. Klingt für mich logisch.
Das machst du aber nicht, in der Textverarbeitung stellst du allgemein das Format für neuen Text ein den du tippst oder einfügst. Als Benutzer wohlgemerkt.
Hier markierst du etwas, was nicht da ist, stellst dann ein Format ein und fügst im Programm Text hinzu. Also nicht der Benutzer.

Das wird nicht klappen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von and4more »

Michl hat geschrieben:Der Fehler liegt darin, dass du zuvor die SelLength bestimmst und zuvor nicht SelStart gesetzt hast.

Ich habe es mal für Dich debuggt:

Code: Alles auswählen

    MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
    MemBewertung.SelLength:=UTF8Length('Osteoporose-Risiko Erhebungsbogen');  //hier versuchst Du die selektierte Länge des Strings zuzuweisen, geht aber nicht, da SelStart am Ende von MemBewertung liegt -> SelLength wird auf 1 gesetzt
..ja, aber ist nicht 'Osteoporose-Risiko Erhebungsbogen' eine Stringkonstante deren Länge, da ja angegeben, korrekt bestimmt werden müsste, also nicht von SelStart abhängig ist. Ich glaube, der Fehler liegt in Nutzung der Funktion SetTextAttributes(UTF8Pos('Osteoporose-Risiko'....), da zum Zeitpunkt des Funktionsaufrufs der String noch gar nicht geadded ist und infolgedessen ein Positionsbestimmung ins Leere läuft, wodurch SelStart mit irgendwas initialisiert ist/wird (fettes S in der Überschrift???). Danke für den sehr wichtigen Hinweis.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von Michl »

and4more hat geschrieben:..ja, aber ist nicht 'Osteoporose-Risiko Erhebungsbogen' eine Stringkonstante deren Länge, da ja angegeben, korrekt bestimmt werden müsste,
Wird sie auch!
and4more hat geschrieben:also nicht von SelStart abhängig ist.
Richtig, es ist aber von Bedeutung, dass Du MemBewertung.SelLength:=UTF8Length('Osteoporose-Risiko Erhebungsbogen'); zuweist. MemBewertung.SelLength erhält zwar die richtige Länge zugewiesen, diese wird aber nicht übernommen (ist halt ein Property und keine Variable), da MemBewertung.SelStart am Ende von MemBewertung.Text steht!!!

Und dieses MemBewertung.SelLength, was dann den Wert 1 hat, nutzt Du dann! Daher nur ein Fettes "S".
and4more hat geschrieben: Ich glaube, der Fehler liegt in Nutzung der Funktion SetTextAttributes(UTF8Pos('Osteoporose-Risiko'....), da zum Zeitpunkt des Funktionsaufrufs der String noch gar nicht geadded ist und infolgedessen ein Positionsbestimmung ins Leere läuft, wodurch SelStart mit irgendwas initialisiert ist/wird (fettes S in der Überschrift???). Danke für den sehr wichtigen Hinweis.
Nein! Einziger Fehler ist die nicht stimmige Pos, daher am besten per Hand ermitteln (zum 3.Mal, dass ich das schreibe)!
Zuletzt geändert von Michl am Di 18. Feb 2014, 12:50, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten