AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zugriff auf Formular währen OnShow

Ein Thema von striderx · begonnen am 24. Apr 2015 · letzter Beitrag vom 24. Apr 2015
Antwort Antwort
striderx

Registriert seit: 11. Feb 2007
Ort: Bergisch Gladbach
206 Beiträge
 
Delphi 10.4 Sydney
 
#1

Zugriff auf Formular währen OnShow

  Alt 24. Apr 2015, 20:23
Delphi-Version: XE6
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zugriff auf Formular währen OnShow

  Alt 24. Apr 2015, 20:38
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 )
  • 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.
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Apr 2015 um 20:47 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Zugriff auf Formular währen OnShow

  Alt 24. Apr 2015, 20:45
Versuch mal Form2 := TForm2.Create(Application); vor Application.CreateForm(TForm1, Form); .
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zugriff auf Formular währen OnShow

  Alt 24. Apr 2015, 20:52
Versuch mal Form2 := TForm2.Create(Application); vor 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Apr 2015 um 20:54 Uhr)
  Mit Zitat antworten Zitat
striderx

Registriert seit: 11. Feb 2007
Ort: Bergisch Gladbach
206 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Zugriff auf Formular währen OnShow

  Alt 24. Apr 2015, 20:54
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 ...
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Zugriff auf Formular währen OnShow

  Alt 24. Apr 2015, 21:05
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;
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:45 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