Fontveränderung TRichMemo - Wie machen?

Rund um die LCL und andere Komponenten
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:Es gibt im Ordner "Exemplo_RichBox" ein komplettes Beispiel, womit du testen kannst und abgucken, wie man's macht.
Hatte ich auch bereits angeschaut, allerdings noch nichts entdecken können, wie zur Laufzeit Fontgröße und -style (ohne Buttonklick) verändert werden können. Warum werden eigentlich einfache Dinge so kompliziert gemacht?

Mein derzeitiger Code funktioniert (leider) nicht, d. h. keine Veränderung der Fontdarstellung. Unter TRichMemo war wenigstens die Überschrift fett:

Code: Alles auswählen

 
    MemBewertung.SelAttributes.Size:=14;
    MemBewertung.SelAttributes.Style:=MemBewertung.SelAttributes.Style+[fsbold];
    MemBewertung.Font.Size:=MemBewertung.SelAttributes.Size;
    MemBewertung.Font.Style:=MemBewertung.SelAttributes.Style;
//    MemBewertung.Update;         //kein erkennbarer Effekt
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
    MemBewertung.SelAttributes.Size:=10;
    MemBewertung.Font.Size:=MemBewertung.SelAttributes.Size;
//    MemBewertung.Update;         //kein erkennbarer Effekt
    MemBewertung.Lines.Add('');
 
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:Warum werden eigentlich einfache Dinge so kompliziert gemacht?
Weil es keine einfachen Dinge sind. Man kennt sie nur gut von Word etc.

Bei dir sehe ich nie, wie du die Selektion setzst. Das wäre eigentlich das Wichtigste.
Probier mal so (nur auf GTK2 getestet)

Code: Alles auswählen

    lzRichEdit1.SelStart:=50;
    lzRichEdit1.SelLength:=50;
    lzRichEdit1.SetFocus;
    Application.ProcessMessages;
    lzRichEdit1.SelAttributes.Style := lzRichEdit1.SelAttributes.Style + [fsBold];
    lzRichEdit1.SelLength:=0;   

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 »

Mal eine andere Frage: soll der Benutzer das auch editieren können oder geht es dir nur um eine formatierte Anzeige? Im letzteren Falle könntest du das ganze in HTML umwandeln, um den zu formatierenden Text entsprechende Tags setzen und das ganze über die TurboPower-Komponente wieder ausgeben.
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 »

theo hat geschrieben:
and4more hat geschrieben:Warum werden eigentlich einfache Dinge so kompliziert gemacht?
Weil es keine einfachen Dinge sind. Man kennt sie nur gut von Word etc.

Bei dir sehe ich nie, wie du die Selektion setzst. Das wäre eigentlich das Wichtigste.
Probier mal so (nur auf GTK2 getestet)

Code: Alles auswählen

    lzRichEdit1.SelStart:=50;
    lzRichEdit1.SelLength:=50;
    lzRichEdit1.SetFocus;
    Application.ProcessMessages;
    lzRichEdit1.SelAttributes.Style := lzRichEdit1.SelAttributes.Style + [fsBold];
    lzRichEdit1.SelLength:=0;   
Ja, genau das ist mein Problem, ich weiß nicht wie der korrekte Aufruf erfolgt, da ich nirgends eine Dokumentation hierzu finden konnte. Daher habe ich keinerlei Selection vorgenommen. Mir ist auch nicht bekannt was hiermit genau selektiert wird und warum und wie genau die Initialisierung zu erfolgen hat. Wenn ich versuche den Focus zu setzen erhalte ich einen Laufzeitfehler, da das Formular zu dem Zeitpunkt des Aufrufs (noch) nicht geöffnet ist. Danke für den Vorschlag, werde ihn umsetzen und weiter berichten.
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 »

m.fuchs hat geschrieben:Mal eine andere Frage: soll der Benutzer das auch editieren können oder geht es dir nur um eine formatierte Anzeige? Im letzteren Falle könntest du das ganze in HTML umwandeln, um den zu formatierenden Text entsprechende Tags setzen und das ganze über die TurboPower-Komponente wieder ausgeben.
Ein Editieren ist nicht erforderlich, das Feld ist Readonly, es soll nur eine formatierte Ausgabe erfolgen. Aber dein Vorschlag klingt etwas kompliziert, zumal ich mit HTML-Ausgabe keinerlei Erfahrungen habe.
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
Habe jetzt folgenden Code;

