Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verhindern, dass eine Form erzeugt wird. (https://www.delphipraxis.net/132308-verhindern-dass-eine-form-erzeugt-wird.html)

WIng2005 9. Apr 2009 14:53


Verhindern, dass eine Form erzeugt wird.
 
Hallo Gemeinde,

eigentlich sollte doch eine Exception im Konstruktor verhindern, dass ein Objekt erzeugt wird.
Wenn ich nun nun verhindern möchte, dass eine Form erzeugt wird, wie müßte ich dann vorgehen?



Vielen Dank für eure Hilfe!

khh 9. Apr 2009 14:55

Re: Verhindern, dass eine Form erzeugt wird.
 
Zitat:

Zitat von WIng2005
Hallo Gemeinde,

eigentlich sollte doch eine Exception im Konstruktor verhindern, dass ein Objekt erzeugt wird.
Wenn ich nun nun verhindern möchte, dass eine Form erzeugt wird, wie müßte ich dann vorgehen?



Vielen Dank für eure Hilfe!


das solltest schon etwas näher erklären.

WIng2005 9. Apr 2009 15:04

Re: Verhindern, dass eine Form erzeugt wird.
 
OK..
Vereinfacht ausgedrückt:

im OnClick-Event von Button1 (auf Form1) wird ein neues Formular (Form2) erzeugt. Nun möchte ich jedoch prüfen, ob die nötigen Berechtigungen zur Anzeige von Form2 vorhanden sind (könnte man auch vorab im Click-Event vorab prüfen, es interessiert mich prinzipiell, ob es auch andersrum möglich wäre). Nun dachte ich, dass ich im Create der Form2 die Prüfung durchführe und ggf. eine Exception werfe, was das Erzeugen der Form2 verhindert. Der Fehler wird auch entsprechend abgefangen und angezeigt, nur wird das Formular danach trotzdem erzeugt.

MFG
Steffen

sirius 9. Apr 2009 15:06

Re: Verhindern, dass eine Form erzeugt wird.
 
Du prüfst sicherlich im Ereignis onformcreate und nicht im eigentlichen constructor.

Bernhard Geyer 9. Apr 2009 15:06

Re: Verhindern, dass eine Form erzeugt wird.
 
Zitat:

Zitat von WIng2005
Nun dachte ich, dass ich im Create der Form2 die Prüfung durchführe und ggf. eine Exception werfe, was das Erzeugen der Form2 verhindert.

Bist du wirklich im Konstruktor (Constructor Create(AOwner: ...)) oder im OnCreate-Event deiner Formularklasse?

jaenicke 9. Apr 2009 15:38

Re: Verhindern, dass eine Form erzeugt wird.
 
Du könntest auch eine Klassenmethode erstellen, die das prüft und das Fenster ggf. anzeigt. So musst du dich an anderer Stelle darum nicht kümmern:
Delphi-Quellcode:
TFormX = class(TForm)
...
public
  class function CreateForm(AOwner: TComponent): Boolean;
Delphi-Quellcode:
class function TFormX.CreateForm(AOwner: TComponent): Boolean;
begin
  Result := ( ... Prüfung ...)

  if Result then
  begin
    FormX := TFormX.Create(AOwner);
    FormX.Show;
  end;
end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not TFormX.CreateForm(Self) then
    ShowMessage('Unzureichende Rechte');
end;
Das muss natürlich entsprechend angepasst werden und sauber umgesetzt werden, aber das soll auch nur als Beispiel dienen wie ich das meine.

Die Variable für das erzeugte Formularobjekt kann ggf. auch zurückgegeben werden oder als out-Parameter übergeben werden, ...
Da kann man sehr viel entsprechend anpassen. :mrgreen:

WIng2005 9. Apr 2009 20:14

Re: Verhindern, dass eine Form erzeugt wird.
 
Hallo,

dass mit der Klassenmethode ist sicherlich auch eine elegante Möglichkeit. Der Beweggrund diese Threats war, dass in meinem Projekt der Construktor scheinbar ignoriert wurde (ich muss am Dienstag erstmal schauen, was ich da verzapft hatte). Versuche ich das Ganze mal exemplarisch in einer neuen Anwendung gehts:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
 uses unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.create();
Form2.Show;
end;

end.


////////////////////////////////////////////////////////////////

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm2 = class(TForm)
  private
    { Private-Deklarationen }
  public
    constructor create();
  end;

var
  Form2: TForm2;

implementation
uses unit1;
{$R *.dfm}

constructor TForm2.create();
Begin
if form1.Edit1.Text<>'los' then
  raise exception.Create('Fehler');
     
inherited create(Form2);
end;
end.
Wäre dies eine Möglichkeit, oder ist das eher unsauber? Ist es sinvoller das ganze in die Klasse zu verlagern (siehe Beitrag von jaenicke)?

jaenicke 9. Apr 2009 21:00

Re: Verhindern, dass eine Form erzeugt wird.
 
Autsch, du übergibst dem aufgerufenen Konstruktor die Variable Form2 als Besitzer deines neu erzeugten Formulars vom Typ TForm2? :shock:
Jedenfalls rufst du deinen Konstruktor vermutlich wegen des fehlenden Parameters gar nicht auf, wenn du das da genauso hattest und TForm2.Create(Self) oder so geschrieben hast...

Richtigerweise müsstest du deinem Konstruktor einen Besitzer als Parameter übergeben und den auch an den geerbten Konstruktor weitergeben. Schau dir doch den Konstruktor im Quelltext (Unit Forms bzw. Strg + Klick auf das Create nach dem inherited) an.

WIng2005 11. Apr 2009 00:32

Re: Verhindern, dass eine Form erzeugt wird.
 
Hallo,

ich bin mit der Thematik noch nich wirklich vertraut, aber schließlich ist man ja lernfähig :).
Liege ich mit folgendem korrigiertem Code diesmal richtig?:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:=TForm2.create(Form2);
Form2.Show;

end;


//////////////////////////////

constructor TForm2.create(AOwner: TComponent);
Begin
if form1.Edit1.Text<>'los' then
  raise exception.Create('Fehler');

inherited create(Form2);
end;
Könntest du mal ein paar worte zum Thema "Besitzer" verlieren?
Wo würde der zum obigen Beispiel der Unterschied sein, wenn ich statt TForm2.create ein application.createform(TForm2,Form2)
einsetze? Vielen Dank für deine Hilfe.....

jaenicke 11. Apr 2009 00:37

Re: Verhindern, dass eine Form erzeugt wird.
 
Du musst schreiben:
Delphi-Quellcode:
inherited Create(AOwner);
Oder nur inherited; (denn die Parameter sind identisch, dann geht das auch).

Wenn du eine VCL-Komponente erzeugst, dann hat diese die Eigenschaften Parent und Owner. Parent ist die Komponente, auf der sie angezeigt wird, wenn du sie also visuell auf ein Panel legst, dann ist dieses Panel die Parentkomponente.

Der Besitzer wiederum kümmert sich um die Freigabe aller Komponenten, die er besitzt. Wenn du also eine Komponente manuell erzeugst und ihr einen Owner übergibst, dann kümmert der sich bei seiner Freigabe auch um die Freigabe dieser Komponente. Wenn du als Besitzer nil übergibst, dann musst du dich um die Freigabe selbst kümmern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
Seite 1 von 2  1 2      

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