Frames: Parentfont wird NICHT durchgereicht

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Frames: Parentfont wird NICHT durchgereicht

Beitrag von Lorca »

Hallo zusammen,

mit dem Feld Parentfont in den Frames werde ich noch wahnsinnig.

Ich habe 3 ineinander verschachtelte Frames. Überall habe ich Parentfont auf TRUE gesetzt, damit ich nur einmal für die Applikation
den Font einstellen muss.
Beim Einbinden der Frames in TFORM1, ist Parentfont immer an irgend einer Stelle (mal hier, mal da) unterbrochen, sodass immer die Standardeinstellung verwendet wird.

Sowohl das Frame selber, als auch alle enthaltenen Komponenten haben von mir in der Designphase Partentfont = True bekommen.

Jedoch wird manchesmal der Wert Parentfont, nicht immer korrekt gespeichert.
In der .LFM Datei steht nach dem Speichern der Parentfont auf False.


Kennt jemand dieses Problem?
Hat jemand eine Idee oder einen Tip wie man dieses Problem lösen kann ohne gleich jedes Frame im Coding noch einmal
überarbeiten zu müssen?


Gruß
Lorca

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von af0815 »

Wenn du beim dynamischen laden den Parent zuweist und nachher das Flag für den Parentfont setzt, geht es dann ?
Jedoch wird manchesmal der Wert Parentfont, nicht immer korrekt gespeichert.
In der .LFM Datei steht nach dem Speichern der Parentfont auf False
Ein Frame hat während der Designphase genaugenommen keinen Parent (welchen auch ?). Daher werden Einstellungen die von einem Parent kommen nicht greifen. Weil zur Laufzeit ein beliebiger Parent zugewiesen werden kann/muss.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von Lorca »

Hi all, hi af0815

@ af0815: erst einmal danke für Deine Antwort. :)

Was meinst Du mit Dynamischen laden?
Die Frames sind eingebunden und führen keinen (für mich erkennbaren) Create aus. Eine Event wie TFORM.ONCreate gibt es nicht.
Also wie und wo komme ich an die Laderoutine? :)

Ja es mag sein, daß das TFrame selber erst einmal keinen Parent hat. Das ist jedoch viel zu kurz gedacht. Denn ein Frame selber, ist (laut meinem derzeitigem Wissensstand ) ohne eine Form, nicht ausführbar. Daher muss TFrame damit rechnen, einen TParent übermittelt zu bekommen bzw. den eingestellten Wert an das (den?) Parent (egal ob TForm oder TFrame) weiter zu geben.

Weiter gibt es auch die Eigenschaft Visible. Auch hier gibt es Probleme, wenn das Frame, ein SUB-Frame eines anderen Frames ist.

Wenn ein Frame dann im Design Modus eingefügt wird, kommt mir echt die Galle hoch, wenn jedes mal Visible, Parentfont einen "Zufallswert" haben.

Seltsamer Weise wird ParentColor immer auf TRUE gesetzt. Wenn also das Frame keinen Parent kennt, warum ist dieser Wert dann immer True? Weiter ist hierzu zu sagen das ParentColor in Verbindung mit TPageControl und TTabSheet ebenfalls Probleme macht. Diese haben keinen ParentColor. Sie sind immer weiß. Und wenn man nicht höllisch aufpasst werden die Frames bzw. die im Frame eingebundenen Panels ebenfalls weiß dargestellt. Wird dann im Designer der Wert ParentColor auf False gesetzt. zeichnet sich das Frame nicht neu. Also nix mit Color := Default :(

Also hier gibt es aus meiner Sicht jede menge Refactoring Bedarf.


Viele Grüße
Lorca

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von af0815 »

Ich verwende generell Frames nur zur Laufzeit, niemals zur Designzeit ins Form gebunden.
Also hier gibt es aus meiner Sicht jede menge Refactoring Bedarf.
Es ist ein Projekt von Freiwilligen. Und es gehört auch dazu, das man Bugreports mit Beispiele erstellt. Zumindest das kann man als reiner Benutzer machen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von Lorca »

Hi af0815,

ja Du hast recht. :) Das werde ich auch machen.