Code: Alles auswählen

 
    MemBewertung.SelStart:=50;
    MemBewertung.SelLength:=50;
    MemBewertung.SelAttributes.Size:=14;
    MemBewertung.Font.Size:=MemBewertung.SelAttributes.Size;
    MemBewertung.Font.Style:=MemBewertung.SelAttributes.Style+[fsbold];
    Application.ProcessMessages;
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
    MemBewertung.SelLength:=0;
    MemBewertung.SelAttributes.Size:=10;
    MemBewertung.Font.Size:=MemBewertung.SelAttributes.Size;
    MemBewertung.Lines.Add('');
 
...funktioniert leider ebenfalls nicht
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 ergibt ja auch keinen Sinn.

MemBewertung.Font kanst du total vergessen. Das betrifft nicht die Selektion.
Den Texteigenschaften solltest du nur mit MemBewertung.SelAttributes... bearbeiten.

Irgendwie verstehe ich deinen Code grad überhaupt nicht. Kannst du mal komentieren, was dabei deine Überlegungen waren?

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von hde »

@and4more,
sry, hab z.Zt überhaupt keine Zeit mich mit fremden Probs zu befassen, setze aber in einem Projekt TRichMemo ein und es funkltioniert einwandfrei.

Und Michl hat hier doch schonn ein Beispiel mit Code gepostet das du übernehmen kannst?

hde

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 »

...hmmm, nachdem sich das mit TRichEdit als komplette Sackgasse herausstellte, habe ich wieder auf TRichMemo umgestellt und den Vorschlag von Michl versucht umzusetzen. Der Text wird komplett dargestellt, leider aber ohne die gewünschte Formatierung, und auch mir ist völlig unklar warum SelLength-i da stehen soll und wie hoch i sein muss um korrekt zu arbeiten. Habe aktuell folgenden Code:

