Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Array of components
Ice - Di 11.03.03 17:40
Titel: Array of components
Hallo Leute,
mit diesem Beispiel versuche ich alle Komponenten eines Typs die sich auf einer Form befinden in ein Array zu laden:
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. - Di 11.03.03 17:54
Wo legst Du denn die Größe von Temp fest?
Popov - Di 11.03.03 18: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.:
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)
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.
Christian S. - Di 11.03.03 19: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?
Popov - Di 11.03.03 19:40
Eine andere Sicht der Dinge
Ok, nehemen wir an, daß wir ein Edit haben:
Allerdings will er nicht auf Edit1 zugreifen, sondern
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.
Christian S. - Di 11.03.03 20: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:
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
Tino - Di 11.03.03 20:40
Wo zählst Du denn die Variable I hoch? Also so:
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 - Mi 12.03.03 09:17
@ all: Danke für die vielen schnellen Antworten!
@ tino :Das I wird in eienr anderen For Schleife hochgezählt:
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. - Mi 12.03.03 13: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
Ice - Mi 12.03.03 13: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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!