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

Fontveränderung TRichMemo - Wie machen?

Beitrag von and4more »

Hallo liebes Forum, ich stehe vor einem wahrscheinlich einfachen Problem, komme aber trotz Suche im Internet und Hirn zermartern irgendwie nicht weiter. Unter WIN 7 (64 Bit) mit Lazarus (32 Bit) hatte ich anfangs ein Memofeld erzeugt, das ich mittels einer dynamisch erstellten Stringliste befüllt habe. Lief gut. Dann wollte ich einzelne Zeilen im Memofeld mit anderer Formatierung (Fett, Größer) ausgeben und wechselte zu TRichMemo. Läuft grundsätzlich auch gut, aber Formatierungsbefehle werden nur global (RichMemo.Font.Size:=xx;) oder gar nicht umgesetzt. Aktuell habe ich mich mangels gescheiter Dokumentation an dem im Package mitgelieferten Beispiel orientiert:

Code: Alles auswählen

 
var
  MemBewertung: TRichMemo;
  fp, fp_orig: TFontParams;
.
.
.
// Hauptprogramm
with ResultsForm do  //Anzeige auf einem anderen Formular
  MemBewertung.GetTextAttributes(MemBewertung.SelStart, fp_orig);
  // Setzen neuer Parameter
  fp.Style:=[fsbold];
  fp.Size:=14;
  MemBewertung.SetTextAttributes(MemBewertung.SelStart, MemBewertung.SelLength,fp);
  // Zurück zum Original
  MemBewertung.SetTextAttributes(MemBewertung.SelStart, MemBewertung.SelLength,fp_orig);
 
Vielleicht weiß jemand weiter. Vielen Dank im Voraus. Und wenn möglich bitte einfach erklären, da ich Anfänger bin und mit Lazarus angefangen habe (auch kein Delphi gemacht).

Andreas
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

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

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

Ist denn überhaupt etwas selektiert? Bzw. hat SelLength einen Wert > 0?

http://wiki.freepascal.org/RichMemo

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
Danke für die rasche Antwort. Auf der genannten Seite stehen außer ein paar schicken Bildchen leider keinerlei (für mich) verwertbaren Informationen. Im mitgelieferten Beispiel (unit1.pas) ist 'SelLength' so wie von mir aufgeschrieben verwendet und nicht explizit initialisiert bzw. geschieht dies möglicherweise über die Funktion .GetTextAttributes. Daher bin ich davon ausgegangen, dass dies so in Ordnung geht. Außerdem wüsste ich gar nicht wie ich diesen Parameter korrekt initialisiere, evtl. mit Length(String), andererseits funktioniert das Programm korrekt ohne Fehlermeldung zur Laufzeit und auch die Strings sind korrekt und komplett dargestellt, nur eben nicht im gewünschten Format.
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 »

Nochmal @theo
das mit dem initialisieren hat mir jetzt keine Ruhe gelassen und daher habe ich mit Length() entsprechend initialisiert. Die Folge ist jetzt, dass der gesamte Text in Fett und größer dargestellt wird und nicht nur der einzelne String. Mein geänderter Code ist wie folgt:

Code: Alles auswählen

 
With ResultsForm do
//  MemBewertung.GetTextAttributes(MemBewertung.SelStart, fp_orig);  //ohne Effekt bei Zurücksetzen
  // Setzen neuer Parameter
  MemBewertung.GetTextAttributes(MemBewertung.SelStart, fp);
  fp.Style:=[fsbold];
  fp.Size:=14;
//  MemBewertung.SetTextAttributes(MemBewertung.SelStart,
//    MemBewertung.SelLength, fp);
  MemBewertung.SelLength:=Length('Osteoporose-Risiko Erhebungsbogen');
  MemBewertung.SetTextAttributes(0,MemBewertung.SelLength,fp);
  MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
  // Zurück zum Original
  fp.Style:=[];
  fp.Size:=10;
  MemBewertung.SelLength:=Length('');
  MemBewertung.SetTextAttributes(0,MemBewertung.SelLength,fp);
  MemBewertung.Lines.Add('');
 
Leider lässt sich die einmal eingestellte Formatänderung auf dem oben genannten Weg nicht rückgängig machen. Evtl muss auch statt den leeren Brackets [] irgendwas wie [fsStandard] oder so eingegeben werden, allerdings ist auch die Fontgröße nicht auf '10' geändert.
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 »

...habe nun weiter probiert mit folgendem Code:

Code: Alles auswählen

 
  // Sichern der Original-Parameter
//    fp_orig.Style:=MemBewertung.Font.Style;  //klappt nicht
//    fp_orig.Size:=MemBewertung.Font.Size;    //klappt nicht
    MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
    fp.Style:=[fsbold];
    fp.Size:=14;
