AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Radiogroup - Items verschieben im OnResize - Fehler

Radiogroup - Items verschieben im OnResize - Fehler

Ein Thema von bernau · begonnen am 6. Jun 2024 · letzter Beitrag vom 6. Jun 2024
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#1

Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 08:06
Hallo zusammen,

ich möchte die Items in einer Radiogroup neu ausrichten. Das klappt soweit mit folgendem Code:

RadioGroup1.Buttons[0].Left :=10; Aber nur, wenn das Form bereits erzeugt ist und diese Zeile irgendwo in einem Button-Click-Event aufgerufen wird.

Im OnCreate des Forms bringt dieser Code allerdings Fehler.

Zitat:
"Listenindex außerhalb des gültigen Bereichs (0). TList ist leer"
Es sieht so aus, als wenn die RadioButtons noch garnicht erzeugt wurden. Items.count zeigt aber einen Count>0 an. Ich habe also gar keine Möglichkeit vor dem Zugriff auf ein Radiobutton festzustellen, ob dieser überhaupt verfügbar ist.

Ist das nun ein Fehler in der VCL, oder übersehe ich da etwas?
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.769 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 08:20
.. vielleicht hilft es, die Aufgabe in afterConstruction auszuführen.
Da sollten die RadioButtons schon erstellt sein.


Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#3

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 08:24
Hab ich auch schon gestestet. Gleicher Fehler.

Eigentlich wollte ich im OnResize die Position der Buttons ändern, aber auch dort der gleiche Fehler.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.769 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 08:30
.. füllst Du die Radiogroup per Code oder zur Designzeit?
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#5

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 10:04
Zitat:
füllst Du die Radiogroup per Code oder zur Designzeit?
Jo, erstmal das.

Wenn es da noch keine Items gibt, dann wäre es eh blöd, blind auf irgendwas zugreifen zu wollen.
DeineRadioGroup.Items.Count





.. vielleicht hilft es, die Aufgabe in afterConstruction auszuführen.
In Delphi 12 ist OnCreate immer im AfterConstruction, da muß man sich nicht extra speziell an Dieses dranhängen (override).
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


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:
  TCustomRadioGroup = class(TCustomGroupBox)
  private
    FButtons: TList;
    FItems: TStrings;
    ...
    procedure SetButtonCount(Value: Integer);
    procedure UpdateButtons;
    ...
    property ButtonList: TList read FButtons;
Das Einzige, was mir einfallen täte, wäre DeineRadioGroup.HandleNeeded; oder DeineRadioGroup.Handle; vor dem Zurgriff auf DeineRadioGroup.Buttons[] auszuführen,
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, property ButtonList: TList read FButtons; .
Delphi-Quellcode:
type TRadioGroupAccess = class(TRadioGroup);

if DeinButtinIndex < TRadioGroupAccess(DeineRadioGroup).ButtonList.Count then
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu ( 6. Jun 2024 um 10:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.471 Beiträge
 
Delphi 12 Athens
 
#6

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 10:10
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#7

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 10:55
Danke euch für die Hinweise.

Ich denke, ich werde eine Ableitung erzeugen, arrangeButtons überschreiben und dann die "neue" Radiogroup im OnCreate erzeugen.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#8

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 10:59

Wenn es da noch keine Items gibt, dann wäre es eh blöd, blind auf irgendwas zugreifen zu wollen.
DeineRadioGroup.Items.Count

Tatsächlich habe ich items.count genutzt, um zu sehen, wieviel items vorhanden sind um dann die Buttons zu positionieren. Während aber items.count>0 ist, sind die Buttons dennoch nicht vorhanden.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
249 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 12:01
Sind sie dann wenigstens verlässlich nil, so dass Assigned(myRadiogroup.items[x]) fehlschlägt?
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.471 Beiträge
 
Delphi 12 Athens
 
#10

AW: Radiogroup - Items verschieben im OnResize - Fehler

  Alt 6. Jun 2024, 12:09
Sind sie dann wenigstens verlässlich nil, so dass Assigned(myRadiogroup.items[x]) fehlschlägt?
Ja und nein. Das Listenelement ist nicht zwingend nil, löst in der Regel aber einen Range Error aus. Falls nicht, ist das Ergebnis allerdings nicht vorhersagbar. Eine explizite Prüfung auf Gültigkeit des Index erfolgt allerdings nicht.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz