Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MDI-Child - Zugriffsverletzung bei Zuweisung (https://www.delphipraxis.net/49394-mdi-child-zugriffsverletzung-bei-zuweisung.html)

Mr_G 10. Jul 2005 19:52

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?

Robert_G 10. Jul 2005 20:07

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:
formVariable := TFormKlasse.Create(IrgendEinOwner);
Und auch wenn es nicht sehr schlau ist das zu machen, es funktioniert meistens. Aber nur solange du nur EINE Instanz hast.

Delphi-Quellcode:
formVariable := TFormKlasse.Create(IrgendEinOwner);
formVariable := TFormKlasse.Create(IrgendEinOwner);
Nun gibt es 2 Forms, aber die Referenz auf das zweite steht in dem Ding.
Wenn du jetzt (und das verstehe ich irgendwie gar nicht) innerhalb der Methoden dieser Klassen die globalen Varable anstatt self nimmst:
Delphi-Quellcode:
procedure TFormKlasse.OnShow(....);
begin
  formVariable.DoSomething();
end;
Jetzt wird JEDE Instanz von TFormKlasse IMMER die Methode der Instanz ausführen, die gerade in formVariable steht.
Das hier hätte gereicht:
Delphi-Quellcode:
procedure TFormKlasse.OnShow(....);
begin
  DoSomething();
  // oder
  self.DoSomething();
end;

Mr_G 10. Jul 2005 20:15

Re: MDI-Child - Zugriffsverletzung bei Zuweisung
 
Hmm... verstanden...
Ich erzeuge das Form aber nur einmal.

Robert_G 10. Jul 2005 20:26

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:
procedure TFormKlasse.OnShow(....);
begin
  formVariable.DoSomething();
end;
Form wird erzeugt, aber die referenz kommt in nicht in die globale Variable:
Delphi-Quellcode:
procedure TMdiParent.DoSomething;
var
  formVariable :TFormKlasse;
begin
  formVariable := TFormKlasse.Create(self);
  formVariable.Show();// boom
end;
Natürlich muss es nun im OnShow knallen...

Mr_G 10. Jul 2005 20:36

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:

Delphi-Quellcode:
procedure TFormKlasse.OnShow(....);
begin
  formVariable.DoSomething();
end;

Großes Entschuldigung und riesiges Danke für die Geduld!!!

Robert_G 10. Jul 2005 20:50

Re: MDI-Child - Zugriffsverletzung bei Zuweisung
 
Zitat:

Zitat von Mr_G
Dumm wie ich nunmal bin hab ich die Function genau wie beschrieben aufgerufen.

Macht ja nix. Aus Fehlern lernt man doch immer noch am besten. ;)
Zitat:

Zitat von Mr_G
Großes Entschuldigung und riesiges Danke für die Geduld!!!

Manchmal bin sogar ich ein wenig geduldig. :mrgreen:
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:
function ParentKlasse.getMyActiveChild: ChildKlasse;
begin
  if assigned(ActiveMdiChild) and (ActiveMdiChild is ChildKlasse) then
    result := ChildKlasse(ActiveMdiChild)
  else
    result := nil;
end;
Beim nächsten Mal aber bitte soweit im Debugger laufen bis du Zeile kennst, die knallt. (BreakPoints & F8 sind etwas unentbehrliches ;) )

Mr_G 10. Jul 2005 20:55

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 22:05 Uhr.
Seite 2 von 2     12   

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