Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Form zur Laufzeit (https://www.delphipraxis.net/183720-form-zur-laufzeit.html)

Plastewolf 30. Jan 2015 18:11


Form zur Laufzeit
 
Hallo miteinander,

Ich bin gerade dabei ein Programm zu entwickeln in dem es des öfteren vorkommt, dass man mittels eines Buttons kleinere Fenster öffnet die nur von kurzer Dauer benötigt werden. Daher dachte ich mir das es vermutlich ganz sinnvoll ist diese Formulare zur Laufzeit dynamisch zu erstellen. Also wollte ich anfangen die bestehenden Formulare zu konvertieren. Dies klappt auch soweit Problemlos, jedoch erhalte ich eine "Zugriffsverletzung" ohne nähere Informationsangaben sobald Ich den "OK" Button betätige. Der Fehler wird zweifelsfrei von der "FindComponent" Funktion ausgelöst. Ich gehe davon aus das ich das Handle des Formulares nicht korrekt übergeben habe. Ich hoffe Ihr könnt mir helfen den Fehler zu finden :).

PS: Das Formular hat in dieser Variation funktioniert, als Ich diesen noch in dem .pas-File des Hauptformulares integriert hatte, aber seit ich den Code in eine eigene Unit verschoben habe tritt dieser Fehler auf.



Delphi-Quellcode:
unit Form_Auth;

interface

uses
  Windows,
  Graphics,
  Classes,
  Forms,
  Dialogs,
  StdCtrls,
  Datenbank,
  Funktionen_Login;

type
  TAuth_Form = class(TForm)
  private
    procedure Auth_Button_Click(Sender: TObject);
    procedure Auth_Key_Press(Sender: TObject; var Key: Char);
    procedure Auth_Form_Destroy(Sender: TObject);
  public
    procedure Auth_Form_Create(Sender: TObject);
  end;

var
  Auth_Form  : TAuth_Form;
  Auth_PN    : TEdit;
  Auth_Button : TButton;

implementation



procedure TAuth_Form.Auth_Form_Create(Sender: TObject);
begin
  Auth_Form            := TAuth_Form.Create(nil);
  Auth_PN              := TEdit.Create(Auth_Form);
  Auth_Button          := TButton.Create(Auth_Form);


  Auth_Form.Caption    := 'PN';
  Auth_Form.Name       := 'Login';
  Auth_Form.Width      := 166;
  Auth_Form.Height     := 75;
  Auth_Form.Position   := poScreenCenter;
  Auth_Form.BorderStyle := bsDialog;
  Auth_Form.OnDestroy  := Form_Auth.Auth_Form.Auth_Form_Destroy;


  Auth_PN.Parent       := Auth_Form;
  Auth_PN.Name         := 'Auth_PN_Edit';
  Auth_PN.Text         := '';
  Auth_PN.Left         := 5;
  Auth_PN.Top          := 5;
  Auth_PN.Width        := 110;
  Auth_PN.MaxLength    := 8;
  Auth_PN.Font.Size    := 14;
  Auth_PN.Font.Style   := [fsBold];
  Auth_PN.OnKeyPress   := Form_Auth.Auth_Form.Auth_Key_Press;


  Auth_Button.Parent   := Auth_Form;
  Auth_Button.Left     := 119;
  Auth_Button.Top      := 5;
  Auth_Button.Width    := 30;
  Auth_Button.Height   := 30;
  Auth_Button.Caption  := 'OK';
  Auth_Button.OnClick  := Form_Auth.Auth_Form.Auth_Button_Click;

  try
    Auth_Form.ShowModal;
  finally
    Auth_Form.Free;
  end;
end;




procedure TAuth_Form.Auth_Form_Destroy(Sender: TObject);
begin
  If Form2.Login_State = False then ExitProcess(0);
end;




procedure TAuth_Form.Auth_Button_Click(Sender: TObject);
begin
  If Length(TEdit(Auth_Form.FindComponent('Auth_PN_Edit')).Text) = 8 then
    begin
      Form2.Username := TEdit(Auth_Form.FindComponent('Auth_PN_Edit')).Text;
      Funktionen_Login.Login;
    end
  Else Showmessage('Bitte gültige PN eingeben!');
 
  If Form2.Login_State = True then Auth_Form.Close;
end;




procedure TAuth_Form.Auth_Key_Press(Sender: TObject; var Key: Char);
begin
  If not (Key in ['0'..'9', Char(VK_BACK)]) then Key := #0;
end;




end.

BadenPower 30. Jan 2015 18:26

AW: Form zur Laufzeit
 
Wer ist "Form2" ?


Aber warum erstellst Du das Fenster nicht in der IDE und erstellst bei Bedarf eine Insatnz des Fensters?

Plastewolf 30. Jan 2015 18:32

AW: Form zur Laufzeit
 
Zitat:

Zitat von BadenPower (Beitrag 1288353)
Wer ist "Form2" ?

Form2 ist das Hauptprogramm. Ich habe damals als kleines "Test-Projekt" damit angefangen, jedoch wurde das Projekt im Laufe der Zeit ernst und damit auch entsprechend Größer. Form2 ist das einzige Formular in dem gesamten Programm, welches noch den "Original-Titel" trägt. Ich war damals zu Faul alles händisch umzubenennen, jedoch weiß jeder was mit diesem Form gemeint ist, daher stellt das kein Problem dar.

Zitat:

Zitat von BadenPower (Beitrag 1288353)
Aber warum erstellst Du das Fenster nicht in der IDE und erstellst bei Bedarf eine Insatnz des Fensters?

Ich möchte das Programm soweit umbauen das es über eine Art "Plugin-Schnittstelle" läuft, das bedeutet ich liefere die einzelnen Formulare über ein Plugin-File nach und je nach dem was sich in dem späteren Plugin-Ordner befinden wird, werden die Funktionen des Programmes dynamisch erweitert. Dies soll den ersten Test dafür darstellen. Natürlich bin ich mir bewusst das dieses Beispiel noch nicht ausgereift ist, aber ich habe ja auch gerade erst damit angefangen.

Grüße

Plastewolf 2. Feb 2015 07:00

AW: Form zur Laufzeit
 
Hat sich erledigt. Ich habe einfach "CreateNew" statt "Create" verwendet.


Leider kann ich meinen Originalpost nicht editieren, daher das "Offene Frage" nicht herausnehmen.

Bernhard Geyer 2. Feb 2015 08:29

AW: Form zur Laufzeit
 
Auth_PN und Auth_Button Sollten Membervariablen von TAuth_Form sein.
Damit kannst du dir auch das vollkommen unnötige FindComponent sparen sondern einfach mit den Membervariablen arbeiten. Und die .Name-Zuweisungen sind bei dynamisch erzeuten Controls auch vollkommen unnötig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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