AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Auf dynamisch erstelltes Objekt zugreifen?
Thema durchsuchen
Ansicht
Themen-Optionen

Auf dynamisch erstelltes Objekt zugreifen?

Ein Thema von Evian · begonnen am 31. Aug 2005 · letzter Beitrag vom 31. Aug 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#1

Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 14:51
Hallöchen,

ich habe ein kleines Programm, dass wärend der Laufzeit ein Bild erstellt:

Delphi-Quellcode:
VAR
   myPic : TImage;
BEGIN
  myPic := TImage.create(self);
  with myPic do
  BEGIN
    parent := Testbox;
    name := 'testbild';
    Picture.LoadFromFile(filename)
  END;
END;
Nun möchte ich gerne aus einer anderen Procedur auf das Image zugreifen:

Delphi-Quellcode:
PROCEDURE X;
BEGIN
  testbild.Picture.LoadFromFile(filename2);
END;
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...

Wie kann ich auf das Objekt über seinen Namen zugreifen?!


MFG

Evian
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 14:56
Du musst deinen Pointer zu deinem Bild global definieren, und nicht MyPic nur innerhalb der einen Prozedur.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:05
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#4

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:26
Also hier mal mein gesammter Code, wo ich das machen will:
(Sorry wegen dem Style.. musste schnell gehen);

Delphi-Quellcode:
  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.
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.

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.
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#5

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:30
jetzt hab ich mir die Finger wund getippt und da steht schon die Lösung...

FindComponent funktioniert supert!!!!!

result := (FindComponent('bergXX1') AS TImage).Picture; VIELEN DANK, SirThornberry!!!!
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:36
FindComponent ist imho aber keine wirklich schöne Lösung

Delphi-Quellcode:
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;
Somit hat jede Methode deines Formulars Zugriff auf "FMyPic", ohne erst performancelastig über FindComponent zu gehen.

Gruss,
Fabian

\\edit: Falls du mehr als nur ein Image erzeugen willst, würde ich zu einer Liste von Images greifen (Delphi-Referenz durchsuchenTList), oder wenn du genau weisst wie viele, dann eher noch zu einem Array of TImage.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 11. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:42
Oder man schreibt am besten Funktionen, die als Parameter ein TImage verlangen.proceudre DoSomethingWithImage({const} CurrentImage:TImage);
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:47
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Evian
Evian

Registriert seit: 10. Apr 2003
Ort: Berlin
485 Beiträge
 
Delphi 6 Professional
 
#9

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:47
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 von sniper_w:
Oder man schreibt am besten Funktionen, die als Parameter ein TImage verlangen.proceudre DoSomethingWithImage({const} CurrentImage:TImage);
Warum(und an welcher Stelle) soll ich das denn machen.
-> www.Phillsoft.de

Ich bin nun Mathematiker, aber meine Freundin bleibt trotzdem unberechenbar!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Auf dynamisch erstelltes Objekt zugreifen?

  Alt 31. Aug 2005, 15:53
Zitat von Evian:
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?
Eben das meinte ich oben mit meinem Edit. Bei mehreren Bildern solltest du auf Listen/Arrays von TImage (warum eigentlich nicht TBitmap?) gehen. Um dann aus diesen das richtige zu wählen, kannst du in einer Schleife die Name-Property vergleichen. Das ist dann ähnlich der Funktionsweise von FindComponent, aber imho immer noch weniger bremsend.
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 von Evian:
Warum(und an welcher Stelle) soll ich das denn machen.
Warum: Weil du dann die Funktionen komplett losgelöst zur Verfügung hast, sprich an jeder Stelle im Programm nutzen kannst. Spart u.U. Wiederholungen im Code.
Wo: Ich würde dafür eine separate Unit anlegen.

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz