Image zur Laufzeit anlegen

Hallo zusammen,

ich möchte in einem Fenster zur Laufzeit ein Image platzieren und dies später auch als Reaktion auf ein Klicken auf dieses Image das Selbige verschieben. Ich weiß aber leider nicht wie ich das anstellen soll. Hier meine Probleme im Detail:

1.) Deklaration des TImage

Ursprünglich hatte ich vor das Image wie folgt anzulegen:

void LegeImageAn()
{
TImage* ImageName=New TImage;
//Positionierung usw. des Fensters
};

Problem : Erstens: Der Compiler gibt mir eine Fehlermeldung
Zweitens:smiley:er angelegte Zeiger ist lokal, d.h.nach Verlassen
der Funktion nicht mehr verfügbar

Ich habe mir überlegt, einen Vektor vom Variablentyp TImage anzulegen. Was haltet Ihr davon???

2.) ImageEreignisse

Alle anzulegenden Images haben die selben Ereignissfunktionen, d.h. wenn ich ein Image neu anlegen würde hätte dies ja zur Folge, dass es nicht die selben Ereignisse hat. Theoretisch müsste man also alle neu anzulegenden Images von einer gemeinsamen Basisklasse vererben.
Jedoch legt die Entwicklungsumebung ja lediglich eine Instanz von TImage innerhalb des Formulars an, d.h. das OnImageClick-Ereigniss ist nicht eine Memberfunktion einer Imageklasse, sondern die des entsprechenden Formulars.

Das Ganze soll mit BCB6 realisiert werden. Ich wäre sehr dankbar, wenn Ihr eure Lösungsmöglichkeit an einem Beispiel erläutern könntet, da die Fachsprach des ein oder anderen Profies für mich oft ein Mysterium darstellst:smile:

Danke im Voraus
Sebastian

Hallo,

schonmal vorweg: Ich hab keine Ahnung von den Borland Klassen.

1.) Deklaration des TImage

Ursprünglich hatte ich vor das Image wie folgt anzulegen:

void LegeImageAn()
{
TImage* ImageName=New TImage;
//Positionierung usw. des Fensters
};

Problem : Erstens: Der Compiler gibt mir eine Fehlermeldung

Hat auch auch recht, „new“ schreibt man klein :smile:

Zweitens:smiley:er angelegte Zeiger ist lokal, d.h.nach
Verlassen
der Funktion nicht mehr verfügbar

Das stimmt nicht, da die Variable mit „new“ erstellt wurde, bleibt sie auch bis zum „delete“ Aufruf im Speicher bestehen (auch NACH verlassen der Funktion!).

Ich habe mir überlegt, einen Vektor vom Variablentyp TImage
anzulegen. Was haltet Ihr davon???

Wofür?

2.) ImageEreignisse

Alle anzulegenden Images haben die selben Ereignissfunktionen,
d.h. wenn ich ein Image neu anlegen würde hätte dies ja zur
Folge, dass es nicht die selben Ereignisse hat. Theoretisch
müsste man also alle neu anzulegenden Images von einer
gemeinsamen Basisklasse vererben.
Jedoch legt die Entwicklungsumebung ja lediglich eine Instanz
von TImage innerhalb des Formulars an, d.h. das
OnImageClick-Ereigniss ist nicht eine Memberfunktion einer
Imageklasse, sondern die des entsprechenden Formulars.

Sorry, da komm ich nicht ganz mit. Ich denk mal es geht um das wie oben genannte Verschieben des Bildes. Borland wird die ja wohl irgendwie mitteilen, auf welchem Control dieses Event stattgefunden hat.

Das Ganze soll mit BCB6 realisiert werden. Ich wäre sehr
dankbar, wenn Ihr eure Lösungsmöglichkeit an einem Beispiel
erläutern könntet, da die Fachsprach des ein oder anderen
Profies für mich oft ein Mysterium darstellst:smile:

Viel Glück dabei, ich kenn nicht viele Leute, die Borland leiden können … :smile:

bye,
Christoph

Grundsätzlich danke,
aber:

  1. lediglich beim Schreiben des Artikels habe ich new groß geschrieben in meinem Quelltext habe ich es auch klein geschrieben, huubs…

2.)Der Speicher ist zwar reserviert, aber der Zeiger auf diesen Speicher ist nach dem Verlassen nicht mehr verfügbar (lokale Variable)

3.)Den Vektor wollte ich anlegen, da ich mehrere Images anlegen und positionieren will. Ich will quasi ein „CAD für Arme“ entwickeln und da es nur vier verschiedene Figuren dazustellen gilt, möchte ich das nicht mit Hilfe von Canvas usw. machen, da es mir zu aufwendig ist. Sorry, hab mich wohl schlecht ausgedrückt, wollte euch aber mit Details verschonen.

4.)Danke für die Glückwünsche, aber das trägt nicht zu meiner Motivation bei :smile:

MfG Sebastin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Sebastian,

erstmal vorweg: herzlichen Gw zum Entscheid, Borland zu benutzen. Ich kenn sehr viele Borlander, die hochzufriedn mit der ganzen Produktserie sind. Hab erst letzte Woche so knapp 400 Stück davon getroffen…

