AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TFrame zerstören bei userinteraktion :( access-violation!!
Thema durchsuchen
Ansicht
Themen-Optionen

TFrame zerstören bei userinteraktion :( access-violation!!

Ein Thema von mojo777 · begonnen am 10. Jun 2007 · letzter Beitrag vom 10. Jun 2007
Antwort Antwort
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#1

TFrame zerstören bei userinteraktion :( access-violation!!

  Alt 10. Jun 2007, 11:05
Hallo Forum!

Ich stehe momentan vor einem blöden Problem.
Und zwar erstelle ich ein Objekt aus einer KLasse, die von TFrame abgeleitet ist.
Die Parent Dazu ist dann ein TPanel.
Wenn jetzt z.b. der OK Knopf im TFrame gedrückt wird, soll das ParentPanel auf visible:=False
geschaltet werden UND das TFrame-Teil aus dem Speicher gelöscht werden.
Ich habe das so probiert:

Delphi-Quellcode:
procedure TfrKndEdit.btnCancelClick(Sender: TObject);
begin
//self.destroy;
Parent.Visible:=False;
FreeAndNil(self);
end;
Alles hilft nicht.

Oder Mit CallbackEvents klappts auch nicht:

Delphi-Quellcode:
ActionFrame:=TfrKndEdit.Create(nil);
initActionFrame;
(ActionFrame as TfrKndEdit).knd:=GLOBAL_AUFTRAGLISTE.Item.Kunde;
(ActionFrame as TfrKndEdit).init;
(ActionFrame as TfrKndEdit).CloseCallback:=KndFrameClose;
und dann
Delphi-Quellcode:
procedure TfmMain.KndFrameClose();
begin
(ActionFrame as TfrKndEdit).Destroy;
end;
wie schaffe ich das?
Ich überlege schon einen timer einzusetzen, aber das wäre jawohl VOLL DIRTY EY!

OK. Hoffe jemand mag mir helfen.

Viele Grüße
Muh macht die kUh
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#2

Re: TFrame zerstören bei userinteraktion :( access-violation

  Alt 10. Jun 2007, 15:33
du kannst ein objekt nicht aus einer zugehörigen Methode aus zerstören.
Das Objekt führt ja noch deine Anweisung aus , du ziehst der aktuellen Methode den Boden unter den Füßen weg.
Eine Möglichkeit auf einen Timer zu verzichten dürfte eine Message (Hier im Forum suchenPostmessage) sein. Diese schickst du an ein Form oder ähnliches außerhalb deiner zu zerstörenden Komponente und gibst die Komponente in der Behandlungsroutine frei.

HTH Frank
  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: TFrame zerstören bei userinteraktion :( access-violation

  Alt 10. Jun 2007, 15:54
wie frank schon erklärte geht das was du versuchst nicht. Das ist als wölltest du ein Haus sprengen und der Auslöser ist im Haus. Dadurch das, das Haus gesprengt ist kannst du nicht mehr aus dem Haus raus laufen. Weil der Weg aus dem Haus weg ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#4

Re: TFrame zerstören bei userinteraktion :( access-violation

  Alt 10. Jun 2007, 17:27
Hallo Frank, hallo Sir!
Also ich habe mir den Grund erklären können. Leider aber nicht lösen.

ok. zum Konstruktiven:
Zitat:
Diese schickst du an ein Form oder ähnliches außerhalb deiner zu zerstörenden Komponente und gibst die Komponente in der Behandlungsroutine frei.
Das habe ich nicht ganz verstanden. Also mit den Handles bin ich sowieso ein wenig auf dem Kriegsfuß.
Frank, könntest du mir zu deiner Idee vielleicht einen Link geben oder vielleicht ein bisschen näher erläutern? Vielleicht sogar mit einem kleinen Beispiel?

Danke!

Grüße
Muh macht die kUh
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#5

Re: TFrame zerstören bei userinteraktion :( access-violation

  Alt 10. Jun 2007, 18:42
hab hier mal nen Button genommen, ist aber vom Prinzip her gleich:

jetzt definieren wir erstmal eine eigene Message:
Delphi-Quellcode:
const
  WM_DestroyFrame=WM_USER+10;
nun fügen wir eine Behandlungsroutine in das Form ein

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMDestroyFrame(var msg:TMessage); message WM_DestroyFrame;
  public
    { Public-Deklarationen }
  end;

...
procedure TForm1.WMDestroyFrame(var msg:TMessage);
begin
  if msg.lParam>0 then
    TButton(msg.LParam).free; //hab hier mal in LParam den pointer auf die TButton-Instanz geschrieben
end;
und im Buttonclick schicken wir die Nachricht...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  postmessage(self.handle,WM_DestroyFrame,0,integer(Button1)); //Pointer auf TButton-Instanz als LParam weitergeben
end;
musst das eigentlich nur noch an deine Klasse anpassen

Gruß Frank
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: TFrame zerstören bei userinteraktion :( access-violation

  Alt 10. Jun 2007, 19:04
man sollte erwähen das diese Methode auch nicht sicher ist. Wenn eine Componente ein Ereignis auslöst, dann Applicaiton.ProcessMessages auslöst und dann erst aus der Behandlung raus geht knallts auch weil durch Applicaiton.ProcessMessages auch schon zu früh das Zerstören veranlasst wird.
Ebenfalls würde es knallen wenn man erst die Message schickt und danach in der Ereignisbehandlung selbst noch Applicaiton.ProcessMessages auslöst. Von daher ist das nicht die ultimative Lösung und man sollte dabei bleiben das sich eine Komponente einfach nicht selbst zerstört oder frei gibt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#7

Re: TFrame zerstören bei userinteraktion :( access-violation

  Alt 10. Jun 2007, 19:20
also application.processmessages nach dem postmessage aus der klasse heraus aufrufen wär natürlich fatal. aber sonst dürfte imho nichts passieren (nach dem Postmessage darf in der klasse/Objekt natürlich nix mehr gemacht werden).
aber einen timer halte ich für unsicherer

Gruß Frank
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:08 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