Delphi-PRAXiS

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 - Funktionen eines anderen Formulars (https://www.delphipraxis.net/62622-mdi-funktionen-eines-anderen-formulars.html)

davar 7. Feb 2006 11:29


MDI - Funktionen eines anderen Formulars
 
Hallo Leute,

ich stelle gerade eine vorhandene SDI-Anwendung in MDI um und habe folgendes Problem:

In Form1 ist eine Funktion checkboxleeren (unter public definiert) mit u.a. folgendem Befehl:

Delphi-Quellcode:
checkbox1.items.clear;
Wenn ich diese Funktion von Form1 aus aufrufe, geht es problemlos.

Wenn ich jedoch in Form2 schreibe

Delphi-Quellcode:
Form1.checkboxleeren;
kommt eine Fehlermeldung "Zugriffsverletzung bei Adresse ...... in Modul ..... Lesen von Adresse...."

Vor der Umstellung lief es einwandfrei, jetzt aber merkwürdigerweise nicht. Noch merkwürdiger ist aber, wenn ich die Zeilen auskommentiere, die nicht auf eine Checkbox zugreifen, laufen die anderen Befehler problemlos (z.B. das Lesen einer Paradoxtabelle mittels TTable).

Kann sich (und mir) das jemand erklären?


MfG

davar

davar 7. Feb 2006 23:26

Re: MDI - Funktionen eines anderen Formulars
 
Also es hat damit was zu tun, dass das Formular im Nachhinein erstellt wird mit

Delphi-Quellcode:
TForm1.Create(Application);
Wenn ich das Formular nämlich automatisch zu Beginn erstelle, kann die Funktion aufgerufen und können die Komponenten angesprochen werden.

Bin weiterhin für jede Hilfe dankbar..

MfG

davar

marabu 8. Feb 2006 05:55

Re: MDI - Funktionen eines anderen Formulars
 
Guten Morgen, davar.

Den Zugriffsfehler kannst du eingrenzen:

Delphi-Quellcode:
if Assigned(Form1) then
  Form1.CheckBoxLeeren;
Wenn Form1 automatisch erzeugt wird, dann ist sichergestellt, dass die globale Variable Form1 korrekt belegt ist. Ich kann nicht erkennen, dass auch du bei der späteren Erzeugung der Form dafür Sorge trägst.

Grüße vom marabu

Flocke 8. Feb 2006 06:05

Re: MDI - Funktionen eines anderen Formulars
 
Hallo davar (guten Morgen marabu),

da du jetzt eine MDI-Anwendung hast, solltest du dir vielleicht auch diese Fragen stellen:

Kannst du denn sicher sein, dass es nur noch eine Instanz der Fensterklasse TForm1 gibt?
Oder kann so ein Fenster mehrfach geöffnet werden?
Wie sieht's mit TForm2 aus?
Welches TForm2 gehört zu welchem TForm1?

marabu 8. Feb 2006 06:15

Re: MDI - Funktionen eines anderen Formulars
 
Guten Morgen, Volker.

Ich nehme an, dass Form1 die MDI-MainForm darstellen soll. Den gezeigten Zugriff einer ChildForm auf die MainForm - wenn es denn so ist - halte ich sowieso für eine unglückliche Lösung.

marabu

davar 8. Feb 2006 07:03

Re: MDI - Funktionen eines anderen Formulars
 
Hallo,

also bei mir heissen die Formulare nicht Form1 und Form2, aber um es vereinfachen, habe ich sie hier so genannt. Sollte ich beim nächsten mal besser lassen. Aber bleiben wir vorerst mal bei diesen Bezeichnungen.

Form1 ist ein Kindfenster, Form2 soll ein "loses" Fenster (fsNormal) sein. Aber auch wenn ich beide als Kindfenster definiere, habe ich das gleiche Problem. MainForm ist ein anderes Fenster, das sich FormRahmen nennt.

Zitat:

Zitat von "marabu
Wenn Form1 automatisch erzeugt wird, dann ist sichergestellt, dass die globale Variable Form1 korrekt belegt ist. Ich kann nicht erkennen, dass auch du bei der späteren Erzeugung der Form dafür Sorge trägst.

Ich weiss nicht, ob es wirklich an der Variable hängt. Die Funktion selbst wird ja aufgerufen (Schnipsel s.u.)

Delphi-Quellcode:
checkbox1.items.clear;
DBs.TVeranstalter.First;
for i:= 1 to DBs.TVeranstalter.RecordCount do
begin
     if DBs.TVeranstalter.Fieldbyname('Status').AsString = '1' then
     checkbox1.items.add(DBs.TVeranstalter.Fieldbyname('Veranstalter').AsString +
        ' (' + DBs.TVeranstalter.Fieldbyname('Abkuerzung').AsString + ')');
     DBs.TVeranstalter.next;
end;
...
DBs ist ein Datenmodul, in dem die Tabellen gespeichert sind. Wenn ich nun die erste Zeile auskommentiere, werden die paar Zeilen darauf abgearbeitet, aber nur bis zur Zeile, wo die Combobox (hab ich vorhin checkbox genannt, sorry) wieder angesprochen wird (hier Zeile 6).

MfG

davar

marabu 8. Feb 2006 07:46

Re: MDI - Funktionen eines anderen Formulars
 
Wo steht denn jetzt der Code? Da der Zugriff auf die Komponente checkbox1 nicht qualifiziert ist, steht er wohl in Form1. Dort funktioniert er, schreibst du. Wenn du den Code in Form2 verwendest, dann gibt es einen Fehler beim Zugriff auf Form1.CheckBox1 - das sollte auf jeden Fall an der globalen Variablen Form1 liegen, da ja alle anderen Zugriffe auf das Datenmodul zielen. Bei MDI ChildForms kannst du doch gar nicht mit dieser globalen Variable arbeiten. Oder gibt es nur eine Instanz von TForm1?

marabu

davar 8. Feb 2006 11:29

Re: MDI - Funktionen eines anderen Formulars
 
ich versuch es mal detailliert und möglichst vollständig.

In Form1 ist folgende Funktion:

Delphi-Quellcode:
procedure TForm1.Listenfuellen;
var i: integer;
begin
CBFluggesellschaft.items.clear;
DBs.TVeranstalter.First;
for i:= 1 to DBs.TVeranstalter.RecordCount do
begin
     if DBs.TVeranstalter.Fieldbyname('Status').AsString = '1' then
     CBFluggesellschaft.items.add(DBs.TVeranstalter.Fieldbyname('Veranstalter').AsString +
        ' (' + DBs.TVeranstalter.Fieldbyname('Abkuerzung').AsString + ')');
     DBs.TVeranstalter.next;
end;
Wenn ich von Form1 aus diese Funktion aufrufe, läuft es ohne Probleme. In Form2 kann man die Veranstalterliste bearbeiten. Wenn man in Form2 speichert (Button), soll automatisch Form1.Listenfuellen ausgeführt werden. Hierfür sage ich in Form2:

Delphi-Quellcode:
Form1.Listenfuellen;
Ich verfolge die Abarbeitung von Form2 aus mit "Einzelne Anweisung", also F7. Alle Befehle werden abgearbeitet, auch "Form1.Listenfuellen." Nochmal F7, der Compiler springt rüber zu Form1. Versucht die Zeile

Delphi-Quellcode:
CBFluggesellschaft.items.clear;
auszuführen und zeigt dann die Fehlermeldung an. Wenn ich diese Zeile auskommentiere, läuft er in Form1 weiter.

Delphi-Quellcode:
begin
     if DBs.TVeranstalter.Fieldbyname('Status').AsString = '1' then
wird auch mehrmals ausgeführt. Wenn die Bedingung erfüllt ist, kommt die nächste Zeile

Delphi-Quellcode:
     CBFluggesellschaft.items.add(DBs.TVeranstalter.Fieldbyname('Veranstalter').AsString +
und hier ist wieder Schluss..

Und wenn ich statt CBFluggesellschaft.items.clear eine andere Komponente, z.B. Edit1 anspreche, ist es genauso. Es scheint an den Komponenten zu hängen.

Hoffe, das war ausführlich..

davar 8. Feb 2006 11:46

Re: MDI - Funktionen eines anderen Formulars
 
:wall: :wall:

ich habe

Delphi-Quellcode:
TForm1.Create(Application);
ersetzt mit

Delphi-Quellcode:
Application.CreateForm(TForm1, Form1);
und jetzt gehts.. :duck:

Danke für eure Mühe..

Flocke 8. Feb 2006 12:38

Re: MDI - Funktionen eines anderen Formulars
 
Dein erster Code war `eigentlich´ besser, nur die Zuweisung fehlte:
Delphi-Quellcode:
Form1 := TForm1.Create(Application);


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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