AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Komponente über Variable ansprechen

Komponente über Variable ansprechen

Ein Thema von derseitzer · begonnen am 16. Nov 2017 · letzter Beitrag vom 16. Nov 2017
Antwort Antwort
derseitzer

Registriert seit: 12. Okt 2016
235 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Komponente über Variable ansprechen

  Alt 16. Nov 2017, 08:30
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 geht das irgendwie?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 08:35
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 08:48
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.

TComponent().FindComponent und .Components ... nach Owner-Beziehung
TControl().FindControl und .Controls ... nach Parent-Beziehung
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
derseitzer

Registriert seit: 12. Okt 2016
235 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 08:49
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

Geändert von derseitzer (16. Nov 2017 um 08:51 Uhr)
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.172 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 08:53
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 08:59
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);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
derseitzer

Registriert seit: 12. Okt 2016
235 Beiträge
 
Delphi 10 Seattle Professional
 
#7

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 09:23
Vielen Dank! Sehr interessante Antworten die werde ich mir auf jedenfall merken
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 13:08
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.

Geändert von LTE5 (16. Nov 2017 um 13:14 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 13:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Komponente über Variable ansprechen

  Alt 16. Nov 2017, 14:01
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:37 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