Frames und Vererbung
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Frames und Vererbung
Moin,
ich möchte mir einen kleinen Editor als Frame erstellen, den ich an verschiedenen Stellen einsetzen kann, und zwar einmal mit einem einfachen TRichMemo und einmal mit einem TDBRichMemo. Dazu habe ich zunächst mal einen Frame mit eingebettetem TRichMemo erstellt und eine Toolbar angelegt mit den üblichen Buttons für fett, kursiv etc. Funktioniert alles auch soweit. Dann habe ich das TRichMemo entfernt und durch eine Variable
FRichEdit: TCustomRichMemo;
ersetzt. Dann einen Frame erstellt, der von diesem Basis-Frame abgeleitet ist und in dessen Constructor eine Instanz von TRichMemo für diese Variable erstellt. Das kompiliert auch alles, und der neue Frame erscheint auch wie erwartet, und auch die Methoden, die mit dieser Variablen arbeiten, werden 'anstandslos' (dh ohne Schutzverletzung odgl) durchlaufen - nur funktionieren tun sie leider nicht bzw liefern andere Ergebnisse als mit einer aus der *.lfm des Basis-Frames erzeugten Instanz. Ich steh da jetzt etwas auf dem Schlauch
a) warum das so ist
b) wie man das 'richtig' macht.
Ich möchte eben letztlich nicht zwei Frames haben, die jeweils den ganzen Formatierungscode doppelt mitschleppen.
ich möchte mir einen kleinen Editor als Frame erstellen, den ich an verschiedenen Stellen einsetzen kann, und zwar einmal mit einem einfachen TRichMemo und einmal mit einem TDBRichMemo. Dazu habe ich zunächst mal einen Frame mit eingebettetem TRichMemo erstellt und eine Toolbar angelegt mit den üblichen Buttons für fett, kursiv etc. Funktioniert alles auch soweit. Dann habe ich das TRichMemo entfernt und durch eine Variable
FRichEdit: TCustomRichMemo;
ersetzt. Dann einen Frame erstellt, der von diesem Basis-Frame abgeleitet ist und in dessen Constructor eine Instanz von TRichMemo für diese Variable erstellt. Das kompiliert auch alles, und der neue Frame erscheint auch wie erwartet, und auch die Methoden, die mit dieser Variablen arbeiten, werden 'anstandslos' (dh ohne Schutzverletzung odgl) durchlaufen - nur funktionieren tun sie leider nicht bzw liefern andere Ergebnisse als mit einer aus der *.lfm des Basis-Frames erzeugten Instanz. Ich steh da jetzt etwas auf dem Schlauch
a) warum das so ist
b) wie man das 'richtig' macht.
Ich möchte eben letztlich nicht zwei Frames haben, die jeweils den ganzen Formatierungscode doppelt mitschleppen.
- Dateianhänge
-
EditorFrames.zip
- (5.86 KiB) 61-mal heruntergeladen
- af0815
- Lazarusforum e. V.
- Beiträge: 6790
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Frames und Vererbung
Mit den beiden Frames im Anhang, kann ich das einmal nicht nachvollziehen, was da nicht gehen soll. Was heisst gehen nicht bzw. liefern andere Ergebnisse. Kannst du da auch komplette Beispiele liefern ?!
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: Frames und Vererbung
Sorry, habe noch mal ein Testprojekt beigelegt sowie unter /works die funktionierende Ursprungsversion des Frames. Wo in diesem eine selektierte Textstelle nach Betätigen des entsprechenden Buttons zb fett wird, verschwindet sie in dem abgeleiteten einfach. 'Funktioniert nicht' war in der Tat eine selten dämliche Beschreibung...
- Dateianhänge
-
EditorProject.zip
- (7.54 KiB) 53-mal heruntergeladen
-
- Beiträge: 475
- 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: Frames und Vererbung
HI,
du musst das OnSelectionChange Ereignis noch implementieren. So wie du es auch in deinem funktionierenden Test gemacht hast. Sonst sind die Font/Fontattribute, wo du was mit SetTextAttributes hinzufügen oder wegnehmen willst, leer und dann kommt Quatsch raus.
du musst das OnSelectionChange Ereignis noch implementieren. So wie du es auch in deinem funktionierenden Test gemacht hast. Sonst sind die Font/Fontattribute, wo du was mit SetTextAttributes hinzufügen oder wegnehmen willst, leer und dann kommt Quatsch raus.
Code: Alles auswählen
type
{ TfrCustomRichEditor }
TfrCustomRichEditor = class(TFrame)
.....
private
....
procedure SelectionChange(Sender:TObject);
.....
implementation
constructor TfrCustomRichEditor.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
FRichEdit:=TRichMemo.Create(Self);
FRichEdit.Parent:= Self;
FRichEdit.Align:= alClient;
FRichEdit.OnSelectionChange:=@SelectionChange;
....
procedure TfrCustomRichEditor.SelectionChange(Sender: TObject);
begin
FRichEdit.GetTextAttributes(FRichEdit.SelStart, FFontParams);
UpdateToolBar;
end;
mfg Ingo
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: Frames und Vererbung
Vielen Dank, das dürfte es sein... kann es sein, dass gestern Montag war?
Edit: yep. Im abgeleiteten Frame:
und es läuft. Besten Dank noch mal!
Edit: yep. Im abgeleiteten Frame:
Code: Alles auswählen
//...
with FRichEdit do
begin
OnSelectionChange := @EditSelectionChange;
//...
Zuletzt geändert von Sieben am Di 14. Dez 2021, 00:52, insgesamt 1-mal geändert.
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: Frames und Vererbung
Noch eine Beobachtung, die tatsächlich mit Vererbung zu tun hat: wenn ich im Basis-Frame eine Komponente lösche, danach einen Abkömmling aufrufe, der zu dieser Komponente bereits etwas in seiner .lfm gespeichert hat, meldet die IDE erwartungsgemäß einen nicht gefundenen Vorfahren zu diesem Eintrag. Wählt man dann das voreingestellte 'Laden der Ressource abbrechen', so knallt es ganz gewaltig, und zwar so heftig wie auch hier beschrieben (und wie ich es anhand des dortigen Beispiels auch mit 2.0.10 nachvollziehen konnte). Das finde ich schon bemerkenswert, da ich die IDE eigentlich als erstaunlich stabil und 'forgiving' kennengelernt habe. Vielleicht hat sich da tatsächlich ein Bug in's Streaming-System eingeschlichen?
Wählt man dagegen 'Laden fortsetzen', läuft alles glatt, und der Abkömmling erscheint ohne die im Vorläufer gelöschte Komponente. Es wäre dann allerdings schön, wenn die IDE den Abkömmling auch als geändert bzw zum Speichern vormerken würde. Im Moment wird eine bereinigte .lfm nur geschrieben, wenn noch weitere Veränderungen vorgenommen werden.
Wählt man dagegen 'Laden fortsetzen', läuft alles glatt, und der Abkömmling erscheint ohne die im Vorläufer gelöschte Komponente. Es wäre dann allerdings schön, wenn die IDE den Abkömmling auch als geändert bzw zum Speichern vormerken würde. Im Moment wird eine bereinigte .lfm nur geschrieben, wenn noch weitere Veränderungen vorgenommen werden.
- af0815
- Lazarusforum e. V.
- Beiträge: 6790
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Frames und Vererbung
Ich verwende Frames nur dynamisch im Code. Niemals direkt, auch aufgrund von Seiteneffekten, wenn etwas in der Basisversion gelöscht oder stark geändert wurde. Auch die Bindungen erstelle ich immer zur Laufzeit.
Da ich komplexe Frame in Frame Strukturen verwende, habe ich oft eigen Testumgebungen damit ich die Frames alleine testen kann. Damit erspare ich mir im eigentlichen Projekt ärger. So kann ich das einzelne Frame komplett auf Funktion testen, dann wird das in die eigentliche App eingeklingt, parametriert und läuft. Falls was nicht ganz rund läuft, so kann ich das wieder in der Testumgebung mit definierten Parametern testen.
Da ich komplexe Frame in Frame Strukturen verwende, habe ich oft eigen Testumgebungen damit ich die Frames alleine testen kann. Damit erspare ich mir im eigentlichen Projekt ärger. So kann ich das einzelne Frame komplett auf Funktion testen, dann wird das in die eigentliche App eingeklingt, parametriert und läuft. Falls was nicht ganz rund läuft, so kann ich das wieder in der Testumgebung mit definierten Parametern testen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 289
- Registriert: Mo 24. Aug 2020, 14:16
- OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
- CPU-Target: i386
Re: Frames und Vererbung
Danke, so werde ich es dann wohl auch (wieder - in Delphi war das ja auch nicht ohne Probleme oder Seiteneffekte) halten. Im Moment möchte ich aber auch erst mal nur sehen, was Lazarus in dieser Hinsicht so bietet und wo hier die Fallstricke sind. Und ich bin in der glücklichen Lage, das nur noch zum Privatvergnügen zu betreiben und benötige daher auch keine ganz so komplexen Strukturen mehr, die verschiedenste Umgebungen und alle möglichen Weiterentwicklungen berücksichtigen müssen. An seiner eigentlichen Wirkungsstätte würde ich einen Frame aber auch immer nur zur Laufzeit erzeugen und verkabeln.