Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Viele Komponenten schneller in den Eigenschaften ändern (https://www.delphipraxis.net/84353-viele-komponenten-schneller-den-eigenschaften-aendern.html)

LingNeu 15. Jan 2007 20:43


Viele Komponenten schneller in den Eigenschaften ändern
 
Hallo Delphifreunde,
habe bereits die Boardsuche bemüht, aber nicht DIE Lösung für mich gefunden.
Folgendes:
Ich habe auf einer Form 64 Buttons und 64 Edits, die sich immer wieder in der Grösse und im Text ändern müssen.
Jetzt meine Frage als Newbie:
Kann man diese Komponenten irgendwie in einer Schleife verändern. Als ehemaliger Basic-Geschädigter :wall: weiß ich noch, das man das in Basic machen konnte. Da konnte man die Komponenten über einen Index ansprechen.
Gibt es hier auch eine Möglichkeit ?
Wäre für jeden Hinweis dankbar.

Pseudocode:
Delphi-Quellcode:
for i = 1 to 64 do
    begin
    button[i].caption := 'Neues Spiel';
    button[i].width := 120;
    edit[i].width := 60;
end;
Gruss LingNeu

[edit=SirThornberry]Delphi-Tags gesetzt - Mfg, SirThornberry[/edit]

_frank_ 15. Jan 2007 20:45

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
mann kann z.b. TControl.ControlCount+TControl.Controls verwenden...

Delphi-Quellcode:
for i:=0 to ControlCount-1 do
begin
  Controls[i].Width:=100;
  if (Controls[i] is TEdit) then
    (Controls[i] as TEdit).Text:='Blah';
end;
HTH Frank

Nils_13 15. Jan 2007 20:45

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
Beispiel:
Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
var i : Integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if Components[i] is TPanel then
      (Components[i] as TPanel).ParentBackground := False;
  end;
end;
EDIT: Das darf nicht wahr sein ! Schon wieder einer eher :mrgreen:

LingNeu 15. Jan 2007 21:15

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
Vielen Dank für diesen Tipp.
Leider hab ich dann das Problem, das andere Komponenten vom selben Typ auch verändert werden.
Schade, wäre echt eine Erleichterung gewesen.
Gruss LingNeu

Namenloser 15. Jan 2007 21:26

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
Du kannst diesen Komponenten ja einen bestimmten tag zuweisen, z.b. 1. das ginge dann so:
Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
var i : Integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if (Components[i] is TButton) and (tbutton(components[i].tag=1)) then
        TButton(Components[i]).caption := 'Klick mich';
  end;
end;
oder, wenn die Kompos alle einen Namen à la Button1 bis Button20 haben (was aber ein schlechter Stil wäre), könnte man es auch so machen:
Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
var i : Integer;
   btn: TComponent;
begin
  for i := 1 to 20 do
  begin
    btn := FindComponent('Button'+inttostr(i));
    if (btn <> nil) and (btn is TButton) then
      TButton(btn).caption := 'Klick mich';
  end;
end;

inherited 15. Jan 2007 21:46

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
Oder gleich die gesamten Button in ein Array packen

Delphi-Quellcode:
var Buttons: Array [1..64] of TButton

//Erzeugen
for i := 1 to 64 do
begin
  Buttons[i]:=TButton.Create(self);
  with Buttons[i] do
  begin
    Parent:=self;
    Left:=i*Width;
    Top:=0;
    Caption:='43?';
  end;
end;
//Caption ändern
for i := 1 to 64 do
  Buttons[i].Caption:='42!'
Allerdings nur ratsam wenn sich die Position leicht festlegen lässt

LingNeu 15. Jan 2007 21:54

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
Hallo Zusammen,
vielen Dank für Eure unermüdlichen Vorschläge. Habe alle durchprobiert. Die eine Lösung von NamenLozer gefällt mir sehr gut und funktioniert bis jetzt auch bestens. Habe nur noch eine Klammer machen müssen, sonst kommt ein Error.
Besten Dank nochmals an alle
LingNeu


Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
// Test mit 4 Buttons, 3 Edits, dabei sind Button1 bis Button3 mit tag=1 versehen
// Button4 hat tag= 0 und bleibt unberührt
var i: integer;
begin
  for i := 0 to ComponentCount - 1 do
  begin
    if ((Components[i] is TButton) and (components[i].tag=1)) then
        begin
        TButton(Components[i]).caption := 'Klick mich';
        end;
    if ((Components[i] is TEdit) and (Components[i].tag=1)) then
        begin
        TEdit(Components[i]).Width := 100;
        end;
end;
end;
@inherited
die Idee finde ich gut. Leider hab ich die Sachen an unterschiedlichsten Stellen usw. Daher ist es vielleicht doch etwas aufwändiger.
Trotzdem - merci!

_frank_ 15. Jan 2007 22:29

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
ich würde aber in dem Fall trotzdem auf ControlCount+Controls zurückgehen, da dies die Schleife verkürzt.
Alle sichtbaren Komponenten (Wie TButton, TEdit, etc.) sind Controls, so sparst du dir da sinnlose Durchläufe.

Gruß Frank

LingNeu 15. Jan 2007 22:40

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
@_frank_
danke für den Hinweis - das hab ich als Anfänger nicht gewusst.
Habe den Code nochmals abgeändert. Funktioniert auch prächtig.
Gruss
LingNeu

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var i: integer;
begin
  for i := 0 to ControlCount - 1 do
  begin
    if ((Controls[i] is TButton) and (Controls[i].tag=1)) then
        begin
        TButton(Controls[i]).caption := 'Klick mich';
        end;
    if ((Controls[i] is TEdit) and (Controls[i].tag=1)) then
        begin
        TEdit(Controls[i]).Width := 100;
        end;
end;
end;

TBx 15. Jan 2007 23:00

Re: Viele Komponenten schneller in den Eigenschaften ändern
 
Achtung Falle!

Zitat:

Zitat von _frank_
ich würde aber in dem Fall trotzdem auf ControlCount+Controls zurückgehen, da dies die Schleife verkürzt.
Alle sichtbaren Komponenten (Wie TButton, TEdit, etc.) sind Controls, so sparst du dir da sinnlose Durchläufe.

Hiermit werden nur die Controls der angegebenen Ebene durchlaufen. Liegt in der Ebene z. B. ein Panel und auf diesem weitere Controls, die verändert werden sollen, so werden diese nicht erreicht.
Delphi-Referenz durchsuchenTWinControl.Controls sagt dazu:

Zitat:

Controls ist ein Array mit allen untergeordneten Steuerelementen. Dies sind alle Steuerelemente, die dieses Steuerelement in ihrer Eigenschaft Parent angeben. Die Eigenschaft Controls kann genutzt werden, wenn über den Index und nicht über den Namen auf ein Steuerelement zugegriffen werden soll. Controls kann beispielsweise genutzt werden, um nacheinander auf alle untergeordneten Steuerelemente zuzugreifen.

Verwechseln Sie die Eigenschaft Controls nicht mit der Eigenschaft Components. Die Eigenschaft Controls listet alle Steuerelemente auf, die untergeordnete Steuerelemente dieses Steuerelements sind, während die Eigenschaft Components alle Komponenten aufführt, deren Eigentümer dieses Steuerelement ist. Das Formular ist Eigentümer aller auf ihm platzierten Komponenten, die deshalb in der Eigenschaft Components des Formulars aufgelistet werden, auch wenn es sich um die untergeordneten Fenster eines Steuerelements im Formular handelt.

Controls ist eine schreibgeschützte Eigenschaft. Verwenden Sie die Methoden InsertControl oder RemoveControl , um ein untergeordnetes Steuerelement hinzuzufügen oder zu entfernen. Soll ein untergeordnetes Steuerelement einer anderen übergeordneten Komponente ( Parent ) zugeordnet werden, weisen Sie der Eigenschaft Parent des Steuerelements einen neuen Wert zu. Dadurch wird die Methode RemoveControl der bisher übergeordneten Komponente und anschließend die Methode InsertControl der neuen übergeordneten Komponente aufgerufen
Gruß

onlinekater


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr.
Seite 1 von 2  1 2      

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