![]() |
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:
Wenn ich diese Funktion von Form1 aus aufrufe, geht es problemlos.
checkbox1.items.clear;
Wenn ich jedoch in Form2 schreibe
Delphi-Quellcode:
kommt eine Fehlermeldung "Zugriffsverletzung bei Adresse ...... in Modul ..... Lesen von Adresse...."
Form1.checkboxleeren;
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 |
Re: MDI - Funktionen eines anderen Formulars
Also es hat damit was zu tun, dass das Formular im Nachhinein erstellt wird mit
Delphi-Quellcode:
Wenn ich das Formular nämlich automatisch zu Beginn erstelle, kann die Funktion aufgerufen und können die Komponenten angesprochen werden.
TForm1.Create(Application);
Bin weiterhin für jede Hilfe dankbar.. MfG davar |
Re: MDI - Funktionen eines anderen Formulars
Guten Morgen, davar.
Den Zugriffsfehler kannst du eingrenzen:
Delphi-Quellcode:
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.
if Assigned(Form1) then
Form1.CheckBoxLeeren; Grüße vom marabu |
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? |
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 |
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:
Delphi-Quellcode:
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).
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; ... MfG davar |
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 |
Re: MDI - Funktionen eines anderen Formulars
ich versuch es mal detailliert und möglichst vollständig.
In Form1 ist folgende Funktion:
Delphi-Quellcode:
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:
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;
Delphi-Quellcode:
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
Form1.Listenfuellen;
Delphi-Quellcode:
auszuführen und zeigt dann die Fehlermeldung an. Wenn ich diese Zeile auskommentiere, läuft er in Form1 weiter.
CBFluggesellschaft.items.clear;
Delphi-Quellcode:
wird auch mehrmals ausgeführt. Wenn die Bedingung erfüllt ist, kommt die nächste Zeile
begin
if DBs.TVeranstalter.Fieldbyname('Status').AsString = '1' then
Delphi-Quellcode:
und hier ist wieder Schluss..
CBFluggesellschaft.items.add(DBs.TVeranstalter.Fieldbyname('Veranstalter').AsString +
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.. |
Re: MDI - Funktionen eines anderen Formulars
:wall: :wall:
ich habe
Delphi-Quellcode:
ersetzt mit
TForm1.Create(Application);
Delphi-Quellcode:
und jetzt gehts.. :duck:
Application.CreateForm(TForm1, Form1);
Danke für eure Mühe.. |
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 13:50 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 by Thomas Breitkreuz