![]() |
Delphi-Version: 10 Seattle
Zweite Form öffnen
Servus,
ich bin neu hier und keine Ahnung, ob ich hier richtig bin mit meiner Anfängerfrage. Hoffe dennoch, dass mir hier weitergeholfen werden kann. Folgendes. Ich habe eine Unit mit dem Namen 'LoaderLogin_u'. In dieser habe ich einen Button. Mit Klick auf den Button soll die Unit 'Loader_u' geöffnet werden. Leider bekomme ich das Öffnen von 'Loader_u' nicht hin. Wenn ich 'Loader_u.Show;' mache, sagt er mir, dass Loader_u kein Element namens Show enthält. Wenn ich 'Loader_u.Visible := True;' eingebe, sagt er mir das gleiche wie oben, nur mit Visible. Das ganze mit 'TForm3' geht auch nicht, denn dann sagt er mir, dass 'TForm3' ein undeklarierter Bezeichner ist. Und Form3 geht ebenfalls nicht. 'Loader_u' ist bei den uses eingetragen. Was mache ich falsch? |
AW: Zweite Form öffnen
Es gibt zwei unterschiedliche Bezeichner: einmal der Unit-Name, und dann der Name des Formulars. In die Uses trägst du den Unitnamen ein. Angesprochen wird das Formular über seine Eigenschaft Name, die du im Objektinspektor eingibst. Unter diesem Namen existiert dann eine Instanz deines Formulars.
Delphi-Quellcode:
In deiner Mainform sieht das dann z.B. so aus:
UNIT UnitZentrale; //Name der Unit in Uses einbinden
INTERFACE USES ... TYPE TFormZentrale = CLASS(TForm) ... PRIVATE { Private-Deklarationen } PUBLIC { Public-Deklarationen } END; VAR FormZentrale: TFormZentrale; IMPLEMENTATION ...
Delphi-Quellcode:
UNIT UnitMain;
INTERFACE USES ... TYPE TFormMain = CLASS(TForm) Btn_Zentrale : TButton; Procedure Btn_ZentraleClick(Sender: TObject); PRIVATE { Private-Deklarationen } PUBLIC { Public-Deklarationen } END; VAR FormMain : TFormMain; IMPLEMENTATION {$R *.dfm} { TFormMain } Uses UnitZentrale; Procedure Btn_ZentraleClick(Sender: TObject); begin FormZentrale.Show; end; end. |
AW: Zweite Form öffnen
Okay. Aber selbst mit dem Namen geht es nicht. Hier mal mein Code.
Der Name der Unit: Loader_u Der Name der Form (Objektinspektor 'Name'): Loader Als Fehlermeldung im Compiler kommt:
Delphi-Quellcode:
unit LoaderLogin_u;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls; type TForm1 = class(TForm) lbl_usr: TLabel; lbl_pw: TLabel; edt_usr: TEdit; edt_pw: TEdit; btn_login: TButton; btn_reset: TButton; btn_updates: TButton; lbl_buildcopyright: TLabel; procedure btn_resetClick(Sender: TObject); procedure btn_updatesClick(Sender: TObject); procedure btn_loginClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} uses Loader_u; procedure TForm1.btn_loginClick(Sender: TObject); begin if (edt_usr.Text = 'admin') and (edt_pw.Text = 'admin') then begin Loader.Show; end; end. |
AW: Zweite Form öffnen
Und wie sieht loader_u aus?
|
AW: Zweite Form öffnen
Zitat:
Delphi-Quellcode:
unit Loader_u;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs; type TLoader = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } end; var Loader: TLoader; implementation {$R *.dfm} end. |
AW: Zweite Form öffnen
Jetzt wäre noch interessant, den Quellcode deiner Projektdatei zu sehen: Menü Projekt > Quelltext anzeigen.
|
AW: Zweite Form öffnen
Hier:
Delphi-Quellcode:
program LoaderLogin_p; uses Vcl.Forms, LoaderLogin_u in 'LoaderLogin_u.pas' {Form1}, Vcl.Themes, Vcl.Styles; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; TStyleManager.TrySetStyle('Glow'); Application.CreateForm(TForm1, Form1); Application.Run; end. |
AW: Zweite Form öffnen
Fällt dir da nichts auf? Mir nämlich schon beim ersten Blick genau das, was ich erwartet habe: das offensichtliche Fehlen der Unit Loader_u. Da würde ich doch glatt mal empfehlen, diese Unit deinem Projekt hinzuzufügen. Wie hast du diese Unit eigentlich erstellt? Normalerweise geht man im Datei-Menü auf Neu und wählt VCL-Formular, wenn man ein neues Formular benötigt. Dadurch wird das neue Formular bzw. die neue Unit automatisch dem Projekt hinzugefügt.
|
AW: Zweite Form öffnen
Oh man, danke dir!
Ich hatte es über Projekt > Projekt hinzufügen gemacht. Habe Delphi 10 Seattle erst seit gestern. :/ Sorry für die blöde Frage, aber danke für eure Antworten! |
AW: Zweite Form öffnen
Keine Ursache. Funktioniert's denn jetzt?
Ein Projekt fügst du einer Projektgruppe hinzu. Damit gehörte die fehlende Unit zu einem anderen Projekt. Der Fehler enstand, weil keine Instanz von TLoader in deinem aktuellen Projekt existierte. Wie wär's mit einem ![]() |
AW: Zweite Form öffnen
Jetzt funktioniert es, ja!
Werde ich mir mal anschauen, danke! |
AW: Zweite Form öffnen
Kleiner Tipp zur Namesgebung. Ich benenne Units mit Formularen immer mit FrmFoobar.pas. Units nur mit Quellcode ohne Prefix und aussagekräftigen Namen. Und die Unit mit dem Hauptformular mit main.pas. Die dpr Datei bekommet bzw. das Projekt den Namen, den die Exe haben soll.
|
AW: Zweite Form öffnen
Zitat:
Hierbei:
Delphi-Quellcode:
dürfte der Compiler eigentlich keinen undeklarieren Bezeichner anmeckern, wenn die Unit Loader_u wirklich so aussah wie in #5, auch wenn Loader_u nicht zum Projekt gehört. Es wäre "nur" zu einem Laufzeitfehler gekommen, weil eine Methode einer nicht vorhandenen Instanz aufgerufen wird.
uses Loader_u;
procedure TForm1.btn_loginClick(Sender: TObject); begin if (edt_usr.Text = 'admin') and (edt_pw.Text = 'admin') then begin Loader.Show; end; end. Evtl. gibt es zwei Versionen von Loader_u und durch die Aufnahme ins Projekt wird jetzt die richtige genommen. |
AW: Zweite Form öffnen
So wie der TE vorgegangen ist – statt Neues VCL-Formular den Menüpunkt Neues Projekt gewählt –, hat er damit auch eine Unit erstellt, nämlich die Mainunit des neuen Projekts. Die bindet er dann in das Hauptformular des ursprünglichen Projekts ein, ohne davon eine Instanz zu erzeugen. Daher kam übrigens mein Hinweis auf die Projektquelldatei. Was er da jetzt genau gemacht hat, um den Fehler zu erzeugen, kann nur der TE aufklären. Mich interessiert das eigentlich nicht mehr.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:27 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