AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

erzeugts IImage Löschen?

Ein Thema von smart · begonnen am 8. Apr 2007 · letzter Beitrag vom 9. Apr 2007
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von smart
smart

Registriert seit: 19. Dez 2004
Ort: Bochum
1.266 Beiträge
 
Delphi 2007 Professional
 
#11

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 09:42
Zitat von xaromz:
Das kann nicht funktionieren. Nachdem die Routine fertig ist, geht es ja zurück in den Code von TImage. Leider existiert das TImage aber jetzt nicht mehr. Also krachts.
Ja, Du hast Recht, dass hatte ich nicht bedacht. Wie würdest Du das lösen?

Gruß
Heike
Heike Kretschmann
Viele Grüße aus Bochum

kaum denkt man alles ist fertig, da fängt man wieder von Vorn an.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 09:54
Du könntest das Image im .onClick nur markieren bzw deren Index wegschreiben und dann aüßerhalb des Images freigeben.
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#13

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 10:01
Hallo,

die Freigabe einer visuellen Komponente im OnClick() ist für sich genommen kein Problem. Vielleicht liegt der Fehler an einer anderen Stelle?

Freundliche Grüße
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#14

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 11:10
Hallo,

Zitat von marabu:
die Freigabe einer visuellen Komponente im OnClick() ist für sich genommen kein Problem.
Grundsätzlich nicht. Aber schau mal, was passiert, wenn die Komponente in ihrem OnClick freigegeben wird:
Delphi-Quellcode:
procedure TControl.Click; (vereinfacht)
begin
  if Assigned(FOnClick) then
    FOnClick(Self); // OnClick aufrufen, Self wird freigegeben
  // Jetzt sind wir hier, in einem nicht mehr existirenden Objekt. Irgendwie blöd, oder?

end; // Zurück nach TControl.WMLButtonUp -> Upps, AV!
Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#15

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 12:01
Hallo Martin,

es wird nichts passieren, solange kein Zugriff auf Daten des freigegebenen Objektes erfolgt. Ziehe TImage-Komponenten auf eine Form und verwende diesen gemeinsamen event handler:

Delphi-Quellcode:
procedure TDemoForm.ImageClick(Sender: TObject);
begin
  with Sender as TComponent do
    Free;
end;
Es funktioniert, aber Borland (D7 VCL) warnt pauschal vor einer solchen Vorgehensweise.

Um auch einmal dieses wundervolle Wort zu verwenden: Grundsätzlich würde ich es ganz anders machen. Ich habe schon mit der von Markus erwähnten Vormerkung gearbeitet und im Event OnIdle() die Komponenten freigegeben, aber besser noch gefällt mir der Ansatz über eine eigene application message (PostMessage) und einen speziellen message handler.

Freundliche Grüße
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#16

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 12:31
Hallo,
Zitat von marabu:
es wird nichts passieren, solange kein Zugriff auf Daten des freigegebenen Objektes erfolgt.
Du hast Recht, solange Du keine weiteren Speicheroperationen durchführst. Die VCL greift dann nämlich immer auf Daten zu. Aber sie greift auf den bereits freigegebenen, aber immer noch mit den richtigen Werten gefüllten Speicher zu.

Versuche mal folgendes:
Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
var
  P: Pointer;
begin
  P := Pointer(Sender);
  TControl(Sender).Free;

  FillChar(P^, 4, 0); // Objektspeicher überschreiben
end;
Das ist jetzt zwar konstruiert, aber wenn zufälllig ein neues Objekt erzeugt wird, das den Speicher des zerstörten verwendet (moderne Speichermanager machen sowas gerne), dann hast Du ein Problem.

Zitat von marabu:
... aber besser noch gefällt mir der Ansatz über eine eigene application message (PostMessage) und einen speziellen message handler.
Genau so mache ich das auch immer. Ist meiner Ansicht nach das einzig saubere.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von smart
smart

Registriert seit: 19. Dez 2004
Ort: Bochum
1.266 Beiträge
 
Delphi 2007 Professional
 
#17

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 13:08
Hi xaromz!

Zitat von xaromz:
..Genau so mache ich das auch immer. Ist meiner Ansicht nach das einzig saubere.
So habe ich das noch nicht gemacht. Kannst Du mir bitte einmal einen Ansatz geben?

Gruß
Heike
Heike Kretschmann
Viele Grüße aus Bochum

kaum denkt man alles ist fertig, da fängt man wieder von Vorn an.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#18

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 13:15
Hallo Heike,

in diesem Beitrag findest du alles, was du benötigst. Dort wird zwar ein Button entfernt, aber das Prinzp ist das gleiche.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von smart
smart

Registriert seit: 19. Dez 2004
Ort: Bochum
1.266 Beiträge
 
Delphi 2007 Professional
 
#19

Re: erzeugts IImage Löschen?

  Alt 9. Apr 2007, 13:32
Zitat von Hawkeye219:
Hallo Heike,

in diesem Beitrag findest du alles, was du benötigst. Dort wird zwar ein Button entfernt, aber das Prinzp ist das gleiche.

Gruß Hawkeye
Danke, für den Hinweis!
Klappt wunderbar und vorallen ohne Fehler

Gruß
Heike
Heike Kretschmann
Viele Grüße aus Bochum

kaum denkt man alles ist fertig, da fängt man wieder von Vorn an.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 04:28 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