![]() |
Delphi-Version: XE6
Zugriff auf Formular währen OnShow
Hallo zusammen,
wenn ich beim FormShow-Ereignis des Haupt-Formulars eine bestimmte Bedingung auftritt, möchte ich für einige Objekte in einem Unterformular bestimmte Eigenschaften setzen (z. B. den Text für ein Label). Sobald ich das mache, bekomme ich eine Access-Violation, weil das Unterformular anscheinend noch nicht existiert (habe ich mit Screen.Forms[P].Name überprüft). Ein Aufruf mit Unterform.ShowModal ist dann natürlich auch nicht möglich. Das seltsame ist, dass es nicht knallt, wenn ich der Unterform.Caption etwas zuweise. Und was noch viel seltsamer ist: Dieses Projekt habe ich per Kopieren aus einem anderen Projekt 'geklont'. Dort ist der Zufriff ohne Probleme möglich. Auch in anderen Projekten mit ähnlicher Mimik tritt das Projekt nicht auf. Dort existiert das Unterformular zu diesem Zeitpunkt also immer schon. Hat jemand eine Idee hierzu?
Delphi-Quellcode:
program ArtDB;
uses SysUtils, WinTypes, Vcl.Forms, ArtDBMain in 'ArtDBMain.pas' {dlgArtDB}, ShowMessage in 'ShowMessage.pas' {dlgShowMsg}, SetSortMode in 'SetSortMode.pas' {dlgSetSortMode}, FitImage in 'FitImage.pas', PicShow in 'PicShow.pas' {dlgPictureShow}; {$R *.res} var hSemaphore: tHandle; hThisWindow: hWnd; SemName: Array[0..256] of Char; WinTitle: Array[0..256] of Char; begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TdlgArtDB, dlgArtDB); Application.CreateForm(TdlgShowMsg, dlgShowMsg); Application.CreateForm(TdlgSetSortMode, dlgSetSortMode); Application.CreateForm(TdlgPictureShow, dlgPictureShow); Application.Run; end. |
AW: Zugriff auf Formular währen OnShow
Wie du in deiner DPR sieht, werden die anderen "automatisch" erstellten Forms nach deiner MainForm erstellt, also beim Erstellen der MainForm kann das Andere noch garnicht vorhanden sein.
(MainForm ist standardmäßig die erste Form, welche per FormCreate erstellt wird)
PS: Daß es in TForm.Caption TControl.Caption nicht knallt, ist verständlich, denn das benutzt nur WinAPI-Zugriffe auf das interne Windows-Objekt und diese Zugriffe sind in TControl.Perform abgesichert, denn dort wird der Befehl nur ausgeführt, wenn Self <> nil. :angle2: Wenn das Objekt also (noch) nicht existiert, die böse globale Variable noch nil ist, dann wird nicht versucht auf Eigenschaften (interne Felder/Variablen) des Objekts zuzugreifen, wie z.B. das Form-Handle und schon kann es da nicht knallen. [edit] Prüfe mal, ob Visible der MainForm auf False steht, denn sonst wird sie eventuell sofort angezeigt, während sie erstellt wird. Und OldCreateOrder könnte man sich auch mal ansehn. |
AW: Zugriff auf Formular währen OnShow
Versuch mal
Delphi-Quellcode:
vor
Form2 := TForm2.Create(Application);
Delphi-Quellcode:
.
Application.CreateForm(TForm1, Form);
|
AW: Zugriff auf Formular währen OnShow
Zitat:
Zitat:
und natürlich muß dabei, so oder so, die automatische Erstelltung (FormCreate) entfernt werden ... sonst wird man damit ganz viel Spaß bekommen. :stupid: |
AW: Zugriff auf Formular währen OnShow
Wow, das sind ja schnelle Antworten - vielen Dank.
@Himitsu: Dein Tipp, dass bei der MainForm Visible nicht auf Falsch stehen könnte war goldrichtig. Da hätte ich wahrscheinlich noch lange grübeln können ... |
AW: Zugriff auf Formular währen OnShow
Nochmal mit Quellcode:
Projektdatei
Delphi-Quellcode:
Unit1/Form1 (Zugriff auf eine Komponente in Form2 bereits in Create von Form1)
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Form2 := TForm2.Create(Application); //rein Application.Initialize; Application.CreateForm(TForm1, Form1); //Application.CreateForm(TForm2, Form2); //raus Application.Run; end.
Delphi-Quellcode:
Oder, wie himitsu meinte:
procedure TForm1.FormCreate(Sender: TObject);
begin ShowMessage(Form2.Edit1.Text); end; Projektdatei
Delphi-Quellcode:
Unit1/Form1
program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); //Application.CreateForm(TForm2, Form2); //raus Application.Run; end.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Form2 := TForm2.Create(Application); ShowMessage(Form2.Edit1.Text); //Form2.Free; //wenn man es nicht mehr braucht end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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-2025 by Thomas Breitkreuz