![]() |
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:
das is jetz alles wo cih irgendwas grafisches ändere.
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. Wenn die Form geöffnet wird sie doppelt gebuffert (erkärung im onClose). |
Re: Form nur einmal anzeigbar
wie schließt du das Formular wieder? hoffentlich doch mit "modalresult :="?
und das
Delphi-Quellcode:
macht im onClose auch keinen Sinn. Wenn das Form nicht sichtbar ist stört das Doublebuffered doch nicht.
DoubleBuffered := false;
(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) |
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 ??? |
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. |
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; |
Re: Form nur einmal anzeigbar
Delphi-Quellcode:
Ich habe mir deinen Code nicht weiter als bis dort angesehen. Du verwendest 2 globale Variablen. -> Seeehr unsauber. ;)
var
FFVConfig: TFFVConfig; iOK_Abbrum_Zustand : Integer = 1; //Definieren der ausgelösten Aktion im Menue (OK & Abbrechen) implementation 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:
Die Variablen werden nur beim Anlegen der Form Unit gesetzt und danach nicht wieder neu angelegt. ;)
var
PlaceHolder :TObject; begin ... Application.Createform(TDeineFormKlasse, PlaceHolder); ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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