Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Seeehr komische Zugriffsverletzung


soisseteben - Sa 21.10.06 19:10
Titel: Seeehr komische Zugriffsverletzung
Hi,
Ich schreibe gerade an einem recht komplexen Programm, wo u.a. einem Button eine OnClick-Ereignisprozedur zugeordnet wird. Wird diese jetzt ausgeführt kommt es so alle 2-4 mal zu einer Zugriffsverletzung. Und jetzt das wirklich komische : die Verletzung findet nach der letzen Anwisung der Ereignisprozedur statt. Also bei der Beendingung der Prozedur oder was weis ich.

Und da ist noch was: wenn ich zum Anfang der Prozedur mir mit "ShowMessage" einen belibigen Text ausgeben lasse, kommt es gleich beim ersten Klick auf den Button zu dieser Zugriffsverletzung am Ende.

Es wird immer versucht auf eine Speicheradresse rund um 00900000 zuzugreifen.

Das ganze macht mich noch ganz wahnsinnig, ich hoffe jemand anderes kann sich das erklären.

Ich denke, das es zu aufwendig und nicht notwendig ist das Program zu posten, kann es aber gern machen wenns wirklich notwendig ist.

Danke, danke, danke schon mal.


Phantom1 - Sa 21.10.06 19:23

Poste doch mal die komplette OnClick-Ereignisprozedur, ansonsten wird es sehr schwierig den fehler ausfindig zu machen.

mfg
Phantom1


soisseteben - Sa 21.10.06 20:27

Tschuldigung für die aspäte Antwort, aber ich habe einiges neues, verwirrendes herrausgefunden.

Das Problem liegt darin, das ich in der OnClick-Prozedur des Buttons versuche, das Objekt eben dieses Button freizugeben. Das freigeben klappt auch, nur beim beenden der Ereignissprozedur gibt es dann eben diese Zugriffsverletzung.

Was kann ich da machen?


alzaimar - Sa 21.10.06 20:31

Du willst im OnClick-Ereignis eines Buttons genau diesen Button freigeben? Was ist das denn für eine komische Anwendung? Ein Button-Suizid-Kommando?
Damit das klappt, schicke dem Formular eine Message 'WM_USER' (mit PostMessage) und schreib eine entsprechende Messagebehandlungsroutine, die das Objekt dann freigibt. Ich habs nicht getestet, aber es sollte klappen.


soisseteben - Sa 21.10.06 20:39

Naja, nach Klick auf den Button wird ein ne Menge gemacht und dann das Formular geschlossen wo er drauf war. Da der Button dynamisch erzeugt ist, geb ich ihn quasi "von Hand" wieder frei.

Könntest du das, was du grad geschrieben hast, bitte mit ein wenig Beispiel-Code untermauern, ich verstehs kaum.

Danke


_frank_ - Sa 21.10.06 20:48

schau dir mal TComponent.Owner an ;)

Gruß Frank


soisseteben - Sa 21.10.06 20:54

Jo, wenn der Owner freigegeben wird, werden alle untergeordneten Komponenten mit freigegeben. Aber ich geb das Objekt des Formulars (der Owner des Buttons) nicht frei, sondern beende (.close) es nur.

Das mit PostMessage hört sich nach der Delphihilfe exakt nach dem an, was ich brauche. Nur hab ich keinen schimmer wie ich das konkret benutze. Bitte ein bissel Beispiel-Code.

Thanks


wulfskin - Sa 21.10.06 23:48

Hallo,

ich bezweifle stark, dass dein Layout gut angelegt ist, aber nun gut:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
interface

const
  UM_DESTROYBUTTON = WM_USER + 12;

type
    {bla}
    procedure DestroyButton(var Msg: TMessage); message UM_DESTROYBUTTON;

procedure TForm1.DestroyButton(var Msg: TMessage);
begin
 TObject(Msg.WParam).Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Handle, UM_DESTROYBUTTON, Integer(Sender), 0);
end;
Gruß Hape!


jaenicke - Sa 21.10.06 23:54

Also wenn der Button "ordnungsgemäß" als Owner das Formular hat, dann wird der Button beim Freigeben des Formulars (also auch beim Schließen des Programms) automatisch freigegeben. Und der Owner wird ja dem Konstruktor übergeben. Wenn du da also das Formular übergibst erübrigt sich das manuelle Freigeben.

Und ich meine, wenn das Formular nur versteckt wird, muss dann der Knopf wirklich freigegeben werden? Ich meine, was wenn derselbe Knopf später erneut benötigt würde? Dann wärs doch nicht sinnvoll, den erneut zu erzeugen!


soisseteben - So 22.10.06 11:31

Danke für eure Hilfe. Ich habs jetzt auch so gelöst, das ich den Button permanent auf dem Formular habe. Ich war wohl ein wenig im "dynamische-Komponeneten-erzeugen-Wahn".