![]() |
Radiogroup - Items verschieben im OnResize - Fehler
Hallo zusammen,
ich möchte die Items in einer Radiogroup neu ausrichten. Das klappt soweit mit folgendem Code:
Delphi-Quellcode:
Aber nur, wenn das Form bereits erzeugt ist und diese Zeile irgendwo in einem Button-Click-Event aufgerufen wird.
RadioGroup1.Buttons[0].Left :=10;
Im OnCreate des Forms bringt dieser Code allerdings Fehler. Zitat:
Ist das nun ein Fehler in der VCL, oder übersehe ich da etwas? |
AW: Radiogroup - Items verschieben im OnResize - Fehler
.. vielleicht hilft es, die Aufgabe in afterConstruction auszuführen.
Da sollten die RadioButtons schon erstellt sein. Grüße Klaus |
AW: Radiogroup - Items verschieben im OnResize - Fehler
Hab ich auch schon gestestet. Gleicher Fehler.
Eigentlich wollte ich im OnResize die Position der Buttons ändern, aber auch dort der gleiche Fehler. |
AW: Radiogroup - Items verschieben im OnResize - Fehler
.. füllst Du die Radiogroup per Code oder zur Designzeit?
|
AW: Radiogroup - Items verschieben im OnResize - Fehler
Zitat:
Wenn es da noch keine Items gibt, dann wäre es eh blöd, blind auf irgendwas zugreifen zu wollen.
Delphi-Quellcode:
DeineRadioGroup.Items.Count
Zitat:
Und davor auch schon seit Jahrzehnten, wenn OldCreateOrder nicht True ist, was es sowieso nach Möglichkeit nicht sein sollte. Aber egal, er machts es ja im OnResize, wie er schrieb :zwinker: Vielleicht auf csCreating oder csLoading im ComponentState der Form oder des RadioGroup prüfen, bzw. auf Assigned(DeineRadioGroup), während des Erstestellens/Ladens der Form, und dann das Ausrichten nicht machen. Die Items und Buttons werden nicht sofort synchronisiert, vor allem beim Laden der Form, wenn es noch keine Handles (HWND) gibt, gibt es auch keine CheckButtons. * Leider gibt es kein ButtonsCount, um die Anzahl zu prüfen. * Es sind leider auch alle Methoden im PRIVATE, welche man für den Abgleich aufrufen könnte. (UpdateButtons, bzw. SetButtonCount) * Andere Methoden/Ereugnisse zu finden, welche das sicher mit abgleichen, aber sonst nichts "schlimmes" machen, zu finden ist ... maaaaaaaaaa Suche mal nach UpdateButtons in der Vcl.ExtCtrls.
Delphi-Quellcode:
Das Einzige, was mir einfallen täte, wäre
TCustomRadioGroup = class(TCustomGroupBox)
private FButtons: TList; FItems: TStrings; ... procedure SetButtonCount(Value: Integer); procedure UpdateButtons; ... property ButtonList: TList read FButtons;
Delphi-Quellcode:
oder
DeineRadioGroup.HandleNeeded;
Delphi-Quellcode:
vor dem Zurgriff auf
DeineRadioGroup.Handle;
Delphi-Quellcode:
auszuführen,
DeineRadioGroup.Buttons[]
aber besser wäre es schon "zusätzlich" vorher csCreating und oder das Andere zu prüfen und es dann noch nicht auszurichten. [edit] ohhh,
Delphi-Quellcode:
.
property ButtonList: TList read FButtons;
Delphi-Quellcode:
type TRadioGroupAccess = class(TRadioGroup);
if DeinButtinIndex < TRadioGroupAccess(DeineRadioGroup).ButtonList.Count then |
AW: Radiogroup - Items verschieben im OnResize - Fehler
Die Buttons werden in der Tat erst später erzeugt. Insbesondere werden sie bei diversen Ereignissen auch neu positioniert. Dies passiert in der Methode ArrangeButtons, die erfreulicherweise virtuell ist. Mit einer entsprechenden Interceptor/Interposer Class kannst du die Methode überschreiben und nach dem inherited deine Anpassungen machen. Allerdings gilt es zu beachten, dass auch diese Methode aufgerufen wird, wenn die Buttons noch nicht existieren. Daher empfiehlt sich in jedem Fall eine Abfrage von ButtonList.Count bevor du auf Buttons[...] zugreifst.
|
AW: Radiogroup - Items verschieben im OnResize - Fehler
Danke euch für die Hinweise.
Ich denke, ich werde eine Ableitung erzeugen, arrangeButtons überschreiben und dann die "neue" Radiogroup im OnCreate erzeugen. |
AW: Radiogroup - Items verschieben im OnResize - Fehler
Zitat:
|
AW: Radiogroup - Items verschieben im OnResize - Fehler
Sind sie dann wenigstens verlässlich nil, so dass Assigned(myRadiogroup.items[x]) fehlschlägt?
|
AW: Radiogroup - Items verschieben im OnResize - Fehler
Zitat:
Da ButtonList aber protected und somit nur in Ableitungen verfügbar ist, kann man noch auf HandleAllocated prüfen. Das sollte auch das Vorhandensein der Buttons garantieren. |
AW: Radiogroup - Items verschieben im OnResize - Fehler
Delphi-Quellcode:
Dann wird beim Laden (Create) der TForm1 automatisch diese Ableitung benutzt. (nur zur Laufzeit)
type
TRadioGroup = class(Vcl.ExtCtrls.TRadioGroup) protected procedure ArrangeButtons; override; end; TForm1 = class(TForm) ... So wie damals auch hier ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz