AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MDI - Funktionen eines anderen Formulars

Ein Thema von davar · begonnen am 7. Feb 2006 · letzter Beitrag vom 8. Feb 2006
Antwort Antwort
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#1

MDI - Funktionen eines anderen Formulars

  Alt 7. Feb 2006, 11:29
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:

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

Wenn ich jedoch in Form2 schreibe

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
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: MDI - Funktionen eines anderen Formulars

  Alt 7. Feb 2006, 23:26
Also es hat damit was zu tun, dass das Formular im Nachhinein erstellt wird mit

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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 05:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 06:05
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?
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 06:15
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
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 07:03
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 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 = '1then
     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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 07:46
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
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 11:29
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 = '1then
     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:

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

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 = '1then
wird auch mehrmals ausgeführt. Wenn die Bedingung erfüllt ist, kommt die nächste Zeile

     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..
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 11:46


ich habe

TForm1.Create(Application); ersetzt mit

Application.CreateForm(TForm1, Form1); und jetzt gehts..

Danke für eure Mühe..
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: MDI - Funktionen eines anderen Formulars

  Alt 8. Feb 2006, 12:38
Dein erster Code war `eigentlich´ besser, nur die Zuweisung fehlte:
Form1 := TForm1.Create(Application);
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:39 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