RichMemo Initialisierung

Rund um die LCL und andere Komponenten
Antworten
Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

RichMemo Initialisierung

Beitrag von Ronny58 »

Hallo,

ich habe ein Problem beim Aufruf der von RichMemo mit einem leeren Editor.

Ich möchte den Font vor einstellen (der aktuelle Font unter dem Cursor wird in einer Toolbar-Leiste angezeigt - zweiter Code).

Beim jungfräulichen Editor ist es purer Zufall, welcher Font welche Schriftfarbe oder welcher Hintergrund ausgelesen wird. Meines Erachtens liegt das an der RichMemo-Procedure:

Code: Alles auswählen

 
procedure InitFontParams(out p: TFontParams);
begin
  FillChar(p, SizeOf(p), 0);
end;
 


Die könnte ich jetzt in der Unit umschreiben, so dass ich der Funktion initiale Parameter übergeben. Das macht mich aber nicht so glücklich. Wobei ich noch nicht ausprobiert, ob es klappt. Beim nächsten Update müsste ich wieder daran denken.


Ich habe in meinem Programm es mit folgendem Code-Stück versucht zu lösen:

Code: Alles auswählen

 
procedure TForm1.EditorInit;
var fo: TFontParams;
begin
  fo.Name      := 'Calibri';
  fo.Size      :=  10;
  fo.Color     := clBlack;
  fo.BkColor   := clWhite;
  rmEditor.SetTextAttributes(rmEditor.SelStart, rmEditor.SelLength, fo);
end;
 

Jetzt bekomme ich dabei immer einen Fehler:
"in Datei: .win32\win32richmemoproc.pas Zeile 321:
Result:=EffMask[VPOS];"


Diese Procedure wird in den Editor-Ereignisse OnChange, OnClick und OnKeyUp aufgerufen um immer den aktuellen Font unter dem Cursor auf das Menü zu übertragen

Code: Alles auswählen

 
procedure TForm1.EditorMenuPaint;
var tp : TFontParams;
    al : TParaAlignment;
    pn : TParaNumbering;
    i  : Integer;
begin
  i := rmEditor.SelStart;
 
  if i > 0 then dec(i);
 
  rmEditor.GetTextAttributes(i, tp);
  rmEditor.GetParaAlignment(i, al);
  rmEditor.GetParaNumbering(i, pn);
 
  sbBold.Down      := fsBold in tp.Style;
  sbItalic.Down    := fsItalic in tp.Style;
  sbUnderline.Down := fsUnderline in tp.Style;
  sbStrikeOut.Down := fsStrikeOut in tp.Style;
  sbLeft.Down      := (al = paLeft);
  sbCenter.Down    := al = paCenter;
  sbRight.Down     := al = paRight;
  sbJustify.Down   := al = paJustify;
  sbBullet.Down    := pn.Style = pnBullet;
  sbNumber.Down    := pn.Style = pnNumber;
 
  edForeColor.Font.Color := tp.Color;
  edBackColor.Color      := tp.BkColor;
 
  edFont.Text   := tp.Name;
  edSize.Text   := IntToStr(tp.Size);
end;
 


So und da wird nun wirklich Müll angezeigt, solange bis ich aktiv über das Editor-Menü etwas einstelle.

Hat da jemand eine Lösung?

LG Ronny58

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: RichMemo Initialisierung

Beitrag von shokwave »

Hallo,

ich hab mal versucht das Problem nachzustellen. Jedoch kann ich das mit der zufällig eingestellten Schrift nicht bestätigen. Hab es allerdings auch mit Lazarus und FPC trunk unter Win10 probiert. Es war nach dem Start ohne "EditorInit" immer die Default-Schriftart eingestellt.

Appropos. Die Methode hat bei mir erst richtig gearbeitet, nachdem ich sie wie folgt geändert habe.

Code: Alles auswählen

procedure TForm1.EditorInit;
var fo: TFontParams;
begin
  fo.Name      := 'Calibri';
  fo.Size      :=  20;
  fo.Color     := clBlack;
  fo.BkColor   := clWhite;
  fo.Style     := []//Setzt den Style zurück
  rmEditor.SetTextAttributes(rmEditor.SelStart, 1, fo); //2. Attribut  auf 1, da SelLength vermutlich 0 ist und die Einstellungen werden nicht dauerhaft übernommen
end;   
mfg Ingo

Ronny58
Beiträge: 90
Registriert: So 27. Apr 2014, 20:35

Re: RichMemo Initialisierung

Beitrag von Ronny58 »

Hallo shokwafe,

danke für Deine Hilfe.

Allerdings hat mir die EditorMenuPaint-Routine trotzdem nun den Font auf Bold, Underline, Italic und StrikeOut gesetzt.

Ich hab jetzt vor der Initialisierung mir den aktuellen Font erstmal geholt, dann initialisiert und gesetzt. Da hat dann alles geklappt.

Code: Alles auswählen

rmEditor.GetTextAttributes(rmEditor.SelStart, fo);


Manchmal ist die Lösung so einfach, dass man nicht drauf kommt.
Passiert mir öfter mal, dass für mich "offensichtlich" keine Lösung zu sein scheint.

Sieht jetzt also wie folgt aus:

Code: Alles auswählen

 
procedure TfKommentar.EditorInit;
var fo: TFontParams;
begin
  rmEditor.GetTextAttributes(rmEditor.SelStart, fo);
  fo.Style     := [];  //Setzt den Style zurück
  fo.Name      := 'Calibri';
  fo.Size      :=  10;
  fo.Color     := clBlack;
  fo.BkColor   := clWhite;
  rmEditor.SetTextAttributes(rmEditor.SelStart, 1, fo); //2. Attribut  auf 1, da SelLength vermutlich 0 ist und die Einstellungen werden nicht dauerhaft übernommen
end;
 

Antworten