Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zur Laufzeit erstellte Form nur einmal öffnen (https://www.delphipraxis.net/7859-zur-laufzeit-erstellte-form-nur-einmal-oeffnen.html)

Matze 23. Aug 2003 10:36


Zur Laufzeit erstellte Form nur einmal öffnen
 
Hi!

Code:
procedure TForm1.BitBtn1Click(Sender: TObject);
var Fenster: TForm;
begin
  Fenster:=TForm.Create(self);
  Fenster.Caption:='Hallo';
  Fenster.Show;
end;
Jetzt ist es so, dass wenn ich auf den BitBtn klicke jedesmal ein neues Fenster geöffnet wird. Ich möchte es allerdings nur einmal öffnen, auch, wenn ich öffters auf den BitBtn klicke.

So geht's nicht:

Code:
var
  mHandle: THandle;
  DatName:String;

initialization

  DatName:=ExtractFileName(Fenster.Caption);
  DatName:=Copy(DatName,1,Length(datName)-4);
  mHandle := CreateMutex(Nil, True,PChar(DatName));
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    ShowMessage('Programm bereits gestartet');
    Halt;
  end;
finalization
  if mHandle <> 0 then CloseHandle(mHandle);
Kann mir jemand helfen??

Gruß Matze

bixi400 23. Aug 2003 10:51

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
So? :
Delphi-Quellcode:
unit Unit1;

interface

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

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

var
  Form1: TForm1;
  WinOpen:Boolean;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var Fenster: TForm;
begin
  if WinOpen=False then
   begin
     Fenster:=TForm.Create(self);
     Fenster.Caption:='Hallo';
     Fenster.Show;

     WinOpen:=True;
   end
    else
   begin
     ShowMessage('Programm bereits gestartet');
   end;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WinOpen:=False;
end;

end.

Matze 23. Aug 2003 11:03

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Danke für die schnelle Hilfe, das habe ich gesucht! :D

Gruß Matze

Matze 23. Aug 2003 11:10

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Jetz bräuchte ich nur noch eins:

Wenn ich das zur Laufzeit erstellte Fenster wieder schließe, dann soll WinOpen wieder auf false gesetzt werden, wie mache ich das? Da gibt es ja kein OnClose.

Gruß Matze

bixi400 23. Aug 2003 11:12

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Gute Frage!
Das Weiß ich auch nicht!

kiar 23. Aug 2003 12:04

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
hi matze, du erstellst eine instanz von tform, da sollten zur laufzeit auch alle ereignisse drin sein oder habe ich schon wieder zu viel getrunken :dance:

Matze 23. Aug 2003 13:20

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Danke, ich probier's mal, obwohl ich nicht so recht weiß, wie das gehen soll. :wink:

sakura 23. Aug 2003 13:24

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
@Matze, ich poste Dir gleich was. Vorher will ich aber wissen, wenn das Form ausgeblendet wird, soll es zerstört werden (eingegebene Daten gehen verloren) oder soll es nur versteckt werden, so daß beim nächsten Öffnen die alten Daten wieder da sind?

...:cat:...

Matze 23. Aug 2003 13:29

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Es wäre nett, wenn du mir beides posten könntest, aber Destroy geht auch.

Christian Seehase 23. Aug 2003 13:43

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Moin Matze,

warum wird der Button nicht einfach auf Disabled gesetzt?
Ich finde das sauberer, als einen Button aktiv zu lassen, der nicht gedrückt werden darf.

Soll das Fenster nur geschlosssen werden, könnest Du im OnClose Event den Button wieder auf Enabled setzen, soll es zerstört werden, dann im OnDestroy.

sakura 23. Aug 2003 13:48

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Okay, gehen wir mal von der Annahme aus, daß Du zwei Formulare hast. HauptForm: THauptForm1 ist Dein, klar, Hauptformular. OnOffForm: TOnOffForm ist jenes Formular, welches immer mal wieder zu sehen sein soll.

Wenn Du mal in die Units Deiner beiden Formulare schaust, dann sieht Du direkt vor der Anweisung implementation folgende Zeilen (entsprechend der Benennung der Formulare).

Delphi-Quellcode:
var
  Form1: TForm1;

implementation
Damit ist schon einmal eine Variable für Dein zweites Formular (im Beispiel: OnOffForm: TOnOffForm) definiert.

Jetzt aber ans Eingemachte

Es sind nur zwei Dinge, die Du jetzt tun musst :-)

Der erste Teil

In Deinem Hauptformular empfehle ich Dir eine Methode zu erstellen, welche sich um die Darstellung des OnOffForm kümmert. In Grün der einzufüllende Code.

