AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verhindern, dass eine Form erzeugt wird.

Ein Thema von WIng2005 · begonnen am 9. Apr 2009 · letzter Beitrag vom 12. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#1

Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 15:53
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!
MFG
Steffen
  Mit Zitat antworten Zitat
khh

Registriert seit: 18. Apr 2008
Ort: Südbaden
1.926 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 15:55
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.
Karl-Heinz
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#3

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 16:04
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
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 16:06
Du prüfst sicherlich im Ereignis onformcreate und nicht im eigentlichen constructor.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 16:06
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?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 16:38
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#7

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 21:14
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<>'losthen
  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)?
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 9. Apr 2009, 22:00
Autsch, du übergibst dem aufgerufenen Konstruktor die Variable Form2 als Besitzer deines neu erzeugten Formulars vom Typ TForm2?
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
WIng2005

Registriert seit: 20. Mär 2006
Ort: Thüringen
388 Beiträge
 
Delphi XE Starter
 
#9

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 11. Apr 2009, 01:32
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<>'losthen
  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.....
MFG
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Verhindern, dass eine Form erzeugt wird.

  Alt 11. Apr 2009, 01:37
Du musst schreiben: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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:18 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