//  MemBewertung.SetTextAttributes(MemBewertung.SelStart,MemBewertung.SelLength, fp);
    MemBewertung.SelLength:=Length('Osteoporose-Risiko Erhebungsbogen');
    MemBewertung.SetTextAttributes(0,MemBewertung.SelLength,fp);
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
  // Zurück zum Original
    MemBewertung.Lines.Add('');
    fp.Style:=[];
    fp.Size:=10;
    MemBewertung.SelStart:=MemBewertung.SelLength+1;
    MemBewertung.SelLength:=Length('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    MemBewertung.SetTextAttributes(MemBewertung.SelStart,MemBewertung.SelLength,fp);
    MemBewertung.Lines.Add('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
    MemBewertung.Lines.Add('');
 
...und kurioserweise (?) passiert jetzt genau der umgekehrte Effekt, und zwar ist die erste Zeile jetzt normal und der ganze Rest in Fett und groß. Eigentlich hätte ich's andersherum erwartet.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von Joz »

Hast du mal versucht, SetTextAttributes ( und vielleicht auch das Setzen von SelLength ) nach Add aufzurufen?
Also

Code: Alles auswählen

Lines.Add;
SelStart := Length(Lines.Text)-1
SelLength := 1;
SetTextAttributes
Ich weiß auch nicht, ob SelStart und SelLength überhaupt vorher gesetzt werden müssen. Wenn der Benutzer nichts ausgewählt hat, kannst du ja auch einfach eigene Zahlen übergeben?

Code: Alles auswählen

SetTextAttributes(0,8, fp)
Aktuell ist der Ablauf, glaube ich, folgender:

Code: Alles auswählen

Du hast ein leeres Memo.
Du formatierst einen String der Länge Length('blablabla')
Du fügst blablabla hinzu.
Du deformatierst von 0 bis Length(blablabla) 
Mach das mal in Word, und du wirst das selbe Ergebnis bekommen ;)

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 »

Joz hat geschrieben:Hast du mal versucht, SetTextAttributes ( und vielleicht auch das Setzen von SelLength ) nach Add aufzurufen?
Also

Code: Alles auswählen

Lines.Add;
SelStart := Length(Lines.Text)-1
SelLength := 1;
SetTextAttributes
Ich weiß auch nicht, ob SelStart und SelLength überhaupt vorher gesetzt werden müssen. Wenn der Benutzer nichts ausgewählt hat, kannst du ja auch einfach eigene Zahlen übergeben?

Code: Alles auswählen

SetTextAttributes(0,8, fp)
Meinst du das was ich in meinem letzten Posting geschrieben habe? (hat sich möglicherweise überschnitten)
Joz hat geschrieben: Aktuell ist der Ablauf, glaube ich, folgender:

Code: Alles auswählen

Du hast ein leeres Memo.
Du formatierst einen String der Länge Length('blablabla')
Du fügst blablabla hinzu.
Du deformatierst von 0 bis Length(blablabla) 
Mach das mal in Word, und du wirst das selbe Ergebnis bekommen ;)
Das hab' ich jetzt nicht verstanden. Was hat Word damit zu tun?
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 »

So, habe jetzt die ganze Chose umgedreht:

Code: Alles auswählen

 
    MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
    fp.Style:=[];  //kann evtl. weggelassen werden, da keine Änderung am Original
    fp.Size:=10;  //kann evtl. weggelassen werden
//  MemBewertung.SetTextAttributes(MemBewertung.SelStart,MemBewertung.SelLength, fp);
    MemBewertung.SelLength:=Length('Osteoporose-Risiko Erhebungsbogen');
    MemBewertung.SetTextAttributes(0,MemBewertung.SelLength,fp);
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
  // Zurück zum Original
    MemBewertung.Lines.Add('');
    fp.Style:=[fsbold];
    fp.Size:=14;
    MemBewertung.SelStart:=MemBewertung.SelLength+1;
    MemBewertung.SelLength:=Length('Datum der Befunderhebung: '+tab+tab+tab+tab+tab+tab+tab+TEdUTT.Text+'.'+TEdUMM.Text+'.'+TEdUJJJJ.Text);
 
... und jetzt ist die Überschrift Fett und groß und der Rest normal. Ist für mich zwar total unlogisch, funktioniert aber. Das Problem ist jetzt nur noch, dass ich zwischendrin noch einige Unterüberschriften habe, die ich gerne in Fett darstellen würde und ich jetzt absolut keinen Plan habe wie das gehen soll.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

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

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

Ich kenne diese Komponente eigentlich nicht wirklich.
Hast du es mal mit lzRichEdit probiert?
https://code.google.com/p/lazarus-br/downloads/list

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 »