Code:
type
  THauptForm = class(TForm)
    ...
  private
    ...
  public
    ...
    [color=#008000]procedure ShowOnOffForm;[/color]
    ...
  end;

[color=#008000]procedure THauptForm.ShowOnOffForm;
begin
  if OnOffForm = nil then
    OnOffForm := TOnOffForm.Create(Application);
  OnOffForm.Show;
  OnOffForm.BringToFront;
end;[/color]
Diese Methode (ShowOnOffForm) rufst Du immer auf, wenn Du das OnOffForm anzeigen möchtest.

Der zweite Teil

Im Design-Editor gehst Du jetzt zum zweiten Form, dem OnOffForm und wählst für dieses im Objekt Inspektor das Ereignis OnClose aus.

Im Code Editor musst Du jetzt nur ein oder zwei Zeilen - je nach Aufgabe eingeben. In Blau siehst Du Option 1 (Daten werden wieder angezeigt, wenn das Form das nächste Mal aufgerufen wird. In Rot Option 2, das Form kommt im Originalzustand wieder zurück.

Code:
procedure TOnOffForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  [color=#0000ff]// Das Form nur verstecken (Daten bleiben erhalten)
  Action := caHide;[/color]

  [color=#e30000]// Das Form zerstören (Daten bleiben nicht erhalten)
  Action := caFree;
  OnOffForm := nil;[/color]
end;
So, das waren Theorie und Praxis ;-)

...:cat:...

Matze 23. Aug 2003 13:52

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Vieln Dank sakura für deine Mühe!

Ich werde jetzt mal mein Glück damit versuchen. :wink:

Gruß Matze

Matze 23. Aug 2003 14:34

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
@Sakura: Im Design-Editor kann ich nicht auf meine zur Laufzeit erstellten Form klicken. Ist ja eigentlich logisch.

Ich möchte dann, dass die zur Laufzeit erstellte Form nur einmal geöffnet werden kann (siehe Bixi400). Jedoch sollte WinOpen wieder auf false gesetzt werden, sobald ich die zur Laufzeit erzeugte Form schließe.

Ich hoffe, ich hab's verständlich erklärt. :wink:

[Edit]Sorry! Hat sich erledigt Sakura, nochmal Danke.[/Edit]

Gruß Matze

sakura 23. Aug 2003 14:38

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Okay. Den Teil habe ich wohl übersehen :oops: Dann ändere Dein Hauptform wie folgt:

Delphi-Quellcode:
type
  THauptForm = class(TForm)
    ...
  private
    FOnOffForm: TForm;
    procedure OnOffFormClose(Sender: TObject; var Action: TCloseAction);
    ...
  public
    ...
    procedure ShowOnOffForm;
    ...
  end;

procedure THauptForm.ShowOnOffForm;
begin
  if FOnOffForm = nil then
  begin
    FOnOffForm := TOnOffForm.Create(Application);
    FOnOffForm.OnClose := OnOffFormClose;
  end;
  FOnOffForm.Show;
  FOnOffForm.BringToFront;
end;

procedure THauptForm.OnOffFormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Das Form nur verstecken (Daten bleiben erhalten)
  Action := caHide;

  // BEZIEHUNGSWEISE

  // Das Form zerstören (Daten bleiben nicht erhalten)
  Action := caFree;
  FOnOffForm := nil;
end;
..:cat:...

sakura 23. Aug 2003 14:39

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Zitat:

Zitat von Matze
[Edit]Sorry! Hat sich erledigt Sakura, nochmal Danke.[/Edit]

:wall: Jetzt wo ich fertig bin :wall: Egal, vielleicht hilft es mal jemand anders ;-)

...:cat:...

Matze 23. Aug 2003 14:42

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
@Sakura: Ich meinte, ich habe es mit deinem Code doch geschafft.
Ich habe nur vergessen gehabt, ShowOnOffForm aufzurufen. :wink:

Ich nehme deinen Code, du hast es also nicht umsonst gemacht. *dankt sakura*

Gruß matze

sakura 23. Aug 2003 14:45

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Zitat:

Zitat von Matze
Ich habe nur vergessen gehabt, ShowOnOffForm aufzurufen. :wink:

Der ist gut. :mrgreen:

Freut mich, dass es funktioniert hat für Dich ;-)

...:cat:...

Matze 23. Aug 2003 14:48

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Aber wie bekomme ich das hier hin?:

Zitat:

procedure TOnOffForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// Das Form nur verstecken (Daten bleiben erhalten)
Action := caHide;

// Das Form zerstören (Daten bleiben nicht erhalten)
Action := caFree;
OnOffForm := nil;
end;
Ich kann die zur Laufzeit erzeugte Form ja nicht anklicken.

sakura 23. Aug 2003 14:50

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Zitat:

Zitat von Matze
Ich kann die zur Laufzeit erzeugte Form ja nicht anklicken.

Mal doof frag: Wieso denn nicht :?: :shock:

Ansonsten einfach

Delphi-Quellcode:
OnOffForm.Close;
aufrufen.

...:cat:..

Matze 23. Aug 2003 14:53

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Ich meine, wie soll ich denn in Delphi diese Form anklicken und dann im OI bei Ereignisse was einstellen??

sakura 23. Aug 2003 14:54

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Schau Dir mal meinen zweiten Post an, da ist die u.a. Methode ShowOnOffForm modifieziert und da wird das OnClose Ereignis dem zweiten Form zugewiesen.

...:cat:...

Matze 23. Aug 2003 15:00

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Das haut bei mir nicht hin:

Zitat:

var
HauptForm: THauptForm;
OnOffForm: TOnOffForm;

implementation

{$R *.dfm}

sakura 23. Aug 2003 15:05

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Du musst den Namen des HauptForm so lassen, wie Delphi ihn benannt hat. ;-) OnOffForm ist in Deinem Fall eher vom Typ TForm

...:cat:...

Matze 23. Aug 2003 15:07

Re: Zur Laufzeit erstellte Form nur einmal öffnen
 
Danke!

Jetzt geht's. :oops:

Gruß Matze


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