![]() |
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! |
Re: Verhindern, dass eine Form erzeugt wird.
Zitat:
das solltest schon etwas näher erklären. |
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 |
Re: Verhindern, dass eine Form erzeugt wird.
Du prüfst sicherlich im Ereignis onformcreate und nicht im eigentlichen constructor.
|
Re: Verhindern, dass eine Form erzeugt wird.
Zitat:
|
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:
Das muss natürlich entsprechend angepasst werden und sauber umgesetzt werden, aber das soll auch nur als Beispiel dienen wie ich das meine.
procedure TForm1.Button1Click(Sender: TObject);
begin if not TFormX.CreateForm(Self) then ShowMessage('Unzureichende Rechte'); end; 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: |
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:
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)?
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. |
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. |
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:
Könntest du mal ein paar worte zum Thema "Besitzer" verlieren?
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; 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..... |
Re: Verhindern, dass eine Form erzeugt wird.
Du musst schreiben:
Delphi-Quellcode:
Oder nur inherited; (denn die Parameter sind identisch, dann geht das auch).
inherited Create(AOwner);
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 14:23 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