AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein AV bei benutzen von Eigenschaften eines MDIChilds
Thema durchsuchen
Ansicht
Themen-Optionen

AV bei benutzen von Eigenschaften eines MDIChilds

Ein Thema von -NIP- · begonnen am 27. Okt 2005 · letzter Beitrag vom 1. Nov 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von -NIP-
-NIP-

Registriert seit: 6. Jun 2004
Ort: Aachen
254 Beiträge
 
Delphi 7 Personal
 
#1

AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 27. Okt 2005, 19:43
Hi,

Tja wie der Titel schon sagt, habe ich Probleme beim Benutzen von Eigenschaften eines MDIChilds.
Dieses wird zuvor mit
TForm2.Create(self); erzeugt. Es ist übrigens ein verfügbares und nicht automatisch erzeugtes Formular, damit es beim Start nicht sofort aufgerufen wird.
Übrigens gibts keine AV, wenn ich auf die Eigenschaften z.B. so zugreife:
Delphi-Quellcode:
procedure TForm2.FormShow;
begin
  Width:=200;
end;
oder so ähnlich. Ich muss jedoch in einer Prozedur eines anderen Objekts auf die Eigenschaften zugreifen, also fällt diese Möglichkeit schonmal raus.
ActiveMDIChild.Width:=200; Diese Variante gibt auch eine AV.

Die untere Variante scheint zu funktionieren, aber auch sie fällt raus, weil man mit ihr nicht auf die einzelnen Komponenten zugreifen kann.
Screen.ActiveForm.Width:= 200; Am besten wäre natürlich wenn man auf jede erzeugte Instanz von TForm2 einzeln zugreifen kann.



Danke schon einmal für eure Bemühungen.
Christian
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 27. Okt 2005, 20:51
Vielleicht solltest du auch mal prüfen, ob ActiveMDIChild <> nil ist. Dann gibts auch keine AV. Ist natürlich nur <> nil, wenn du es auch als MDI-Formular angelegt hast.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 27. Okt 2005, 20:55
weißt du die instanz auf irgend eine Variable zu? Du hast ja geschrieben das du das Form so erzeugst:
TForm2.Create(self); warum nicht einfach
meineForm2Instanz := TForm2.Create(Self); dann kannst du auch ohne Probleme auf die Instanz zugreifen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von -NIP-
-NIP-

Registriert seit: 6. Jun 2004
Ort: Aachen
254 Beiträge
 
Delphi 7 Personal
 
#4

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 27. Okt 2005, 21:28
Wie kann man das denn gut handhaben beliebig viele Instanzen zu erzeugen?
Etwa mit dynamischen Arrays?
Und außerdem muss ich ja trotzdem noch wissen, was die aktive MDIChildForm ist.

Irgendwie kann ich in der Prozedur von meinem Objekt nicht mit ActiveMDIChild arbeiten.
Muss man da irgendwas ins Objekt einbinden?

Komischerweise ist ActiveMDIChild <> nil, wenn ich die Form vom Hauptformular erzeuge.
Bei einer anderen Form ist ActiveMDIChild = nil .

Aufruf vom Hauptformular
Delphi-Quellcode:
  TBildfenster1.Create(self);//Das ist das MDIChild
  if ActiveMDICHild<>nil then
  Bildspeicher.Intialisieren(emNormalOeffnen);//Das ist das genannte Objekt
                                              //und die Prozedur in der ich Werte des
                                              //MDIChilds abfrage bzw. setze.
Aufruf von anderem Formular (fsStayOnTop)
Delphi-Quellcode:
  TBildfenster1.Create(self);//Bei OnCreate wird Bildspeicher(Objekt) erzeugt
  if ActiveMDIChild<>nil then
  begin
    Bildspeicher.Breite:= StrToInt(Breite_Edt.Text);//Objekt wurde schon erzeugt
    Bildspeicher.Hoehe:= StrToInt(Hoehe_Edt.Text);
    Bildspeicher.Intialisieren(emNeu);

    FuellFarbe:=FarbBox_Pnl.Color;//Beides hier
    BildNummer:=BildNummer+1; //nicht beachten
  end;
Christian
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 27. Okt 2005, 21:35
@nip: Genau, mit dynamischen Arrays bzw. einer TList/TObjectList. Bei einer TList musst du einfach den Pointer zu deiner Formklasse kasten um die forms anzusprechen. Das mit der Liste ist auch die saubereste Lösung in Bezuf auf freigeben der Formulare. (TForm2(Liste.Items[Index]))
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von -NIP-
-NIP-

Registriert seit: 6. Jun 2004
Ort: Aachen
254 Beiträge
 
Delphi 7 Personal
 
#6

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 28. Okt 2005, 12:56
Also das mit dem einzelnen Zugreifen ist doch nicht so wichtig. Es ist wichtiger einen Ersatz für
Delphi-Quellcode:
procedure TForm2.Show;
begin
  Width:=200;
