Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#17

AW: Komponenten auf dem Panel durchlaufen???

  Alt 13. Sep 2010, 12:07
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
Angehängte Dateien
Dateityp: pas ControlsEnumerator.pas (3,6 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat