![]() |
Auf dynamisch erstelltes Objekt zugreifen?
Hallöchen,
ich habe ein kleines Programm, dass wärend der Laufzeit ein Bild erstellt:
Delphi-Quellcode:
Nun möchte ich gerne aus einer anderen Procedur auf das Image zugreifen:
VAR
myPic : TImage; BEGIN myPic := TImage.create(self); with myPic do BEGIN parent := Testbox; name := 'testbild'; Picture.LoadFromFile(filename) END; END;
Delphi-Quellcode:
So wie ich es gemacht habe, geht es natürlich nicht, weil der Compiler rummeckert, dass er testbild nicht kennt. Ist zwar auch logisch, aber trozdem hilft mir das nicht weiter...
PROCEDURE X;
BEGIN testbild.Picture.LoadFromFile(filename2); END; Wie kann ich auf das Objekt über seinen Namen zugreifen?! MFG Evian |
Re: Auf dynamisch erstelltes Objekt zugreifen?
Du musst deinen Pointer zu deinem Bild global definieren, und nicht MyPic nur innerhalb der einen Prozedur.
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
oder wenn du schon der Komponente einen Namen gibst dann kannst du es auch mit FindComponent wieder finden. Und anstelle einer Globalen Variablen empfiehlt sich eine im private Bereich. Die funktion X sollte dann natürlich auch als Methode des Objectes declariert werden (also im Private/Public/protected-Bereich)
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Also hier mal mein gesammter Code, wo ich das machen will:
(Sorry wegen dem Style.. musste schnell gehen);
Delphi-Quellcode:
In der Datei mb.src stehen in jeder Zeile ein Index dann ein ';' dann ein bildname(z.B. bild.gif)und dann wieder ein ';'. Im Ordner gfx befinden sich die Bilder, aber als jpg. Die Bilder sollen alle in der Testbox(Scrollbox) angezeigt werden. Quasie alles während der Laufzeit erstellte TImages, die geordnet (immer 2 Nebeneinander, x unter einander) angezeigt werden. Der Name der Objekte ist dann jeweils Bildname(ohne Endung)+'XX'+Index.
procedure TForm1.starter;
VAR myPic : TImage; i,bNr : INTEGER; filename, bName,s : STRING; begin filename := extractfilepath(application.ExeName)+'mb.src'; IF fileexists(filename)THEN BEGIN Listbox2.Items.LoadFromFile(filename); For i := 1 TO Listbox2.Count DO BEGIN s := Listbox2.Items[i-1]; bNr := strtoint(Copy(s,1,pos(';',s)-1)); delete(s,1,pos(';',s)); bName := Copy(s,1,pos('.',s)-1); myPic := TImage.create(self); with myPic do begin parent := Testbox; name := bName+'XX'+inttostr(bNr); OnClick := Image2Click; filename := extractfilepath(application.ExeName)+'\gfx\'+bName+'.jpg'; IF Fileexists(filename) THEN Picture.LoadFromFile(filename) ELSE showmessage('Kann Datei '+filename+'.jpg nicht finden - Programm wird beendet'); IF (i MOD 2) = 0 THEN BEGIN top := i * 26 - 50; left := 54 END ELSE BEGIN top := i * 26 - 24; left := 2; END; Stretch := TRUE; Height := 50; Width := 50; end; END; END ELSE BEGIN showmessage('Kann Datei mb.src nicht finden - Programm wird beendet'); END; END. Das funktioniert auch alles Wunderbar... Problem: Ich weiß quasi nicht wie viele Zeilen in der mb.src, deswegen muss das ganze halt halbwegs "dynamisch" abläuft. Und ich kann nicht einfach vorher X(Zeilenanzahl von mb.src) Images deklarieren, da ich ja nicht weiß, wie gro0 X ist. An einigen Stellen des Programms will ich aber direkt auf Eigenschaften einzelner Bilder zugreifen. (z.B. um den Index aus dem Namen aufzuschlüsseln, oder um das Bild was angezeigt wird, in ein einer Variabel abzulegen etc.) Nun hoffe ich, dass ich wärend der Laufzeit auf ein Objekt über seinen Namen zugreifen kann, dass der Compiler vor Programmstart noch gar nicht kennt. Das muss doch gehen. Evian PS: Warum dieser Blödsinn eigentlich?! Naja das ganze ist ein Mapeditor für ein Browsergame. In der Scrollbox wurden die Terrain-Arten angezeigt und dann konnte der BG-Entwickler sich quasi seine Karten einfach zusammenklicken und letztendlich als SQL-Anweisungen abspeichern. Funktionierte auch alles Super... nur kommt der Typ andauernd mit neuen Terrainarten und ich sollte das Programm anpassen. -KEIN BOCK MEHR! :) ...Also soll sich das Programm die Bilder aus einem eigenen Ordner(gfx) und Terraininformationen aus der mb.src ziehen. |
Re: Auf dynamisch erstelltes Objekt zugreifen?
jetzt hab ich mir die Finger wund getippt und da steht schon die Lösung...
FindComponent funktioniert supert!!!!!
Delphi-Quellcode:
VIELEN DANK, SirThornberry!!!!
result := (FindComponent('bergXX1') AS TImage).Picture;
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
FindComponent ist imho aber keine wirklich schöne Lösung :?
Delphi-Quellcode:
Somit hat jede Methode deines Formulars Zugriff auf "FMyPic", ohne erst performancelastig über FindComponent zu gehen.
type
TForm1 = class(TForm) private FMyPic: TImage; procedure DoWhat; procedure DoMore; . . end; implementation procedure TForm1.DoWhat; begin FMyPic := TImage.Create(self); end; procedure TForm1.DoMore; begin FMyPic.Picture.Bitmap.LoadFromFile('bla.bmp'); end; Gruss, Fabian \\edit: Falls du mehr als nur ein Image erzeugen willst, würde ich zu einer Liste von Images greifen ( ![]() |
Re: Auf dynamisch erstelltes Objekt zugreifen?
Oder man schreibt am besten Funktionen, die als Parameter ein TImage verlangen.
Delphi-Quellcode:
proceudre DoSomethingWithImage({const} CurrentImage:TImage);
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Aber bitte nicht als lose (Klassenlose) Prozeduren ;). Dann lieber eine Klasse die alle möglichen Methoden zum Bearbeiten von Images kapselt, und damit man sich das Instanzieren sparen kann als class function/procedure.
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
mh... auch wenn es mit "FindComponent" super funktioniert, ich lass mich ja gerne belehren.
Aber ich weiß jetzt nicht genau, wie ich mit myPic umgehen soll. Woher weiß denn myPic, dass ich das z.B. Objekt "bergXX1" meine? Und: Zitat:
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Zitat:
Ganz schick wäre eine Klasse als Container, und einer Array-Property mit String-Index (die OH hat da imho ganz gute Beispiele parat). Läuft zwar auch wieder auf eine Vergleichsschleife hinaus, ist aber dann recht hübsch zu bedienen. Zitat:
Wo: Ich würde dafür eine separate Unit anlegen. Gruss, Fabian |
Re: Auf dynamisch erstelltes Objekt zugreifen?
ich hab mir das ganze auch nochmal angeschaut und du erzeugst ja mehrere Bilder. Damit du später auch alle wieder freigeben kannst reicht also eine einfache Variable nicht sondern du benötigst eine Liste (TList)
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Ich stimme SirThornberry ganz zu, und sage noch, am besten eine neue Klasse von TList ableiten und die benötigte proceduren dort implementieren.
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Wenn schon Liste, warum keine TImageList?
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
@GuentherS: bei einer Imagelist sind alle Bilder gleich groß und so wie es anhand des bisher geposteten aussieht soll dies hier nicht der Fall sein.
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
aber dann doch wenigstens eine TObjectList, oder?
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Mit TStringlist hat man sogar den String-Index :mrgreen:
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Liste der Anhänge anzeigen (Anzahl: 1)
Mh.. hören sich alle toll an die Vorschläge, aber entweder bin ich zu doof, oder noch zu unwissent.
Die Listen(Welche auch immer) habe ich bis jetzt nur zum Aufbewaren von Informationen benutzt, aber ich brauche die Objekte und ihre Fahigkeiten ja auch auf dem Formular. siehe Screenshot Wie kann ich sie dem Formular zufügen, aber gleichzeitig in der Liste haben?! Vielleicht Raff ichs, wenn ich etwas Beispielcode sehe?! |
Re: Auf dynamisch erstelltes Objekt zugreifen?
Objekte sind Referenztypen, zwei Variablen (Formular / Liste) können also ohne Probleme auf ein Objekt (dyn. Array, Interface) zeigen.
Delphi-Quellcode:
with myPic do begin
//... end; liste.addObject(bname+'XX'+IntToStr(bNr),myPic); |
Re: Auf dynamisch erstelltes Objekt zugreifen?
Ach jetzt versteh ich erst was ihr meint ... quasi ne Liste von Zeigern. Die sich einfacher bediehnen lässt.
Ja gut wäre ne Überlegung Wert. |
Re: Auf dynamisch erstelltes Objekt zugreifen?
Mh... hier stellt sich aber jemand ziehmlich doof an *g*
![]() Die Exeption kommt genau in dem Moment, wenn ich das erste Bild in die Liste schreiben will... |
Re: Auf dynamisch erstelltes Objekt zugreifen?
Hi.
Hmmm... Hast du vielleicht die Image/Object/String/Irgendwas-Liste nicht richtig initialisiert? :gruebel: //edit: Zeig am besten mal ein bischen Code. |
Re: Auf dynamisch erstelltes Objekt zugreifen?
Sieht mir danach aus, als ob da ein TDeineList.Create fehlt :D
|
Re: Auf dynamisch erstelltes Objekt zugreifen?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz