Autor Beitrag
friesi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP SP2
VS 2005
BeitragVerfasst: Mi 06.04.05 16:53 
Ich versuchen die Position einer Komponenten zu bestimmen.

Kann ich ja eigentlich mit dem Namen der Komponente (Bsp.: wert := inttostr(Button1.left);).

Da ich aber nun die Componenten mit


ausblenden Delphi-Quelltext
1:
2:
3:
4:
for i := 0 to ComponentCount-1 do
begin
 temp[i] := Components[i].Name;
end;


auslese, kann ich hinterher nicht mit wert := inttostr(temp[i].left); arbeiten.

Derzeit ist temp vom typ array of string woran glaube ich der Fehler liegt.
Aber mit array of TComponent gehts leider auch nicht :/

Ich könnte es aber auch mit:

ausblenden Delphi-Quelltext
1:
wert := (Components[i] as TButton).left;					


machen. Nur weis ich ja nicht ob es ein TButton ist oder TEdit. Es könnte ja auch eine Komponente sein die ich vorher noch garnicht weis.

Kann mir jemand vielleicht auf die Sprünge helfen?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 06.04.05 17:00 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Type
  DeinRecord = Record
    Komponente : String;
    Position : Integer;
  end;

var
  DeinArray : Array of DeinRecord;


Ich glaube der Rest ist klar, oder?
friesi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP SP2
VS 2005
BeitragVerfasst: Mi 06.04.05 18:05 
user profile iconjasocul hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Type
  DeinRecord = Record
    Komponente : String;
    Position : Integer;
  end;

var
  DeinArray : Array of DeinRecord;


Ich glaube der Rest ist klar, oder?


Ne leider noch nicht so ganz.
Das Problem mit dem auslesen des Positionswertes besteht doch weiterhin.
Wie ich ihn auslese ist ja klar, aber eben nur wenn ich weis wenn es ein TEdit ist oder ein TButton.
Wenn ich das aber nun Dynamisch mache möchte, müsste ich ja dieses hier machen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
for i := 0 to ComponentCount-1 do
begin
 wert := (Components[i] as DeinArray[i].Komponente).left;
end;

Was aber ja nicht geht :(
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 06.04.05 18:45 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for i := 0 to ComponentCount-1 do
begin
  if Components[i] is TEdit then begin
    DeinArray[i].Position := TEdit(Components[i]).Left; 
    DeinArray[i].Komponente:= TEdit(Components[i]).Name; 
  end;
end;

Entsprechend für TButton, etc.
Dann ist dein Array gleich richtig gefüllt.
friesi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP SP2
VS 2005
BeitragVerfasst: Mi 06.04.05 18:50 
Ok klasse :D
Soweit verstehe ich das auch.

Aber. Wie ich ja schon gesagt habe, möchte ich es ja dynamisch.
Wenn ich nun also eine Spinbutton habe oder eine combobox soll die ja auch erkannt werden.

Zum Hintergrund:
Ich habe eine Komponente Entwickelt die auf einem Formular alle Komponenten zählt (egal welche auf dem Form sind) und diese in einem StringGrid ausgibt.
Das funktioniert auch alles super.
Nun möchte ich noch für jede Komponente die Position anzeigen lassen.

Da es eine Komponente ist und ich nicht weis welche Komponenten der Anwender (Programmierer) auf seinem Form verwenden möchte, kann ich schlecht alle Delphi Komponenten überprüfen lassen.

Daher will ich mit mit Components[i].Name und Components[i].Classname arbeiten :)

Hoffe nun wird es klarer :)

Trotzdem vielen vielen Dank :)
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 06.04.05 18:57 
Auf die schnelle wurde ich mit einem Try..Except arbeiten. Wenn die Komponente keine Position hat, wird die Exception ausgelöst und du kannst bei Position einen (un)passenden Wert eingeben (z.B. -1).
Den Record kannst du auch noch erweitern, so dass du den ClassName unterbringen kannst.
friesi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 44

Windows XP SP2
VS 2005
BeitragVerfasst: Mi 06.04.05 20:52 
Also ich habe es nun mal so versucht:

ausblenden Delphi-Quelltext
1:
StringGrid2.Cells[1,m] :=  inttostr(Components[i].Classname(Components[i].Name).Left);					

Doch kommt dann dieser Fehler:

ausblenden Quelltext
1:
2:
[Error] Unit1.pas(83): E2034 Too many actual parameters
[Error] Unit1.pas(83): E2018 Record, object or class type required



Edit: 07.04.2005 00:55
Habs gelöst!
So gehts nun:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
m:=1;
for i := 0 to ComponentCount -1 do
   if (Components[i] is TControl) then
   begin
        StringGrid2.RowCount := (m+1);
        StringGrid2.Cells[0,m]:=Components[i].Name;
        StringGrid2.Cells[1,m] :=  inttostr((Components[i] as TControl).Left);
        StringGrid2.Cells[2,m] :=  inttostr((Components[i] as TControl).Top);
        StringGrid2.Cells[3,m] :=  inttostr((Components[i] as TControl).width);
        StringGrid2.Cells[4,m] :=  inttostr((Components[i] as TControl).Height);
        inc(m);
   end;