Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TImage-Instanz wieder freigeben (https://www.delphipraxis.net/41225-timage-instanz-wieder-freigeben.html)

ThorZten 28. Feb 2005 02:34


TImage-Instanz wieder freigeben
 
Hallo, ich möchte folgendes realisieren:

Ich erzeuge ein Image und möchte dieses entweder durch darauf klicken oder durch Fokuswechsel wieder freigeben.

Mein bisheriger Quellcode:
Delphi-Quellcode:
var myimage:TImage;
...

procedure TForm1.myclick(Sender: TObject);
begin
  myimage.Free;
  myimage.Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  myimage:=Timage.create(nil);
  With myimage Do
  Begin
    parent := Form1;
    autosize:=true;
    OnClick:=myclick;
    myimage.Picture.LoadFromFile('C:\bild.jpg');
  End;
end;
Sobald ich nun aber auf das erzeugte Bild klicke und meine Procedure "myclick" aufgerufen wird, erhalte ich den Fehler "Abstract Error". Was mache ich falsch? Wenn ich nämlich einen zweiten Button einfüge, der das gleiche tut funktioniert dies ohne Probleme. So möchte ich es aber eben nicht haben:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  myimage.Free;
  myimage.Destroy;
end;
Und zur anderen Sache: Gibt es dann noch eine Möglichkeit, wenn ich den Focus von meinem Bild entferne, dieses dann ebenfalls freizugeben? Ein "OnFocusChange" o.ä. finde ich nicht...

Vielen Dank schon einmal,
Thorsten

Pseudemys Nelsoni 28. Feb 2005 05:25

Re: TImage-Instanz wieder freigeben
 
versuchs mal ohne:

Delphi-Quellcode:
myimage.Destroy;

ThorZten 28. Feb 2005 08:43

Re: TImage-Instanz wieder freigeben
 
Das habe ich schon versucht. Selbst wenn ich es ohne
Delphi-Quellcode:
myimage.Free;
versuche, führt das zum gleichen Fehler.
Liegt es vielleicht daran, dass man eine Instanz nicht freigeben kann, während man eine ihrer Methoden ausführt? Andererseits macht man so etwas doch ständig, oder nicht? Hm...

alcaeus 28. Feb 2005 08:48

Re: TImage-Instanz wieder freigeben
 
Zitat:

Zitat von ThorZten
Liegt es vielleicht daran, dass man eine Instanz nicht freigeben kann, während man eine ihrer Methoden ausführt?

Du sagst es ;)


Zitat:

Zitat von ThorZten
Andererseits macht man so etwas doch ständig, oder nicht? Hm...

:shock: Also ich hab noch nie ein Image in einem OnClick-Handler freigegeben :gruebel:

Lösung des problems: Timer aufs Form, Interval auf 500 und im OnClick aufs Image den Timer enablen. Im OnTimer-Event dann einfach das Image freigeben, fertig. (Bitte nicht vergessen, beim Timer Enabled auf False zu setzen, sobald du ihn aufs Form ziehst, sonst knallts etwas früher ;))

Greetz
alcaeus

teebee 28. Feb 2005 08:54

Re: TImage-Instanz wieder freigeben
 
Ich finde es eleganter, im OnClick des Images eine Userdefined Message an das Formular zu schicken, das darauf reagiert und das Image freigibt. Ein Timer in diesem Zusammenhang gefällt mir nicht so.

Gruß, teebee

EDIT: Ganz wichtig: PostMessage verwenden!

ThorZten 28. Feb 2005 10:32

Re: TImage-Instanz wieder freigeben
 
Könntest Du oder jemand anders mir verraten, wie dieser Befehl richtig aussehen müsste?

Delphi-Quellcode:
PostMessage(Handle, WM_CLOSE, 0, 0);   // diese Richtung etwa ?
Wenn ich das aufrufe, dann wird natürlich das Form geschlossen... Und ist "WM_Close" überhaupt richtig, um eine Instanz freizugeben?

shmia 28. Feb 2005 10:52

Re: TImage-Instanz wieder freigeben
 
Lies mal:
http://www.delphipraxis.net/internal...ct.php?t=29732
Dort wird erklärt, wie man Controls zur Laufzeit löschen kann. (mit windows Messages, wie von teebee angedeutet)

PS: wäre es nicht geschickter das Image bestehen zu lassen und nur den Bildinhalt zu löschen???
Image1.Picture := nil;

ThorZten 28. Feb 2005 23:42

Re: TImage-Instanz wieder freigeben
 
Alles klar. Werde ich mir mal zu Gemühte ziehen.

Die Idee mit "Image1.Picture := nil;" ist natürlich auch nett. So wird ebenfalls Speicherplatz freigegeben, die Instanz selbst existiert noch und muss nicht wieder erzeugt werden, sondern kann sofort wieder genutzt werden. Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 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