Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriff auf Formular währen OnShow (https://www.delphipraxis.net/184849-zugriff-auf-formular-waehren-onshow.html)

striderx 24. Apr 2015 20:23

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.

himitsu 24. Apr 2015 20:38

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)

  • Entweder du erstellst andere Forms dynamisch (also manuelle) nur/erst/schon dort, wo du sie verwenden willst.
  • Oder du verfrachtest die nötigen Funktionen in ein automatisch erstelltes Datenmodul aus (welches natürlich vor der Form erstellt werden sollte :roll:)
  • Oder du greifst eben nicht bereist im OnFormCreate auf das andere Zeugs zu, sondern erst in einem späteren Event, wenn dann alles da ist.
  • Oder du fummelst an der Erstellungsreihenfolge dran rum. (nicht vergessen dabei die MainForm neu zuzuweisen)
  • Oder ....

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.

Popov 24. Apr 2015 20:45

AW: Zugriff auf Formular währen OnShow
 
Versuch mal
Delphi-Quellcode:
Form2 := TForm2.Create(Application);
vor
Delphi-Quellcode:
Application.CreateForm(TForm1, Form);
.

himitsu 24. Apr 2015 20:52

AW: Zugriff auf Formular währen OnShow
 
Zitat:

Zitat von Popov (Beitrag 1299216)
Versuch mal
Delphi-Quellcode:
Form2 := TForm2.Create(Application);
vor
Delphi-Quellcode:
Application.CreateForm(TForm1, Form);
.

Zitat:

dynamisch erstellen
Aber ich würde es nicht "vorher" machen, sondern in der Hauptform
und natürlich muß dabei, so oder so, die automatische Erstelltung (FormCreate) entfernt werden ... sonst wird man damit ganz viel Spaß bekommen. :stupid:

striderx 24. Apr 2015 20:54

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 ...

Popov 24. Apr 2015 21:05

AW: Zugriff auf Formular währen OnShow
 
Nochmal mit Quellcode:

Projektdatei
Delphi-Quellcode:
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.
Unit1/Form1 (Zugriff auf eine Komponente in Form2 bereits in Create von Form1)
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(Form2.Edit1.Text);
end;
Oder, wie himitsu meinte:
Projektdatei
Delphi-Quellcode:
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.
Unit1/Form1
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 21:22 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