Hallo zusammen,

ich möchte in einem Fenster zur Laufzeit ein Image platzieren
und dies später auch als Reaktion auf ein Klicken auf dieses
Image das Selbige verschieben. Ich weiß aber leider nicht wie
ich das anstellen soll. Hier meine Probleme im Detail:

1.) Deklaration des TImage

Ursprünglich hatte ich vor das Image wie folgt anzulegen:

void LegeImageAn()
{
TImage* ImageName=New TImage;
//Positionierung usw. des Fensters
};

Problem : Erstens: Der Compiler gibt mir eine Fehlermeldung
Zweitens:smiley:er angelegte Zeiger ist lokal, d.h.nach
Verlassen
der Funktion nicht mehr verfügbar

Ich habe mir überlegt, einen Vektor vom Variablentyp TImage
anzulegen. Was haltet Ihr davon???

HS: Gut ! Wenn Du die Fkt LegeImageAn() zur Methode in der Form machst, und dann ImageName ebenfalls als Varaible der Form , hat diese neue Image Gülitigkeit in allen Methoden der Form. Also in der Header Datei der Form (zb. Form1.hpp), in der Klassendeklaration, im private Teil reinschreiben:

TImage\* ImageName;
void LegeImageAn();

Deine Funktion heisst dann

void TForm1::LegeIamgeAn() //wird zur Methode in Form1
{
 ImageName = new TImage(this);//der Konstruktor von TImage 
 //braucht this als Owner
}

2.) ImageEreignisse

Alle anzulegenden Images haben die selben Ereignissfunktionen,
d.h. wenn ich ein Image neu anlegen würde hätte dies ja zur
Folge, dass es nicht die selben Ereignisse hat. Theoretisch
müsste man also alle neu anzulegenden Images von einer
gemeinsamen Basisklasse vererben.
Jedoch legt die Entwicklungsumebung ja lediglich eine Instanz
von TImage innerhalb des Formulars an, d.h. das
OnImageClick-Ereigniss ist nicht eine Memberfunktion einer
Imageklasse, sondern die des entsprechenden Formulars.

HS:mmmhhhh. ich grübel noch, was du damit meinst. Entweder legst Du nur ein Image an, wie oben beschrieben. Dann kannst DU natürlich auch nur zu jedem Ereignis eine Funktion hinterlegen.
Wenns aber eine Art CAD werden soll, wirst Du wahrscheinlich mehrere Images gleichzeitig auf deinem Zeichenblatt haben wollen. Dann kannst Du natürlich jedem Image eine eigene Ereignisfunktion zuweisen, oder aber Du kannst in der Ereignisfunktion erkennen, welches Image gerade das Ereignis ausgelöst hat, und wendest die Funktion nur auf dieses an.
Beispiel:

  1. Du willst mit einem Click auf EIN Image die Farbe aller Images ändern - dann muss das OnClick Ereignis des geclickten Image alle anderen Images kennen
  2. Du willst per MouseDown-MouseMove-MouseUp ein einzelnes Image verschieben - Dann dürfen die 3 Funktionen der Ereignisse OnMouseDown,OnMouseMove,OnMouseUp nur auf das geclickte Iamge angewandt werden

Das Ganze soll mit BCB6 realisiert werden. Ich wäre sehr
dankbar, wenn Ihr eure Lösungsmöglichkeit an einem Beispiel
erläutern könntet, da die Fachsprach des ein oder anderen
Profies für mich oft ein Mysterium darstellst:smile:

HS: Wenn Du einverstaden bist, kann ich DIrs per email schicken. Gib Bescheid.

Danke im Voraus
Sebastian

Interessante Lösung, danke.Wäre cool, wenn du mir das mailen könntest ==> [email protected]
Hab mir mittlerweile auch was ausgedacht und es würd mich interessieren, was du davon hälst:

Ich lege einen Vektor als Membervariable des Formulars an. Dieser Vektor, speichert Zeiger auf TImageS. In meiner Anlegfunktion reserviere ich mit new Speicherplatz für ein TImage und richte einen Zeiger darauf.Das ganze müsste dann ungefär wie folgt aussehen:

void LegeImageAn()
{
Zeigervektor[index]=New TImage(this);
//Positionierung usw. des Fensters
};
Das Problem, mit new hast du mir ja gelöst (danke nochmal). Wegen der Ereignisfunktion habe ich auch was gefunden: www.marquardtnet.info/cecke/quickies.1/1_quicky_21.html

Das heißt, ich weise meinem neuem Fenster einfach eine definierte Funktion zu:

Zeigervektor[index]->OnClick=MeineOnClickfunktion

Durch den Vektor, kann ich meine Bildchen einigermaßen ordentlich handeln und alle machen das Selbe wenn ich drauf klicke. Hab es aus Zeitgründen leider noch nicht ausprobiert.

Gruß Sebastian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Du hast Post ! (owt)
Du hast Post ! (owt)

Gruss
Hans