AGB  ·  Datenschutz  ·  Impressum  







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

TObjectList Object soll sich selbst löschen

Ein Thema von Culxxaw · begonnen am 19. Okt 2010 · letzter Beitrag vom 20. Okt 2010
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 18:00
Folgender Satz beschreibt dein Problem:
Zitat:
Säge nicht an dem Ast auf dem du gerade sitzt!
Das OnClick-Ereignis wird ja von der Button-Instanz selbst aufgerufen und genau diese Instanz schmeißt du aus dem Speicher. Der Rücksprung nach dem OnClick-Ereignis liegt aber nun noch in der Button-Instanz, und die gibt es nicht mehr. Darum der Zugriffsfehler

Das Free muss "außerhalb" erfolgen. Möchte man dieses Event-basiert haben, dann bleibt nur die Verwendung von Hier im Forum suchenPostMessage
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Culxxaw

Registriert seit: 21. Okt 2008
40 Beiträge
 
#2

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 18:14
Uffa,
also dass der Button die Objektliste nicht kennt und er sich nicht direkt selbst löschen kann erscheint mir einleuchtend.
Allerdings verstehe ich nicht so ganz, wie ich das "free" außerhalb platzieren soll. Reicht es denn, wenn ich z.b. TButton ableite und im Destructor den Button aus der Objektliste entferne? So z.b.:
Code:
destructor TMyButton.Destroy;
begin
  objektliste.DeleteItem(index);
  inherited;
end;
Denn eigentlich weiß der Button doch immer noch nicht, dass die Objektliste existiert...
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 18:40
Das Free muss "außerhalb" erfolgen. Möchte man dieses Event-basiert haben, dann bleibt nur die Verwendung von Hier im Forum suchenPostMessage
Hier ist noch etwas Sourcecode dazu.
Andreas
  Mit Zitat antworten Zitat
Culxxaw

Registriert seit: 21. Okt 2008
40 Beiträge
 
#4

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 18:47
Okay vielen Dank an alle! Habs mit Hilfe von Postmessage und dem Link von shmia gemacht und jetzt klappts wunderbar.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.535 Beiträge
 
Delphi 12 Athens
 
#5

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 19:47
Zitat:
Säge nicht an dem Ast auf dem du gerade sitzt!
Prinzipiell trifft das zu, aber

OnClick wird von Delphi-Referenz durchsuchenApplication, bzw. von der Message-Loop darin aufgerufen.
Nach dem Ausführen von OnClick wird nicht nochmal auf den Sender zugegriffen.

Darum "kann" man, in diesem Fall, den Sender auch löschen,
da man quasi auf einem anderem Ast sitzt.

Zitat:
Reicht es denn, wenn ich z.b. TButton ableite und im Destructor den Button aus der Objektliste entferne?
sollte reichen
Zitat:
Denn eigentlich weiß der Button doch immer noch nicht, dass die Objektliste existiert...
Darum mußt du ja dem Button diese Liste vorher mitteilen und er merkt sie sich bis dahin.

Oder es gibt nur eine "globale" Liste, wo er sich dann rauslöscht.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Okt 2010 um 19:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 20:51
Zitat:
Säge nicht an dem Ast auf dem du gerade sitzt!
Prinzipiell trifft das zu, aber

OnClick wird von Delphi-Referenz durchsuchenApplication, bzw. von der Message-Loop darin aufgerufen.
Nach dem Ausführen von OnClick wird nicht nochmal auf den Sender zugegriffen.

Darum "kann" man, in diesem Fall, den Sender auch löschen,
da man quasi auf einem anderem Ast sitzt.
Ich glaube du hast dann ein anderes Delphi als ich.
Bei mir sieht das so aus:

Zitat von Controls.pas:
Delphi-Quellcode:
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp); // Hier wird die Nachricht verarbeitet und Click aufgerufen

procedure TControl.Click; // und hier macht es klick
Irgendwie fehlt mir das Application da (gut das ist immer irgendwo) aber für mich erfolgt der Aufruf aus der Instanz vom Button aufgerufen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 21:12
Nachfolgendes Projekt macht bei mir keine Probleme.
Wichtig ist wohl nur, ob der Komponentencode nochmal auf "Self" zugreift.
Wenn nicht, gibt es keine Probleme.


Delphi-Quellcode:
unit fFreeTest;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    procedure ButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonClick(Sender: TObject);
begin
  FreeAndNil(Sender);
end;

end.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.535 Beiträge
 
Delphi 12 Athens
 
#8

AW: TObjectList Object soll sich selbst löschen

  Alt 19. Okt 2010, 22:16
Nachfolgendes Projekt macht bei mir keine Probleme.
Wenn nicht, gibt es keine Probleme.
Auch wenn FreeAndNil unnötig ist, da der Parameter Sender eh nicht wiederverwendet, bzw. nachfolgen genutzt wird. (.Free würde reichen, aber schlimm isses nicht)

Wichtig ist wohl nur, ob der Komponentencode nochmal auf "Self" zugreift.
Self ist in diesem Fall die Form.

PS: In Ereignisprozedur wie OnClose die Form freizugeben ist da schon schwerer.

Zitat:
Irgendwie fehlt mir das Application da (gut das ist immer irgendwo)
Application.Run; (siehe .dpr), bzw. genauer die TApplication.ProcessMessage behandelt die Window-Messages, und von dort aus wird letztendlich dein procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP; aufgerufen.




Wie gesagt, einen Button in seinem OnClick freizugeben ist kein Problem.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Okt 2010 um 22:25 Uhr)
  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 01:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz