Hallo,
wer häufiger über bestimmte Controls in einem Container iterieren muss, der kann über den Einsatz eines
Enumerators (Delphi 2005+) nachdenken. Die Schnittstelle der Klasse könnte dabei so aussehen:
Delphi-Quellcode:
type
TControlsEnumerator = class
public
constructor Create (const aContainer: TWinControl);
destructor Destroy; override;
function GetEnumerator: TControlsEnumerator; inline;
function withClass (const aClassFilter: TControlClass): TControlsEnumerator; inline;
function named (const aNameFilter: string): TControlsEnumerator; inline;
function recursive: TControlsEnumerator; inline;
function sortedByName: TControlsEnumerator; inline;
function MoveNext: Boolean;
function GetCurrent: TControl; inline;
property Current: TControl read GetCurrent;
end;
function ContainedControls (const aContainer: TWinControl): TControlsEnumerator;
Bei Verwendung des Enumerators erhält man in der Anwendung einen relativ lesbaren Quelltext:
Delphi-Quellcode:
procedure TDemoForm.TestButtonClick (Sender: TObject);
var
C: TControl;
begin
for C in ContainedControls(Panel1).withClass(TCheckBox) do
if TCheckBox(C).Checked then
Memo.Lines.Add (IntToStr(C.Tag));
for C in ContainedControls(Self).recursive.sortedByName do
Memo.Lines.Add (C.Name);
for C in ContainedControls(Panel1).withClass(TCheckBox).named('*box*') do
TCheckBox(C).Checked := not TCheckBox(C).Checked;
end;
Die angehängte
Unit verwendet die
VCL-
Unit Masks, welche bis einschließlich Delphi 2010
einige Fehler enthält. Zur Unterstützung von Stringvergleichen mit Wildcards gibt es aber auch in der
DP Alternativen.
Gruß Hawkeye