| Autor |
Beitrag |
soisseteben
      
Beiträge: 111
Win XP
D7
|
Verfasst: Sa 21.10.06 19:10
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.
_________________ „Wer nur nach dem Zweck der Dinge fragt, wird ihre Schönheit nie entdecken.“ - (Halldór Laxness)
|
|
Phantom1
      
Beiträge: 390
|
Verfasst: 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 
      
Beiträge: 111
Win XP
D7
|
Verfasst: 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?
_________________ „Wer nur nach dem Zweck der Dinge fragt, wird ihre Schönheit nie entdecken.“ - (Halldór Laxness)
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
soisseteben 
      
Beiträge: 111
Win XP
D7
|
Verfasst: 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
_________________ „Wer nur nach dem Zweck der Dinge fragt, wird ihre Schönheit nie entdecken.“ - (Halldór Laxness)
|
|
_frank_
      
Beiträge: 343
Erhaltene Danke: 1
Win XP
Delphi 3 Prof / Turbo Delphi Explorer
|
Verfasst: Sa 21.10.06 20:48
schau dir mal TComponent.Owner an
Gruß Frank
|
|
soisseteben 
      
Beiträge: 111
Win XP
D7
|
Verfasst: 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
_________________ „Wer nur nach dem Zweck der Dinge fragt, wird ihre Schönheit nie entdecken.“ - (Halldór Laxness)
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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 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!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 111
Win XP
D7
|
Verfasst: 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".
|
|