..es ist eine Katastrophe :( . Nach über 3 Stunden Try-and-Error geb' ich's erst mal auf. Vielleicht kennt ja jemand noch irgendeine vernünftige Doku/Tutorial im Internet, da ich leider gar nichts Sinnvolles mit Beispielen über TRichMemo finde. Offensichtlich scheint auch niemand diese Unit bzw. Funktionen zu nutzen.
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:Ich kenne diese Komponente eigentlich nicht wirklich.
Hast du es mal mit lzRichEdit probiert?
https://code.google.com/p/lazarus-br/downloads/list
Danke, werd's mal damit probieren. Wollte eigentlich nicht wieder alles ändern, aber lieber ein Ende mit Schrecken. als...
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 »

Da gabs die Besonderheit, dass beim Einfügen eines Textes (SetText) alle bis dato gesetzten Formatierungen entfernt werden. Siehe http://www.lazarusforum.de/viewtopic.php?f=55&t=7193
Zuletzt geändert von Michl am Mo 17. Feb 2014, 09:24, insgesamt 1-mal geändert.

Code: Alles auswählen

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

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

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von Michl »

Ich habe jetzt nicht alles von Dir getestet, nutze kein TRichMemo (wie auch sonst keine derartigen Textformatierer), habe aber schnell mal die Trunc-Version geladen und getestet. Sieht eigentlich gut aus...

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  MemBewertung.GetTextAttributes(MemBewertung.SelStart,fp);
  MemBewertung.Lines.Add('Test normale Schrift');
 
  MemBewertung.Lines.Add('Teste [rote] Schrift');
  fp.Color:=$0000FF;
  MemBewertung.SetTextAttributes(UTF8Pos('rote', MemBewertung.Lines.Text) - 3, UTF8Length('rote'),fp);
 
  MemBewertung.Lines.Add('Teste [grüne] Schrift');
  fp.Color:=$00FF00;
  MemBewertung.SetTextAttributes(UTF8Pos('grüne', MemBewertung.Lines.Text) - 4, UTF8Length('grüne'),fp);
 
  MemBewertung.Lines.Add('Teste [blaue fette große ÄÖÜ] Schrift');
  fp.Color:=$FF0000;
  fp.Style:=[fsBold];
  fp.Size:=fp.Size + 5;
  MemBewertung.SetTextAttributes(UTF8Pos('blaue fette große ÄÖÜ', MemBewertung.Lines.Text) - 5, UTF8Length('blaue fette große ÄÖÜ'),fp);
end;
Das einzigste mir nicht ganz klar ist, warum je Zeile die Pos um jeweils das Lineending-Byte (UTF8Pos('...'', RichMemo.Text) - xxx, ...) verkürzt werden muss?!
Dateianhänge
TRichMemoTest.jpg

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 »

So ,ich habe jetzt auf RichEdit umgestellt. Allerdings auch hier das Problem, dass mir eine dynamische Veränderung zur Laufzeit nicht gelingt. Die Dokumentation ist auch hier sehr dürftig. Das Meiste findet man für Delphi, allerdings sind die Funktionsaufrufe teilweise anders als bei Lazarus. Bei den meisten Beispielen, die ich gesehen habe, ist mir nicht klar wie zur Laufzeit eine Aktualisierung gelingt. Ich habe nun folgenden Code:

Code: Alles auswählen

 
    MemBewertung.SelAttributes.Size:=14;
    MemBewertung.SelAttributes.Style:=[fsbold];
    MemBewertung.Font.Size:=MemBewertung.SelAttributes.Size;
    MemBewertung.Font.Style:=MemBewertung.SelAttributes.Style;
    MemBewertung.Update;
    MemBewertung.Lines.Add('Osteoporose-Risiko Erhebungsbogen');
    MemBewertung.SelAttributes.Size:=10;
    MemBewertung.Font.Size:=MemBewertung.SelAttributes.Size;
    MemBewertung.Update;
    MemBewertung.Lines.Add('');
 
Hierbei klappt die erstmalige Vergrößerung der Fontgröße auf '14', allerdings nicht die erneute Veränderung zurück und auch nicht die Anpassung von 'Style'. Mir ist mangels Doku ebenfalls nicht klar, ob die Funktion '.Update' und die weiteren Funktionen so korrekt eingesetzt sind.

@Michl
danke für die Hinweise. Genau die Unsicherheit in der Handhabung der Funktionen macht die Nutzung des Packages so problematisch, so dass (mir) eine halbwegs saubere Codierung nicht möglich ist. Ich denke auch, dass das RichEdit-Package etwas mächtiger im Hinblick auf mögliche Erweiterungen (evtl. Einfügen von Grafiken) ist.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

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

Re: Fontveränderung TRichMemo - Wie machen?

Beitrag von theo »

Es gibt im Ordner "Exemplo_RichBox" ein komplettes Beispiel, womit du testen kannst und abgucken, wie man's macht.

Antworten