![]() |
MDI-Child - Zugriffsverletzung bei Zuweisung
Hi!
Ich habe folgendes Problem: Ich habe eine MDI-Anwendung in der ich ein MDI-Kindfenster erstellen möchte. Das Hauptformular wird logischerweise automatisch erzeugt, das Kindfenster jedoch nicht. Nun erzeuge ich im Laufe des Progammablaufs besagtes Kindfenster und zeige es an.
Delphi-Quellcode:
Im OnShow-Ereignis des Kindfensters wird nun einem Textfeld ein Inhalt zugewiesen und dabei tritt eine Zugriffsverletzung auf. Die Zuweisung ist an sich korrekt doch beim Debuggen gibt es scheinbar Probleme mit dem Textfeld. Der Fehler tritt jedoch nicht auf wenn ich auch das Kindfenster automatisch erzeugen lasse. Ich vermute das das auch irgendwie mit dem Splashscreen und seiner Entstehung zusammenhängt. Den Splashscreen habe ich nach
frm_kind := Tfrm_kind.Create(Self);
frm_kind.Show; ![]() |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Was für eine Fehlermedlung kommt den?
|
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
Delphi-Quellcode:
inherited Show;
|
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
Aber die hier bereitgestellten Infos sind auch dermaßen rar... da kann man ja nur raten. :roll: @Mr_G Ich weiß nicht wie du es machst, aber wenn ich weiß dass es irgendwo zickt, dann setze ich natürlich einen Breakpoint davor! Und schon weiß ich genau wo es zickt. Wäre also ganz nett wenn du das mal machen könntest um wenigstens ein/zwei Code Zeilen präsentieren zu könnnen, die den Fehler produzieren. Das hier hilft doch nicht weiter, wenn du schon selbst sagst, dass du einen Handler für OnShow geschrieben hast: Zitat:
btw: frm_kind ist hoffentlich nicht diese komische globale Variable vom Formdesigner. Wenn ja überrascht mich der Fehler bei einer MDI-App überhaupt nicht... |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
@ Robert_G: Lesen bildet! ;)
Zitat:
Delphi-Quellcode:
Edit.Text := 'Test';
|
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
|
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
Aber mal eine andere Frage: Wie ersetzt du globale Variablen und wie hängt das mit den Zugriffsverletzungen zusammen? |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
Zitat:
Wenn du nun (sinnloserweise) das ganze in eine globale Variable packst wird da immer das Child drin sein, dass dort zuletzt gelandet ist. Und wenn du diese sogar in den Events von Tfrm_kind benutzt (also frm_kind) na dann gute Nacht. Dann wird der Code zu einer Hälfte self, zur anderen irgendwas benutzen, das zuletzt in diese olle Variable geschrieben wurde. Prost Mahlzeit! :cheers: Kommentiere frm_kind :Tfrm_kind einfach mal aus. Überall wo es jetzt knallt war ein Fehler im Code. Für das Ersetzen bzw. Unnötigmachen von globalen Variablen gibt es hier X Threads bzw. mind. die Hälfte aller Quellcodes, die man heutzutage im Internet sieht dürfte frei von solchen alten Unsitten sein. Es ist also sehr wahrscheinlich, dass du für Probleme eine Lösung ohne "sowas" findest. ;) |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
Btw: Vielen Dank für die schnelle Hilfe! :dp: |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
|
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Hmm...
Ich weiß nicht aber irgendwie komm ich nicht ganz mit... Das Form ist in der Unit global deklariert wie immer... klar. Ich lade nun das Form und zeige es aus einer anderen Unit heraus an... Beim OnShow macht er terz und nun liegts daran das frm_kind eine globale Variable ist??? Wie soll ich das denn Umgehen? |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Die Frage ist, wieoft hast du das Form schon erzeugt?
Normalerweise ist die globale Variable leer. In eriner normalen App, die mit den Dingern arbeitet würde man das hier machen:
Delphi-Quellcode:
Und auch wenn es nicht sehr schlau ist das zu machen, es funktioniert meistens. Aber nur solange du nur EINE Instanz hast.
formVariable := TFormKlasse.Create(IrgendEinOwner);
Delphi-Quellcode:
Nun gibt es 2 Forms, aber die Referenz auf das zweite steht in dem Ding.
formVariable := TFormKlasse.Create(IrgendEinOwner);
formVariable := TFormKlasse.Create(IrgendEinOwner); Wenn du jetzt (und das verstehe ich irgendwie gar nicht) innerhalb der Methoden dieser Klassen die globalen Varable anstatt self nimmst:
Delphi-Quellcode:
Jetzt wird JEDE Instanz von TFormKlasse IMMER die Methode der Instanz ausführen, die gerade in formVariable steht.
procedure TFormKlasse.OnShow(....);
begin formVariable.DoSomething(); end; Das hier hätte gereicht:
Delphi-Quellcode:
procedure TFormKlasse.OnShow(....);
begin DoSomething(); // oder self.DoSomething(); end; |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Hmm... verstanden...
Ich erzeuge das Form aber nur einmal. |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
na dann rücke mal den evtl. überschriebenen constructor, OnCreate und OnShow raus. ;)
Interessant ist auch das: Verwendung der globalen Variable im OnShow Handler:
Delphi-Quellcode:
Form wird erzeugt, aber die referenz kommt in nicht in die globale Variable:
procedure TFormKlasse.OnShow(....);
begin formVariable.DoSomething(); end;
Delphi-Quellcode:
Natürlich muss es nun im OnShow knallen...
procedure TMdiParent.DoSomething;
var formVariable :TFormKlasse; begin formVariable := TFormKlasse.Create(self); formVariable.Show();// boom end; |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Großes tut mir leid!!! :oops: :oops: :oops:
Ich habe alles nur aus dem Kopf aufgeschrieben und habe nun beim nachsehen und ausprobieren den Fehler gefunden... Ich rufe im OnShow nur eine Function des Forms auf und in dieser kommt dann der Fehler. Dumm wie ich nunmal bin hab ich die Function genau wie beschrieben aufgerufen. Zitat:
|
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Zitat:
Zitat:
BTW: Du brauchst hier auch wirklich keine globale Variable. Wenn du nur Children von einem Typ hast gates so:
Delphi-Quellcode:
private
function getMyActiveChild: ChildKlasse; public property MyActiveChild: ChildKlasseread getMyActiveChild;
Delphi-Quellcode:
Beim nächsten Mal aber bitte soweit im Debugger laufen bis du Zeile kennst, die knallt. (BreakPoints & F8 sind etwas unentbehrliches ;) )
function ParentKlasse.getMyActiveChild: ChildKlasse;
begin if assigned(ActiveMdiChild) and (ActiveMdiChild is ChildKlasse) then result := ChildKlasse(ActiveMdiChild) else result := nil; end; |
Re: MDI-Child - Zugriffsverletzung bei Zuweisung
Ich hatte ja debuggt nur hab ich leider den Beitrag zwischen Tür und Angel geschrieben und nicht mehr nachgedacht und kontroliiert ob ich das wirklich so gemacht hab... Und da is mir dieser kleine Umstand leider entfallen...
Nochmal Sorry und Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:34 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