Nur derzeit weiß ich noch nicht ob es mein eigener Fehler war, oder ob es tatsächlich ein BUG ist, oder ob es so sein soll und ich dazu weitere Einstellungen vornehmen muss.
Alles sieht zwar nach einem BUG aus, jedoch bin ich mir nur zu etwa 80% - 90% sicher.

Und da diese Kollegen auch viel zu tun haben möchte ich gerne mind. 98% erreichen.
Also wenn ich soweit bin, werde ich es auch melden. :)

Gibt es dazu Regeln einzuhalten? oder reicht eine Beschreibung mit angehängter Pas und LFM Datei?


Gruß
Lorca

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von af0815 »

Lorca hat geschrieben:
Do 29. Sep 2022, 12:34
Nur derzeit weiß ich noch nicht ob es mein eigener Fehler war, oder ob es tatsächlich ein BUG ist, oder ob es so sein soll und ich dazu weitere Einstellungen vornehmen muss.
Das ist auch der Vorteil wenn man das Problem in einem Beispiel isoliert. Wenn es eine "Error in user" Problem ist, so kann man das recht einfach dann festmachen. Das Beispiel kann man dann den Benutzern im Forum auch präsentieren und meistens bekommt man die Rückmeldung, ja ist ein Bug, oder es ist in der Version xxx nicht mehr enthalten. Oder man bekommt die Rückmeldung, wenn du es so und so machst geht es.

Ich mache immer ein Beispiel, auch wenn es nicht so einfach ist. Auch habe ich Lazarus selbst schon öfters mal in einer Debugversion gebaut um den Fehler einzugrenzen. Da gibt es ganz gemeine Sachen, aber auch oft nur auf einer Plattform.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von Lorca »

Hallo af0815,

ich habe es jetzt einmal mit einem dynamischen Einbinden probiert. Diese Vorgehensweise funzt wunderbar.
Und da ich die Frames im Designer aufgebaut habe weiß ich auch wie diese aussehen und was gemacht werden muß.

Also herzlichen Dank für Deine tolle "dynamische" Idee. :D


Gruß
Lorca

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5739
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von af0815 »

Ich verrate dir mal was ganz Topsecret. Mit statischen Frames habe ich schon bei D7 Probleme gehabt. :mrgreen:

[sarkastik on]Ich nehme an, da werden ein paar Core Entwickler bei einem Bugreport auf Delphi-Kompatibilität hinweisen [sarkastik off]
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4495
Registriert: Fr 8. Apr 2011, 09:01

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von wp_xyz »

Das Problem, das ich bei statisch eingebetteten Frames habe, sind die Event-Handler: Angenommen, du hast einen Frame entworfen, mit einem Button mit einem bestimmten OnClick-Handler. Wenn du jetzt den Frame in ein Formular eingebettet hast, siehst du den Button, auf dem Monitor. Falls du auf dem Button einen Doppelklick ausführst, wird im Editor ein neuer leerer Handler für dessen OnClick erzeugt - damit ist der im Frame zugewiesene Handler futsch. Selbst wenn du den leeren Handler löschst, bleibt in der lfm-Datei ein "OnClick = nil" zurück (das könnte man glatt als Bug melden):

Code: Alles auswählen

object Form1: TForm1
  ...
  inline Frame1_1: TFrame1
    Left = 16
    Top = 16
    inherited Button1: TButton
      OnClick = nil                       // <---  das entfernt den originalen OnClick-Handler
    end
  end
end 
Es bleibt als einzige Lösung, die IDE zu beenden, die lfm-Datei in einen externen Editor zu laden und die Zeile mit dem OnClick = nil zu löschen.

Das spart man sich, wenn man den Frame dynamisch erzeugt, denn dann ist er in dem Formular zur Designzeit nicht zu sehen und man kann nicht mehr irrtümlich die Handler oder sonstige Properties der Frame-Komponenten verstellen.

Siehe beigefügtes Projekt:
- der obere gelbe Frame mit Button wurde zur Designzeit statisch eingefügt, auf dem Button wurde per Doppelklick ein leerer Onclick-Handler erzeugt, der dann wieder gelöscht wurde --> Keine Reaktion beim Button-Click
- der untere rote Frame wurde zur Laufzeit erzeugt (OnCreate des Formulars) - hier funktioniert alles wie erwartet.
Dateianhänge
frame_events.zip
(2.39 KiB) 29-mal heruntergeladen

