![]() |
Re: Abstrakter Fehler
Zitat:
Du kannst die meisten Antworten hier getrost als "Im Trüben fischen" abtun. ;) Ab du nun Release, Free oder "Frag's Pferd was auch immer" aufrufst ist doch total Bohne. Du verwendest eine Instanz einer abstrakten Klasse. Und beim Ausführen einer nicht überschriebenen Methode knallt es eben. (Was vom Autor der Klasse sicher auch so gewollt ist ;) ) Da du immer noch nicht den Inhalt deines OnClose Handlers gezeigt hast würde ich auch im Trüben fischen. Deshalb gibt's von mir nur eine Fehlerbeschreibung. Rücke etwas Code raus und man kann dir sicher helfen. ;) |
Re: Abstrakter Fehler
So.. mal die gesamte Form wo es "knallt"
Delphi-Quellcode:
unit neues_produkt_unit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ComCtrls, jpeg, JvGIF, ExtCtrls; type Tneues_produkt_form = class(TForm) Image1: TImage; Image3: TImage; Label1: TLabel; Label2: TLabel; Label23: TLabel; Image2: TImage; Image4: TImage; Label8: TLabel; Label7: TLabel; Image7: TImage; Image8: TImage; StatusBar1: TStatusBar; BitBtn1: TBitBtn; Edit1: TEdit; Edit2: TEdit; Label3: TLabel; Edit3: TEdit; Button1: TButton; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var neues_produkt_form: Tneues_produkt_form; implementation {$R *.dfm} procedure Tneues_produkt_form.FormClose(Sender: TObject; var Action: TCloseAction); begin self.free; end; procedure Tneues_produkt_form.Button1Click(Sender: TObject); begin self.close; end; end. Beim Klick auf Button1 knallt es dann mit der oben gennanten Fehlermeldung. |
Re: Abstrakter Fehler
Hi,
Das führt zwangsweise zu einem Abstraktem Fehler:
Delphi-Quellcode:
Besser ist dann das:
procedure Tneues_produkt_form.FormClose(Sender: TObject;
var Action: TCloseAction); begin self.free; end;
Delphi-Quellcode:
Dann kannst Du auch Self.Close(); weglassen.
procedure Tneues_produkt_form.FormClose(Sender: TObject;
var Action: TCloseAction); begin Action := caFree; end; mfG mirage228 |
Re: Abstrakter Fehler
Hey, das klappt ja echt prima... aber warum führt "self.free" zwangsweise zu einem abstrakten Fehler ?!?
Danke noch mal!!!! Gruß martin |
Re: Abstrakter Fehler
Das hättest Du früher haben können...
Warum ausgerechnet ein abstrakter Fehler auftritt weiss ich nicht (vielleicht hat ja jemand eine schlüssige Erklärung), aber prinzipiell ist es falsch, eine Komponente in einem eigenen Eventhandler freizugeben, damit zieht sie sich quasi selbst den Boden unter den Füßen weg. Deshalb der Umweg über caFree in OnClose. In einem OnClick einer Form würdest Du Release aufrufen. Gruß, teebee |
Re: Abstrakter Fehler
Ok, dann trotzdem noch mal danke für alle Antworten *freu*
Gruß |
Re: Abstrakter Fehler
Zitat:
So geht das:
Delphi-Quellcode:
Oder umgegehert.
var
[b] Form1: TForm1; [/b] [b] Form2: TForm1; [/b] procedure [b]TForm1[/b].Button1Click(Sender: TObject); begin [b]Form2[/b].Free; end; Zwar wird es keine Exep. geben im Fall dass du so was schreibst:
Delphi-Quellcode:
Aber MainThread bleibt immer noch da, wird nicht beendet, weil das ganze die Logik von VCL nicht folgt.
procedure TForm1.Button1Click(Sender: TObject);
begin self.Free; // Oder nur Free end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 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