Code: Alles auswählen

 
.
.
.
    MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
    fp.Size:=14;           //Überschrift soll groß und
    fp.Style:=[fsbold];  //Fett sein
    MemBewertung.SelLength:=Length('Osteoporose-Risiko Erhebungsbogen');
    MemBewertung.SetTextAttributes(0-1,MemBewertung.SelLength,fp);
    MemBewertung.Lines.Add('');
    MemBewertung.SelStart:=MemBewertung.SelLength+1;
    MemBewertung.SelLength:=Length('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    MemBewertung.Lines.Add('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    fp.Size:=10;       //Unterüberschrift nur Fett
    MemBewertung.SetTextAttributes(MemBewertung.SelStart-2,MemBewertung.SelLength,fp);
    MemBewertung.Lines.Add('');
    MemBewertung.SelStart:=MemBewertung.SelLength+1;
    MemBewertung.SelLength:=Length('Patientenname: '+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+TEdVName.Text+' '+TEdName.Text);
    MemBewertung.Lines.Add('Patientenname: '+tab+tab+tab+tab+tab+tab+tab+tab+tab+tab+TEdVName.Text+' '+TEdName.Text);
    fp.Style:=[];      //Textanteil -> normal
    MemBewertung.SetTextAttributes(MemBewertung.SelStart-3,MemBewertung.SelLength,fp);
.
.
.
 
Daten werden aus einer Form übernommen, fp ist als TFontParams definiert.
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 »

and4more hat geschrieben:

Code: Alles auswählen

 
    MemBewertung.SelStart:=MemBewertung.SelLength+1;
    MemBewertung.SelLength:=Length('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    MemBewertung.Lines.Add('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
 
Ich finde es irgendwie seltsam, dass du erst eine Selektion auf einen Text machst, den du später hinzufügst. Bist du dir sicher, dass das so laufen soll?
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 »

Probier doch mal ein neues Projekt zu erstellen, unter Uses LazUTF8 hinzufügen. Ein TRichMemo darauf (umbenennen zu MemBewertung) ein Button drauf. Das Ereignis Button1.OnClick die Procedure TForm1.ButtonClick hinzufügen. Den oben geposteten Code noch in diese Procedure einzufügen und zu starten.

Sollte doch funktionieren?! Spiel doch dann ein bischen damit und falls Du dann damit klar kommst, setze es in Dein Projekt ein.

Falls Du mit unveränderlichen Texten arbeitest, kannst Du auch die Offsets der Formatänderungen einmal durch probieren herausfinden und in einer Konstante speichern und einfach immer wieder abrufen. Damit sparst du Dir das Abfragen von Pos('...') und Length('...').

Code: Alles auswählen

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

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

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

and4more hat geschrieben:...hmmm, nachdem sich das mit TRichEdit als komplette Sackgasse herausstellte,
Warum?

Es wäre allgemein hilfreich, wenn du jeweils eine ordentliche "Gefechtsmeldung" machen würdest. ;-)
So sieht man nur immer merkwürdige Codeschnippsel und weiss nicht wo du stehst und was du machen möchtest.

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:

Code: Alles auswählen

 
    MemBewertung.SelStart:=MemBewertung.SelLength+1;
    MemBewertung.SelLength:=Length('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    MemBewertung.Lines.Add('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
 
Ich finde es irgendwie seltsam, dass du erst eine Selektion auf einen Text machst, den du später hinzufügst. Bist du dir sicher, dass das so laufen soll?
Ja, genau so hatte ich das mir auch ursprünglich vorgestellt, da es für mich logisch erschien erst die Vorgaben und Formateinstellungen zu tätigen und dann den Text hinzuzufügen. Die neue Anordnung im Code beruht auf der Empfehlung von Michl
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:...hmmm, nachdem sich das mit TRichEdit als komplette Sackgasse herausstellte,
Warum?

Es wäre allgemein hilfreich, wenn du jeweils eine ordentliche "Gefechtsmeldung" machen würdest. ;-)
So sieht man nur immer merkwürdige Codeschnippsel und weiss nicht wo du stehst und was du machen möchtest.
OK, ich weiß zwar jetzt nicht so ganz genau wie du das mit "Gefechtsmeldung" meinst, aber ich versuche das mal näher zu erläutern:
Das Hauptprogramm enthält eine Reihe von Feldern, in die Informationen eingetragen werden, unter anderem eine TPageControl, die nach Themen sortiert ist. Unten auf dem Hauptformular ein Button mit dem eine (formatierte) Zusammenfassung angezeigt werden kann. Der Code um den es hier geht steht in der "Hauptunit", das Memofenster wird mittel einer "Unterunit" von insgesamt 5 angezeigt auf die sich der Code bezieht. 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.
Dateianhänge
Osteoporose-Check.jpg
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 »

Na, dann setze die Empfehlung auch so um, wie ich es gepostet hatte und nicht genau umgekehrt (Du könntest Deinen kompletten Text zuerst in Dein RichMemo schreiben und danach diesen formatieren).

Bitte nochmal den geposteten Code ansehen, da steht:

Code: Alles auswählen

MemBewertung.Lines.Add('zu verändernde Schrift');  //Zuerst den Text dem RichMemo zuweisen!
fp.Color:=$FF0000;  //Die gewünschte Schrift/Style definieren
fp.Style:=[fsBold];
fp.Size:=fp.Size + 5;
MemBewertung.SetTextAttributes(UTF8Pos('zu verändernde Schrift', MemBewertung.Lines.Text), UTF8Length('zu verändernde Schrift'), fp);  //Position des zu verändernden Textes im RichMemo heraussuchen und die Schrift/Style setzen 
[Edit] Einen formatierten Text einfügen funktioniert nicht (weder lzRichEdit noch RichMemo), zumindest nicht mit RichMemo.Lines.Add oder RichMemo.Text:='...'. Dazu müssten noch die Formatierungsdaten kopiert werden. Diese sind nicht im Text verankert sondern extern gespeichert. Funktionieren tut z.B. CopyToClipboard und PasteFromClipboard.
Zuletzt geändert von Michl am Di 18. Feb 2014, 09:13, insgesamt 1-mal geändert.

Code: Alles auswählen

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

Antworten