Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Eigenschaften einer entfernten Komponente ändern
cyberax - Mi 02.04.08 20:58
Titel: Eigenschaften einer entfernten Komponente ändern
hallo,
ich erstelle in einer Form während der Laufzeit Komponenten (Images). Ich bin schon so weit, dass diese selektiert und verschoben werden können. Wenn ich so ein erstelltes Image selektiere werden in einer anderen Form dessen Koordinaten angezeigt. Wie kann ich nun von dem zweiten Form aus, die Eigenschaften einer während der Laufzeit erstellten Kompo ändern?
Ich hatte schon einiges wie
Delphi-Quelltext
1:
| bild_fenster.Image1.FindComponent(edit7.Text) as timage).left:=0; |
probiert, aber das bringt immer nur Fehlermeldungen. Edit7 befindet sich auf dem zweiten form und hat den name der selektierten Komponente als Text.
So werden die Komponenten bei mir erzeugt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| if maus then begin felder:=felder+1; feld:=Timage.create(image1); feld.Parent:= bild_fenster; feld.Name:='test_'+inttostr(felder); feld.Hint:=feld.Name; feld.Left:=xv;feld.Top:=yv; feld.Width:=xb-xv;feld.Height:=yb-yv; feld.Picture.loadfromfile(extractfilepath(paramstr(0))+'rahmen.bmp'); feld.center:=true; feld.Stretch:=true; feld.Transparent:=true; feld.Cursor:=crHandPoint; feld.OnMousemove:=Image2.OnMousemove; feld.OnMousedown:=Image2.OnMousedown; feld.OnMouseup:=Image2.OnMouseup; maus:=false; end; |
und wenn eines davon selektiert wird :
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| daten.edit1.Text:=inttostr((Sender as timage).left); daten.edit2.Text:=inttostr((Sender as timage).top); daten.edit3.Text:=inttostr((Sender as timage).left+((Sender as timage).width)); daten.edit4.Text:=inttostr(((Sender as timage).top)+((Sender as timage).height)); daten.edit7.text:=TComponent(Sender as timage).Name; daten.edit5.Text:=(Sender as timage).hint; |
werden die Infos an das zweite form ("daten") übermittelt.
Ich hoffe ihr versteht, was ich will....
Mfg cyberax
Hidden - Mi 02.04.08 22:03
Hi,
Wenn du die Komponenten in einem Array of TComponent anlegst, kannst du bei Form2 "Form1" im implementation-Teil unter den Uses angeben.
Ansonsten beschreib mal die Fehlermeldungen genauer(aber das bringt immer nur Fehlermeldungen.), "Geht nicht" ist keine Fehlerbeschriebung!
mfG,
cyberax - Do 03.04.08 18:56
Hätte dir gern eine genauere Fehlermeldung gegeben, aber die die ich bekomme ist wenig aussagend (Zumindest für mich):
"Im Projekt xyz ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00438CC8 im Modul 'xyz.exe'. Lesen von Adresse 00000048'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen."
Wegen dem Einbinden der Unit -> wenn ich richtig verstehe, was du meinst, dann habe ich das (Einbinden der Unit unter uses ....) natürlich schon gemacht. Ich weiß nur nicht, wie ich auf eine Komponente zugreife, die ich während der Laufzeit erstellt habe und die sich in einem anderen Fenster befindet.
Mfg
Hidden - Do 03.04.08 19:00
Hi,
was ich meine ist:
Delphi-Quelltext
1: 2:
| implementation uses Unit1; |
Zum deinem Problem: Wie speicherst du die Komponenten denn ab? in einem Array of TComponent oder wie?
mfG,
cyberax - Do 03.04.08 19:05
ja, so habe ich sie auch eingebunden.
| Zitat: |
Wie speicherst du die Komponenten denn ab? |
??
Wie oben beschrieben erzeuge ich sie nur und mehr mache ich nicht. Wie müsste ich die denn speichern? Sie bekommen doch von mir einen festen Namen und weitere Eigenschaften...
Hidden - Do 03.04.08 19:12
Okay, du nutzt also die Freigabe von Form1 und verzichtest auf Objektvariablen. Spontan würde mir da TStringlist einfallen, du kannst auch Objekte abspeichern. über diese StringList kannst du dann darauf zugreifen(habe ich selber noch nie gemacht).
Edit: Der Vorteil gegenüber Objektvariablen wäre vor allem, dass du die Objekte praktisch direkt über den Namen, den du ihnen gegeben hast, ansprechen kannst.
mfG,
cyberax - Do 03.04.08 19:20
Aha. Hättest du da evtl. ein kleines Beispiel? Kann mir das grad nicht vorstellen??
Wie speichere ich ein neues Objekt in dieser Stringlist und wie greife ich darauf zu?
Wäre echt nett. Danke schonmal!!!
cyberax - Do 03.04.08 19:27
Okay, mit dem Speichern in der Liste, dass habe ich soweit - denke ich mal.
Delphi-Quelltext
1:
| liste.AddObject('test_'+inttostr(felder),feld); |
Aber wie frage ich das dann ab??
Wenn ich zum Beispiel test_1 in der Liste habe und nun
setzen will ...??
Hidden - Do 03.04.08 19:43
Hi,
schau dir mal die Eigenschaft Objects von TStringlist an. Wenn du sie über den Namen ansprechen willst, brauchst du zusätzlich noch Find, glaube ich. Aber das willst du ja scheinbar nicht, da du sie Feld_i nennst, da kannst du direkt über den Index gehen.
mfG,
cyberax - Do 03.04.08 20:44
okay, vielen Dank. Nun hab ich's.
So...
Delphi-Quelltext
1:
| (FindComponent(variable_name) as timage).hint:=der_neue_link; |
kann man die Eigenschaften (in diesem Fall hint) einfach ändern. Vermutlich hatte ich in meinem Wirrwar
:oops: paar Fehler drinn. Nun funktionierts.
Vielen Dank für die Unterstützung!!
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!