AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls .Controls und .Components nicht als Auflistung nutzbar?
Thema durchsuchen
Ansicht
Themen-Optionen

.Controls und .Components nicht als Auflistung nutzbar?

Ein Thema von freejay · begonnen am 11. Mai 2022 · letzter Beitrag vom 25. Mai 2022
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 11. Mai 2022, 15:23
Interessanterweise gibt es bereits einen Enumerator für Components, allerdings nicht generisch:
Delphi-Quellcode:
  for var cmp in Self do
    if cmp is TButton then
      TButton(cmp).Caption := 'Hello World';
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
273 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 11. Mai 2022, 16:45
Vielen Dank!

Nicht falsch verstehen jetzt (ich bin sehr dankbar für die aufgezeigte Lösung), aber:

Das ist sicher besser als for i := 0 to ... aber es sieht wie eine Funktion aus, die man mit dem Control aufruft und das wirkt irgendwie "un-objektorientiert"...

Ich nehme an diese Helper sind (noch) nicht Bestandteil von Delphi?
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 11. Mai 2022, 17:04
aber es sieht wie eine Funktion aus, die man mit dem Control aufruft und das wirkt irgendwie "un-objektorientiert"
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, z.B. TStringList.ToStringArray .

Ich nehme an diese Helper sind (noch) nicht Bestandteil von Delphi?
Nein, die sind von mir. Wären sie in Delphi drin, wären es vermutlich keine Helper, sondern die Funktionalität wäre direkt in TComponent bzw. TWinControl implementiert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 11. Mai 2022, 22:47
die Funktionalität wäre direkt in TComponent bzw. TWinControl implementiert.
Stellt sich die Frage: Wieso ist es das eigentlich nicht? Das ist doch ziemlich ein Paradebeispiel für solch ein Konstrukt. Bin ich auch schon kräftig drüber gestolpert, und war doch recht verwundert ob der Tatsachen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 11. Mai 2022, 22:57
für Components gibt es bereits einen Enumerator

for var C in IrgendeineTComponentInstanz do
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
273 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 12. Mai 2022, 09:52
Hallo zusammen,

sorry, konnte mir das gestern nicht mehr genau ansehen - war ein bisschen knapp an Zeit...

Wenn ich mir jetzt das mit
Code:
Panel1.ControlsOf<TButton>
ansehe, dann ist das natürlich

1. absolut objektorientiert und
2. mit der Angabe der Control-Typen, die man haben will, auch noch praktischer als eine reine Auflistung.

Das werde ich auf jeden Fall nutzen!

Vielen Dank dafür!

Gruß

Freejay
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 12. Mai 2022, 10:03
Stefan Glienke hat gestern noch ein wenig Hand angelegt und ich möchte euch das Ergebnis nicht vorenthalten:

Zitat von Stevie:
hab mal deinen control enumerator umgeschrieben, um jegliche allokationen zu vermeiden und alle methoden inlinen zu lassen
Delphi-Quellcode:
type
  TWinControlHelper = class helper for TWinControl
  type
    TControlEnumerator<T: TControl> = record
    private
      FIndex, FCount: Integer;
      FWinControl: TWinControl;
      FCurrent: T;
    public
      function MoveNext: Boolean; inline;
      property Current: T read FCurrent;
    end;

    TControls<T: TControl> = record
    private
      FWinControl: TWinControl;
    public
      function GetEnumerator: TControlEnumerator<T>; inline;
    end;
  public
    function ControlsOf<T: TControl>: TControls<T>; inline;
  end;

{ TWinControlHelper }

function TWinControlHelper.ControlsOf<T>: TControls<T>;
begin
  Result.FWinControl := Self;
end;

{ TWinControlHelper.TControls<T> }

function TWinControlHelper.TControls<T>.GetEnumerator: TControlEnumerator<T>;
begin
  Result.FIndex := 0;
  Result.FWinControl := FWinControl;
  Result.FCount := FWinControl.ControlCount;
end;

function TWinControlHelper.TControlEnumerator<T>.MoveNext: Boolean;
var
  LControl: TControl;
begin
  repeat
    if FIndex < FCount then
    begin
      LControl := FWinControl.Controls[FIndex];
      Inc(FIndex);
      if LControl.InheritsFrom(T) then
      begin
        FCurrent := T(LControl);
        Exit(True);
      end;
    end
    else
      Exit(False)
  until False;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 12. Mai 2022, 00:04
Stellt sich die Frage: Wieso ist es das eigentlich nicht?
Ist es doch - zumindest teilweise:
Interessanterweise gibt es bereits einen Enumerator für Components, allerdings nicht generisch:
Delphi-Quellcode:
  for var cmp in Self do
    if cmp is TButton then
      TButton(cmp).Caption := 'Hello World';
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.869 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 11. Mai 2022, 17:06
Zitat:
Das ist sicher besser als for i := 0 to ... aber es sieht wie eine Funktion aus, die man mit dem Control aufruft und das wirkt irgendwie "un-objektorientiert"...
Delphi-Quellcode:
for var ctrl in ControlsOf<TButton> do
    ctrl.Caption := 'Hello World';
Doch ist doch objektorientiert. Oder wie sollte es nach Deiner Meinung aussehen, wenn es objektorientiert wäre?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: .Controls und .Components nicht als Auflistung nutzbar?

  Alt 11. Mai 2022, 17:09
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:
Delphi-Quellcode:
for var ctrl in Panel1.ControlsOf<TButton> do
  ctrl.Caption := 'Hello World';
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:35 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