Autor Beitrag
Ice
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114



BeitragVerfasst: Di 11.03.03 16:40 
Hallo Leute,

mit diesem Beispiel versuche ich alle Komponenten eines Typs die sich auf einer Form befinden in ein Array zu laden:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
 for k := 0 to ComponentCount-1 do
     begin
      Komp := components[k];
      if (Komp is TSecDev) then
        Temp[i] := Komp;
      end;


Temp ist ein array of TComponent und Komp vom Typ TComponent.
Wenn ich den Code ausgeführt habe ist Temp immernoch nur mit Nil gefüllt und es kommt eine Exception da Temp noch leer ist.
I ist eine andere Zählvariable die anderst erhöht wird als k.
Kann es daran liegen das die komponenten vom typ TSecDev erst zur Laufzeit erzeugt werden?
Allerdings sind sie zu diesem Zeitpunkt schon erzeugt...

Vielen dank im voraus!

mfg
Ice
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 11.03.03 16:54 
Wo legst Du denn die Größe von Temp fest?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 11.03.03 17:32 
Also eigentlich hab ich meine Erfahrungen mit TComponent, da ich mal ein Programmerstellt, daß alle seine Komponenten erst zu Laufzeit erstellt hat. Allerdings hab ich immer in der Schleife gearbeitet, z.B.:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  i: Integer;
  Comp: TComponent;
begin
  for i :=  0 to ComponentCount - 1 do begin
    Comp := Components[I];
    if (Comp is TEdit) then (Comp as TEdit).ReadOnly := not Enabled;
    if (Comp is TMemo) then (Comp as TMemo).ReadOnly := not Enabled;
  end;


Es gibt keine Probleme. Was könnte also hier das Problem sein?

Ich schätze, daß TComponent einfach nur ein Objekt ist und auch initialisiert sein muß, d.h. (aus dem Kopf)

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
for i := 0 to ComponentCount-1 do Temp[i] := TComponent.Create(Self);
try
  ... hier dein Code
finally
  for i := 0 to ComponentCount-1 do Temp[i].Free;
end;


Oder etwas in der Art, da bei dir I irgendwo berechnet wird.

_________________
Popov
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 11.03.03 18:00 
Zitat:
ch schätze, daß TComponent einfach nur ein Objekt ist und auch initialisiert sein muß
Ich dachte, mit temp wollte er alle Elemente auf der Form ansprechen. Dann reicht es doch, dort eine Referenz zu speichern, dazu muss doch das Objekt nicht erzeugt werden! Oder habe ich ihn falsch verstanden und er will von jedem Objekt eine komlette Kopie anfertigen?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 11.03.03 18:40 
Eine andere Sicht der Dinge

Ok, nehemen wir an, daß wir ein Edit haben:

ausblenden Quelltext
1:
Edit1					


Allerdings will er nicht auf Edit1 zugreifen, sondern

ausblenden Quelltext
1:
2:
3:
4:
var
  TempEdit: array[0..3] of TEdit;
begin
  TempEdit[0] := Edit1;


Also etwas fehlt hier, auch wenn es verkürzt ist.

_________________
Popov
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 11.03.03 19:16 
Irgendwie glaube ich, wir reden aneinander vorbei.

Der von Dir gepostete Code bedeutet, dass TempEdit[0] und Edit1 nun zwei Referenzen auf dasselbe Objekt sind.

Für den Fall, dass ich mich immer noch verständlich ausgedrückt habe: packe mal ein Edit-Feld und einen Button auf eine Form und verwende folgenden Code:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
VAR my_edit : TEdit;
begin
  my_edit:=edit1;
  ShowMessage(my_edit.Text);
  my_edit.Text:='geklickt';
end;

Das meine ich mit "my_edit und edit1 sind Referenzen auf dasselbe Objekt".


Wenn Du TempEdit[0] mit Create erstellst, dann hast Du ein neues Objekt.

Und ich bin mir nicht sicher, welches der beiden er haben will.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Tino
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 11.03.03 19:40 
Wo zählst Du denn die Variable I hoch? Also so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
for k := 0 to ComponentCount-1 do 
  begin 
    Komp := components[k]; 
    if Komp is TSecDev then 
      begin
        Temp [i] := Komp; 
        Inc (i);
      end;
  end;

Gruß
TINO
Ice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114



BeitragVerfasst: Mi 12.03.03 08:17 
@ all: Danke für die vielen schnellen Antworten!
@ tino :Das I wird in eienr anderen For Schleife hochgezählt:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 for i := 0 to 8 do
  begin
     str(DaempfungSD[i].Daempf,DaemSD);
     DaempfS := DaempfS + DaemSD;
     AusgabeForm.AusgabeMem.Lines.Add(DaempfS);
     Zeich := TZeichnen.Create(nil);
      for k := 0 to HausPlanBox.ComponentCount-1 do
        begin
          Komp := HausPlanBox.components[k];
           if  (Komp is TSecDev) then
              Temp[i] := Komp;
         end;
   end;


ungefähr so.

@Peter Lustig und Popov:
Ja Popov hat Recht ich möchte eine komplette Kopie anfertigen....

Vielen Dank nochmal an alle , werde jetzt eure Vorschläge erstmal ausprobieren.

mfg
Ice
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 12.03.03 12:00 
Okay.

1. Hat das Array temp auch die richtige Größe? Bei einem dynamischen Array musst Du die ja erst noch fetslegen.

2. Temp[i]:=Komp legt keine Kopie des Objektes an. Wie ich das oben schon beschrieben habe. Stattdessen musst Du, wie Popov schon sagte, das Objekt Temp[i] erst erzeugen.
Auch dann funktioniert eine einfache Zuweisung wie Temp[i]:=Komp nicht, sondern Du musst mit Assign arbeiten, um eine wirkliche Kopie zu erstellen. Allerdings habe ich das noch nie benutzt und als ich es gerade mit einem TEdit probiert habe, hat es nicht geklappt.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ice Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114



BeitragVerfasst: Mi 12.03.03 12:07 
Vielen Dank für die Antwort,

zu1. nein ist ein statisches Array da sich die Anzahl nicht verändert,

zu2. bei mir funktionierts leider auch noch nicht aber ich probiere noch ein bischen und gebe dann Bescheid wenn es klappt, trotzdem vielen Dank für die Antworten.

mfg
Ice