Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Komponente über Variable ansprechen (https://www.delphipraxis.net/194401-komponente-ueber-variable-ansprechen.html)

derseitzer 16. Nov 2017 07:30

Komponente über Variable ansprechen
 
Hallo Leute,

Ich wollte schon länger mal etwas fragen, da ich um das Problem immer drumherum programmiert habe, hat es mich nie so wirklich gestört.. rein aus Interesse frage ich jetzt mal:

Angenommen ich habe 1000 Shapes auf meiner Visualisierung und ich möchte alle z.B. visible:=False setzen. Wie würde ich das am leichtesten machen?
Meine Shapes würden vom Name her z.B. E1,E2,E3,...,E1000 heißen.
Normal:
E1.visible:=False;
E2.visible:=False;
.
.
Falsch wäre: Schelife mit i hochzählen und: Ei.visible:=False.. aber so hätte ich es gerne:D geht das irgendwie?

DeddyH 16. Nov 2017 07:35

AW: Komponente über Variable ansprechen
 
Die einfachste Möglichkeit: Delphi-Referenz durchsuchenFindComponent benutzen. Oder aber die entsprechenden Komponenten in einer TComponentList oder TObjectList ablegen und dann über diese iterieren, dann kann man sie auch ordentlich benennen, hat aber auch etwas mehr Schreibarbeit.

himitsu 16. Nov 2017 07:48

AW: Komponente über Variable ansprechen
 
Zitat:

1000 Komponenten ....
Die hast du doch hoffentlich nicht alle im Formdesigner auf die Form gepappt?

Während sie also zur Laufzeit erstellt werden, werden ihre Referenzen also auch gleich passend in irgendwas abgespeichert und schon mußt du sie nicht mehr suchen. :zwinker:

TComponent().FindComponent und .Components ... nach Owner-Beziehung
TControl().FindControl und .Controls ... nach Parent-Beziehung

derseitzer 16. Nov 2017 07:49

AW: Komponente über Variable ansprechen
 
Dankeschön! :)
Ja das mit den 1000 Komponenten war nur ein Beispiel, aber ich rede schon von sich auf der Form befindlichen Komponenten. "FindComponent" ist das was ich gesucht habe :)

TigerLilly 16. Nov 2017 07:53

AW: Komponente über Variable ansprechen
 
Wenn deine Shapes einen gemeinsamen Parent haben, kannst du den auf Visible=False setzen.

Du kannst auch über die Components iterieren (TComponent.Components) und deren Namen (TComponent.Name) abfragen. Du kannst auch abfragen, ob es TShapes (Component is TShape) sind.

HTH

Uwe Raabe 16. Nov 2017 07:59

AW: Komponente über Variable ansprechen
 
Für sowas habe ich mir mal folgende Routine geschrieben:
Delphi-Quellcode:
class procedure TUtilities.ForAllComponentsOf<T>(Container: TComponent; DoProc: TProc<T>);
var
  cmp: TComponent;
begin
  for cmp in Container do
    if cmp is T then
      DoProc(T(cmp));
end;

Das würde man in deinem Fall (angenommen, es gibt keine anderen Shapes) innerhalb des Forms dann in etwa so benutzen:
Delphi-Quellcode:
  TUtilities.ForAllComponentsOf<TShape>(Self,
    procedure(Arg: TShape)
    begin
      Arg.Visible := False;
    end);

derseitzer 16. Nov 2017 08:23

AW: Komponente über Variable ansprechen
 
Vielen Dank! Sehr interessante Antworten die werde ich mir auf jedenfall merken :-D

LTE5 16. Nov 2017 12:08

AW: Komponente über Variable ansprechen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1386380)
Für sowas habe ich mir mal folgende Routine geschrieben:
Delphi-Quellcode:
class procedure TUtilities.ForAllComponentsOf<T>(Container: TComponent; DoProc: TProc<T>);
var
  cmp: TComponent;
begin
  for cmp in Container do
    if cmp is T then
      DoProc(T(cmp));
end;

Das würde man in deinem Fall (angenommen, es gibt keine anderen Shapes) innerhalb des Forms dann in etwa so benutzen:
Delphi-Quellcode:
  TUtilities.ForAllComponentsOf<TShape>(Self,
    procedure(Arg: TShape)
    begin
      Arg.Visible := False;
    end);

Welche Units müssen denn in die uses-Klausel? Wäre für den Themenersteller (und andere) vielleicht hilfreich.

TiGü 16. Nov 2017 12:23

AW: Komponente über Variable ansprechen
 
Zitat:

Zitat von LTE5 (Beitrag 1386401)
Zitat:

Zitat von Uwe Raabe (Beitrag 1386380)
Für sowas habe ich mir mal folgende Routine geschrieben:
Delphi-Quellcode:
class procedure TUtilities.ForAllComponentsOf<T>(Container: TComponent; DoProc: TProc<T>);
var
  cmp: TComponent;
begin
  for cmp in Container do
    if cmp is T then
      DoProc(T(cmp));
end;

Das würde man in deinem Fall (angenommen, es gibt keine anderen Shapes) innerhalb des Forms dann in etwa so benutzen:
Delphi-Quellcode:
  TUtilities.ForAllComponentsOf<TShape>(Self,
    procedure(Arg: TShape)
    begin
      Arg.Visible := False;
    end);

Welche Units müssen denn in die uses-Klausel? Wäre für den Themenersteller (und andere) vielleicht hilfreich.

Versuchs doch mal mit System.SysUtils. Da ist TProc<T> definiert.

Uwe Raabe 16. Nov 2017 13:01

AW: Komponente über Variable ansprechen
 
Zitat:

Zitat von TiGü (Beitrag 1386404)
Zitat:

Zitat von LTE5 (Beitrag 1386401)
Welche Units müssen denn in die uses-Klausel? Wäre für den Themenersteller (und andere) vielleicht hilfreich.

Versuchs doch mal mit System.SysUtils. Da ist TProc<T> definiert.

Korrekt!

Ergänzend dazu: Die Routine ist hier Bestandteil einer TUtilities-Klasse, aber das kann ja auch in jede anderen Hilfsklasse kommen. Sowas hat doch jeder irgendwo rumliegen, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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