Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Form nur einmal anzeigbar (https://www.delphipraxis.net/38653-form-nur-einmal-anzeigbar.html)

Barret 22. Jan 2005 11:21


Form nur einmal anzeigbar
 
Hi!
Ich hab da ein Problem mit ner Form. undzwar kann ich diese nur einmal öffnen. Beim zweiten mal heut er mir immer einem Fehler raus: "ElnvalidException: Eigenschaft Viseble kann in OnShow oder OnHide nicht verändert werden." Ich seh den Fehler aber nich. Die Form wird normal in ShowModal aufgerufen. Ich setz zwar ein paar Viseble zustände aber wenn man die doppelt setzt sollte das eigentlich nichts machen. An sonsten für ich nur an einer oder zwei stellen FormShow(self) aus. Auch diese Sache sollte im normalfall aber keine Probleme darstellen.
ich setz den code mal rein (unwichtige proceduren sind nicht enthalten (berechnungen laden von datein ...)):
Code:
var
  FFVConfig: TFFVConfig;
  iOK_Abbrum_Zustand : Integer = 1; //Definieren der ausgelösten Aktion im Menue (OK & Abbrechen)

implementation

{$R *.dfm}

//verwendete Dateien & Biblioteken ---------------------------------------------
uses IniFiles, UFVMain, UFVConfigTableload;

//Schliesen der Form -----------------------------------------------------------
procedure TFFVConfig.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  TblConfig.Close; //schliesen der Datanbank
  DoubleBuffered := false;
end;

//Anzeigen der Form ------------------------------------------------------------
procedure TFFVConfig.FormShow(Sender: TObject);
begin
  TblConfig.Open; //Datenbank öffnen

  //darstellungs Angaben
  Height := 150;
  Width := 296;
  Position := poMainFormCenter;

  GroupBoxEinstellungen.Visible := false;
  GroupBoxPassWdaendern.Visible := false;
  GroupBoxPasswort.Visible := true;

  Tableshow;

  MenueOption.Visible := true;
  MenueNeu.Visible := false;
  ResetComp(FFVConfig);

  iOK_Abbrum_Zustand := 1; //Steuerung für das Startmenue
end;

//OK-Button in Passwortabfrage -------------------------------------------------
procedure TFFVConfig.BtnPassWdOKClick(Sender: TObject);
begin
  if (EdtPassWd.Text = TblConfig.FieldByName('PASSWD').AsString) then
    begin
      GroupBoxEinstellungen.Visible := true;
      GroupBoxPasswort.Visible := false;
      GroupBoxPassWdaendern.Visible := false;
      iOK_Abbrum_Zustand := 2;

      Height := 600;
      Width := 800;
      Left := FFVMain.left;
      Top := FFVMain.Top;
    end
    else
      begin
        EdtPassWd.Clear;
        EdtPassWd.SetFocus;
      end;
end;

//Passwort ändern --------------------------------------------------------------
procedure TFFVConfig.MenuePasswortClick(Sender: TObject);
begin
  Height := 190;
  Width := 296;

  GroupBoxEinstellungen.Visible := false;
  GroupBoxPasswort.Visible := false;
  GroupBoxPassWdaendern.Visible := true;

  MenueNeu.Visible := true;
  MenueOption.Visible := false;

  EdtPassWdaendern1.SetFocus;
  iOK_Abbrum_Zustand := 3;
end;

//Abbrechen-Button in Passwort ändern ------------------------------------------
procedure TFFVConfig.BtnPassWdaendernAbbrechenClick(Sender: TObject);
begin
  FormShow(Self);
  EdtPassWd.SetFocus;
end;

//OK-Button im Startmenue ------------------------------------------------------
procedure TFFVConfig.MenueOKClick(Sender: TObject);
begin
  if (iOK_Abbrum_Zustand = 1) then
    begin
      BtnPassWdOK.Click;
      Exit; //ohne := BtnOK.Click
    end;

  if (iOK_Abbrum_Zustand = 2) then BtnConfigOK.Click;
  if (iOK_Abbrum_Zustand = 3) then BtnPassWdaendernOK.Click;
end;

//Abbrechen-Button im Startmenue -----------------------------------------------
procedure TFFVConfig.MenueAbbrechenClick(Sender: TObject);
begin
  if (iOK_Abbrum_Zustand = 1) then BtnPassWdAbbrechen.Click;
  if (iOK_Abbrum_Zustand = 2) then BtnConfigAbbrechen.Click;
  if (iOK_Abbrum_Zustand = 3) then BtnPassWdaendernAbbrechen.Click;
end;

end.
das is jetz alles wo cih irgendwas grafisches ändere.
Wenn die Form geöffnet wird sie doppelt gebuffert (erkärung im onClose).

SirThornberry 22. Jan 2005 11:26

Re: Form nur einmal anzeigbar
 
wie schließt du das Formular wieder? hoffentlich doch mit "modalresult :="?
und das
Delphi-Quellcode:
DoubleBuffered := false;
macht im onClose auch keinen Sinn. Wenn das Form nicht sichtbar ist stört das Doublebuffered doch nicht.

(wenn du anstelle der "Code"-Tags das "Delphi-Code" Tag nimmst werden die schlüsselworte etc. auch fett dargestellt etc. - eben wie in der ide)

gsh 22. Jan 2005 11:28

Re: Form nur einmal anzeigbar
 
Schmeiss mal alles raus was du bei Onshow oder OnHide so hast. den ich glaube die größe andern wenn er die form anzeigt mag er nicht.
Außerdem würde ich die DoubeleBufferung ein beihalten wenn du sie schon brauchst.

PS: HAst du schon versucht schrit für schritt zu debuggen ???

Barret 22. Jan 2005 11:29

Re: Form nur einmal anzeigbar
 
Im OnClose Ereigniss hab ich nur zu stehen:
Code:
procedure TFFVConfig.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DoubleBuffered := false;
  TblConfig.Close; //schliesen der Datanbank
end;

"schrit für schritt zu debuggen": hab ich schon gemacht. Der Debugger zeigt mir den Fehler in der OnShow zeile direkt an. OnHide hab ich nichts nur OnShow...Aber wo sollte ich das dan mit reinschreiben wenn nicht da??? Weil es ja beim ersten mal funktioniert.

SirThornberry 22. Jan 2005 11:59

Re: Form nur einmal anzeigbar
 
wie du das form schließt hast du aber immer noch nicht geschrieben. Wie schon gesagt solltest du das ganze auch nicht im onShow machen. Machs einfach ins OnCreate oder führe es einfach aus bevor du showmodal aufrufst. Zum beispiel so:
Delphi-Quellcode:
procedure TFFVConfig.Execute;
begin
  TblConfig.Open; //Datenbank öffnen

  //darstellungs Angaben
  Height := 150;
  Width := 296;
  Position := poMainFormCenter;

  GroupBoxEinstellungen.Visible := false;
  GroupBoxPassWdaendern.Visible := false;
  GroupBoxPasswort.Visible := true;

  Tableshow;

  MenueOption.Visible := true;
  MenueNeu.Visible := false;
  ResetComp(FFVConfig);

  iOK_Abbrum_Zustand := 1; //Steuerung für das Startmenue

  ShowModal;
end;

Robert_G 22. Jan 2005 12:42

Re: Form nur einmal anzeigbar
 
Delphi-Quellcode:
var
  FFVConfig: TFFVConfig;
  iOK_Abbrum_Zustand : Integer = 1; //Definieren der ausgelösten Aktion im Menue (OK & Abbrechen)

implementation
Ich habe mir deinen Code nicht weiter als bis dort angesehen. Du verwendest 2 globale Variablen. -> Seeehr unsauber. ;)
Beide Instanzen der FormKlasse greifen darüber auf die gleichen Objekte zu. Es ist also wahrscheinlich, dass es deshlab bei dir knallt.
Mein Tipp ist:
Schmeiße immer alle globalen Variablen raus, die der Form designer anlegt.
Um in der projekt datei Trotzdem ein Hauptformular setzen zu können reicht das:
Delphi-Quellcode:
var
  PlaceHolder :TObject;
begin
  ...
  Application.Createform(TDeineFormKlasse, PlaceHolder);
  ...
end;
Die Variablen werden nur beim Anlegen der Form Unit gesetzt und danach nicht wieder neu angelegt. ;)


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