Lorca
Beiträge: 147
Registriert: Di 3. Nov 2020, 12:25

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von Lorca »

Hallo zusammen,

ich denke mal ich konnte eine einfache provisorische Lösung ermitteln. :)

Zum Problem:
Das Feld ParentFont ist in der Klasse : TControl mit dem Defaultwert TRUE definiert:
property ParentFont: Boolean read FParentFont write SetParentFont default True;

Somit wird der Wert TRUE, nicht in der LFM Datei gespeichert. Ein False jedoch sehr wohl.
Beim Hochladen der Frames wird nun dieses Feld in der LFM nicht gefunden. Anstatt nun den default wert her zu nehmen, um damit das Feld ParentFont im Objektinspector zu besetzen, bleibt dann das Feld leer, obwohl der default Wert TRUE ist.
Ihr könnt es ausprobieren wenn ihr ein Frame im Editor hochladet, das Feld Parentfont auf TRUE setzt, das ganze speichert und schließt.
Öffnet ihr dann das Frame erneut, ist Parentfont wieder leer. Aus meiner Sicht ein echter Bug in der Laderoutine des Frames. Denn bei einer Form funzt es ja auch.
Was also bei den anderen, abgeleiteten Komponenten funzt, schein hier in die Grüze zu gehen.

Zu meiner provisorischen Lösung:
Ich habe einfach der Constructor überschrieben, und diese Felder hier drin gesetzt. Ist zwar nicht sonderlich elegant, funktioniert jedoch hervorragend.
Der Vorteil ist das ich dieses Frame nun Statisch einbinden kann. Somit sehe ich alle im Frame definierten Felder schon während der Design Phase und nicht erst während der Laufzeit. Also Danke schön an af0815 für diese 11 meter Vorlage :D



Ob daraus eine BUG Meldung werden soll, würde ich gerne dem Ergebnis einer Forumsdiskussion überlassen. :)

Viele Grüße
Lorca

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1210
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von fliegermichl »

Also ich habe mehrere Frames ineinander verschachtelt und konnte keine Probleme feststellen.
Lazarus 2.2.0 (rev lazarus_2_2_0-80-g2187550) FPC 3.2.2 x86_64-win64-win32/win64

wp_xyz
Beiträge: 4495
Registriert: Fr 8. Apr 2011, 09:01

Re: Frames: Parentfont wird NICHT durchgereicht

Beitrag von wp_xyz »

Ich habe versucht die Beschreibung nachzustellen: Ein MainForm mit Color=clYellow und Font.Style = [fsBold] und zwei Buttons mit denen Color und Font.Style zwischen zwei Werten hinundhergeschaltet werden können. Darauf ein TFrame mit Label, Panel und einem Bevel (damit man die Grenzen des Frames sieht). Der Frame wird zur Designzeit eingesetzt. Dies funktioniert alles wie es soll - siehe beigefügtes Projekt.

Wahrscheinlich habe ich den kritischen Punkt in deinem Problem nicht mit im Projekt. Daher wäre es besser, wenn du selbst versuchst, so ein kleines Projekt zu erstellen, in dem der Fehler auftritt. Spätestens nach dem Einschicken eines Bugreports wirst du dazu aufgefordert werden. Ein komplexes Projekt mit diversen Abhängigkeiten sieht sich niemand an.

Die Parent*-Eigenschaften sind äußerst sensible "Tierchen". Sobald du bei einem Control dessen Farbe, Font, etc. verändert hast, springt die entsprechende Parent-Eigenschaft auf false. Und wird auch nicht automatisch zurückgesetzt, wenn du den ursprünglichen Wert wiederherstellst. Beweis: neues Formular, ein Panel draufsetzen - es hat Color=clDefault. Setze Color des Panels auf clRed - Panel.ParentColor wird false. Setze Color des Panels auf clDefault zurück - Panel.ParentColor bleibt false!
Dateianhänge
frame_parentcolor_parentfont.zip
(2.48 KiB) 25-mal heruntergeladen

Antworten