Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
25. Mai 2022
Das ist dann halt eine andere Anforderung, für die man ja immer noch den Standard-Enumerator verwenden kann:
for var cmp in Self do begin
if cmp is TButton then
TButton(cmp).Caption := 'Hello World'
else if cmp is TPageControl then
TPageControl(cmp).ActivePageIndex := 0
else if cmp is TEdit then
TEdit(cmp).Font.Style := ;
end;
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
12. Mai 2022
So, hier noch eine generische Alternative wenn es auf Performance nicht ganz so ankommt (wegen der anonymen Methode). Kann man dann allerdings auch leicht in anderen Situationen einsetzen.
type
TEnumWrapper<T: class> = record
type
TGetItemFunc = TFunc<Integer, TObject>;
TEnumerator = record
private
FIndex: Integer;
FCount: Integer;
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
12. Mai 2022
Stefan Glienke hat gestern noch ein wenig Hand angelegt und ich möchte euch das Ergebnis nicht vorenthalten:
type
TWinControlHelper = class helper for TWinControl
type
TControlEnumerator<T: TControl> = record
private
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
11. Mai 2022
Man sollte vielleicht erwähnen, dass das ControlsOf in diesem Fall ja das des Forms ist, in dessen Event-Handler es aufgerufen wird. Wollte man das auf ein Panel anwenden, um z.B. die Buttons auf diesem Panel zu verarbeiten, müsste man das so schreiben:
for var ctrl in Panel1.ControlsOf<TButton> do
ctrl.Caption := 'Hello World';
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
11. Mai 2022
Kannst du diese Aussage etwas präzisieren?
Was am Aufruf einer function eines Objekts ist denn un-objektorientiert? (Oder allgemeiner: Was bedeutet un-objektorientiert überhaupt?)
Würde diese function ein TArray<TControl> zurückgeben, was ja problemlos mit for-in iteriert werden kann, wäre das dann auch un-objektorientiert?
Immerhin wird sowas ja bereits an vielen Stellen in Delphi gemacht,...
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
11. Mai 2022
Interessanterweise gibt es bereits einen Enumerator für Components, allerdings nicht generisch:
for var cmp in Self do
if cmp is TButton then
TButton(cmp).Caption := 'Hello World';
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
11. Mai 2022
Hier auch noch das Pendant für Components:
type
TComponentHelper = class helper for TComponent
type
TComponentEnumerator<T: TComponent> = class
private
FIndex: Integer;
FComponent: TComponent;
function GetCurrent: T;
Forum: GUI-Design mit VCL / FireMonkey / Common Controls
by Uwe Raabe,
11. Mai 2022
Das ist immer noch so und einfach der Tatsache geschuldet, dass Controls ein Array-Property und eben kein Array ist.
Es gibt aber Abhilfe - und die ist sogar noch besser. Mit dem Code weiter unten kann man nämlich Folgendes schreiben:
for var ctrl in ControlsOf<TButton> do
ctrl.Caption := 'Hello World';
type