Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Exception beim Löschen von Objekten (https://www.delphipraxis.net/14482-exception-beim-loeschen-von-objekten.html)

Fisch 10. Jan 2004 10:51


Exception beim Löschen von Objekten
 
Hallo NG,

ich kämpfe zur Zeit mit einem Problem:

Ich erzeuge zur Laufzeit einige MEMO Felder, die ich, wenn der Nutzer mit der Maustaste drauf klickt, wieder lösche. Klappt alles recht gut, bis ich die Memo-Felder lösche - dann bekomme ich eine Exception. Das tritt immer dann auf, wenn ich so ca. 10 und mehr Memo Felder erzeugt habe. Habe ich weniger Felder erzeugt, funzt alles recht gut. Es scheint mir irgendwie am Speicher zu liegen - sollte ich dem Programm mehr zuweisen ? Bisher habe ich da keine Einstellungen im Debugger vorgenommen oder verändert.

Die Fehlermeldungen:

Zitat:

Klasse EaccessViolation, ZUgriffsverletzung bei Adresse xy im Modul usw...
Manchmal aber auch die Meldung:

Zitat:

abstrakter Fehler der Klasse EAbstract Error
Das ist der Code, zur Definition der Routine

Code:
type
  TForm11 = class(TForm)
    .....
    procedure BPKlick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
Hier die Routine mit der ich zur Laufzeit die Memos erzeuge:
Code:
   if Button=mbRight then
     begin
       BPEditCount:=BPEditCount+1;
       BPEdit[BPEditcount]:=TMemo.Create(Form11);
       BPEdit[BPEditcount].Parent:=Form11;
       BPEdit[BPEditcount].Left:=X;
       BPEdit[BPEditcount].Top:=Y-17;
       BPEdit[BPEditcount].Height:=20;
       BPEdit[BPEditcount].Width:=20;
       BPEdit[BPEditcount].OnKeyPress:=BPKEYPRESS;
       BPEDIT[BPEditCount].OnClick:=BPKLICK;
       BPEdit[BPEditCount].Font.Name:='Arial Narrow';
       BPEdit[BPEditCount].Font.Size:=8;
       BPEdit[BPEditCount].Tag:=BPEditCount;
       BPEdit[BPEditCount].Name:='Memo'+inttostr(BPEditCount);
       BPedit[BPeditCount].Text:='';
       BPEdit[BPEditCount].setfocus;
     end;
Und hier die Routine, mit der ich die MEMOs wieder lösche:

Code:
procedure TForm11.BPKLICK(Sender: TObject);
  Var BPC : integer;
  begin
    if application.messagebox(Pchar('Soll das Kommentarfeld wirklich gelöscht werden ?'),
                              PChar('L Ö S C H E N'),
                              MB_ICONQUESTION+MB_YESNO+MB_DefButton2)=6 then
       begin
         if (Sender is TMemo) then
           begin
              with (Sender as TMemo) do
                begin
                  if BPEdit[(Sender as TMemo).Tag]<>nil then
                    begin
                      BPC:=(Sender as TMemo).Tag;
                      BPEDIT[BPC].free;
//                      BPEDIT[BP]:=nil;
                    end;
                end;
            end;
       end;
  end;
Kann mir jemand helfen ?

Gruss


Markus

Jens Schumann 10. Jan 2004 11:02

Re: Exception beim Löschen von Objekten
 
Moin Fish,
die Fehler treten auf, weil Du das Memo in seinem eigenen OnClick Eventhandler freigeben möchtest.
D.h. das Memo empfängt die Click Message ruft daraufhin den Eventhandler auf. In diesem wird das Memo freigegeben. Nachdem der Eventhandler seine Arbeit getan hat, möchte dieser zum Memo zurückkehren. Leider ist nun kein Memo mehr da. Weil es freigegeben wurde.

Die Lösung findest Du dort http://www.delphipraxis.net/internal...339&highlight=

Fisch 10. Jan 2004 12:37

Re: Exception beim Löschen von Objekten
 
Hallo Jens,


funzt leider nicht - das Problem ist mir jetzt aber klar. Die Ursache dafür liegt wohl in der Tatsache, dass ich gleichzeitgi noch ne OPenGL Scene mit nem MessageLoop laufen habe - das PostMessage läuft jetzt zu diesem Thread und hat dort logischerweise keine Auswirkung. Ich müsste also die Message an das Form11 leiten.

Ein Vorschlag ?

Danke und Gruss


Markus


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