end;
zu finden. Diese Methode wird ja immer in dem Fenster ausgeführt woher sie auch ausgelöst wurde.
Was ist die entsprechende "Vorsilbe" in einer Prozedur eines anderen Objekts?
z.B.
Delphi-Quellcode:
procedure TObjekt1.Methode1;
begin
  {Vorsilbe}.Width:=200;
end;
Das Objekt ist übrigens in der Form deren Werte verändert werden sollen.
Christian
  Mit Zitat antworten Zitat
Benutzerbild von -NIP-
-NIP-

Registriert seit: 6. Jun 2004
Ort: Aachen
254 Beiträge
 
Delphi 7 Personal
 
#7

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 31. Okt 2005, 21:31
*push*
Christian
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#8

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 31. Okt 2005, 23:50
hi,

Jedes VCL-Formular besitzt automatisch die MDi-Methoden:
- MDiChildCount
- MDiChildren
- ..

Du solltest deswegen den Formularbezeichner immer vorne mit dazuschreiben!
MainForm ist in diesem Beispiel der Formularbezeichner.

Delphi-Quellcode:
  if MainForm.MDiChildCount > 0 then
  MainForm.MDiChildren[0].Caption := 'Hallo Welt...'; // 0 ist immer das aktive Child
Hier mal ein Beispiel, wie man es nicht machen sollte!:
Delphi-Quellcode:
  if MDiChildCount > 0 then // falsch bzw. riskant
  MDiChildren[0].Caption := 'Hallo Welt...'; // falsch bzw. riskant
Nun benutzt der Compiler automatisch Self.
Und Self steht für das Formular deiner jeweiligen Unit. (sofern es ein Formular ist)

Delphi-Quellcode:
  if Self.MDiChildCount > 0 then // das macht der Compiler draus
  Self.MDiChildren[0].Caption := 'Hallo Welt...'; // das macht der Compiler draus
Jedes MDiChild besitzt einen Klassennamen z. Beispiel: 'TChild'.
Über diese Klasse kannst du auf alle anderen Objekte/Eigenschaften zugreifen.

Ein Beispiel:
TChild(MainForm.MDiChildren[0]).Memo1.Text := 'Hallo Welt'; oder
(MainForm.MDiChildren[0] as TChild).Memo1.Text := 'Hallo Welt'; Schreib dir am besten eine Funktion, die du dann von überall aus aufrufen kannst.
Übrigens kann man Zugriffsverletzungen auch aus dem Weg gehen, indem man vorher (MDi <> nil)
überprüft.

lg bigg
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#9

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 1. Nov 2005, 00:27
Was auch gerne falsch gemacht wird, ist das Verwenden der globalen Variablen des Form designers in den MdiChilldren.

Den Link zum Mainform kann man easy als Property im Child ablegen:

Delphi-Quellcode:
property MainForm : DeineMainFormKlasse read getMainForm;


...

function DeineChildklasse.getMainForm : DeineMainFormKlasse;
begin
  result := Owner as DeineMainFormKlasse;
end;
Wenn die Children so angelegt werden gibt es damit schonmal kein Problem:
DeineMainFormKlasse.Create(self); Wenn die Methode im MainForm aufgerufen wird ist self dein MainForm.
Ansonsten musst du natürlich eine Referenz darauf übergeben


Im MdiChild niemals(!!!) die globale Variable verwenden, die der Form designer anlegt.
Das hier muss natürlich knallen, wenn es mehr als ein Child gibt:
Delphi-Quellcode:
procedure TDeineChildklasse.DoSomething;
begin
  DeineChildklasse.Irgendwas();
end;
Wenn es nicht knallt, wird es wohl trotzdem selten das machen, was du willst. Die Variable wird die ihr zuletzt zugewiesene Instanz enthalten. Höchstwahrscheinlich also nicht die, in der du gerade bist.
Besser ist es also komplett zu ignorieren, dass Delphi da ständig diese eklige globale Variable anlegt:
Delphi-Quellcode:
procedure TDeineChildklasse.DoSomething;
begin
  self.Irgendwas();
  // oder hübscher -> implizites self:
  Irgendwas();
end;
Zitat von bigg:
Du solltest deswegen den Formularbezeichner immer vorne mit dazuschreiben!
Eben genau das nicht. Sollte man eigentlich nie machen...
  Mit Zitat antworten Zitat
Benutzerbild von -NIP-
-NIP-

Registriert seit: 6. Jun 2004
Ort: Aachen
254 Beiträge
 
Delphi 7 Personal
 
#10

Re: AV bei benutzen von Eigenschaften eines MDIChilds

  Alt 1. Nov 2005, 12:15
Das mit dem Self ist schon gut, aber da ich ja in einer Methode eines Objekts arbeite, was sich in der Form befindet auf die ich eigentlich zugreifen will, greift er mit Self leider nur auf das Objekt zu. Wie ich euch verstanden habe, kann man mit self eben nur direkt in einer Methode der Form auf sich selbst zugreifen, oder tue ich euch Unrecht ?
Christian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:35 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