AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi FormCloseQuery FormShowing abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

FormCloseQuery FormShowing abfrage

Ein Thema von Capa · begonnen am 23. Feb 2011 · letzter Beitrag vom 26. Feb 2011
Antwort Antwort
Seite 1 von 2  1 2      
Capa

Registriert seit: 26. Okt 2003
102 Beiträge
 
RAD-Studio 2010 Arc
 
#1

FormCloseQuery FormShowing abfrage

  Alt 23. Feb 2011, 20:29
Also immo sieht mein Code so aus
der soll quasi abfragen ob noch eine Form offen ist und wenn nicht schliessen
ansonsten fehlermeldung.
Soweit so gut nun hab ich das Problem das ständig neue Forms dazu kommen da
dachte ich mir muss das ganze etwas vereinfachen und hab eine version geschrieben
wo ich nur nen integer wert ändern muss.
nun funzt das aber nicht so wirklich.

Alte Version:
Delphi-Quellcode:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := False;
  if (not Form2.Showing) then
    if (not Form3.Showing) then
      if (not Form4.Showing) then
        if (not Form5.Showing) then
          if (not Form6.Showing) then
           if (not Form7.Showing) then
            CanClose := True;

  if (not CanClose) then
    MessageDlg('Bitte erst alle Fenster schließen bevor das Hauptfenster geschlossen wird!', mtError, [mbOK], 0);
end;
Neue Version:
Delphi-Quellcode:
var maxfom: integer;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var i,L: integer;
begin
  CanClose := False;
  L := 1;
  for i := 2 to maxform do // fängt mit 2 an weil Form1 ja nicht abgefragt werden soll.
  begin
    if (not TForm('Form'+inttostr(i)).Showing) then
      L := L + 1
  end;

  if (L = maxform) then
    Canclose := True;

  if (not CanClose) then
    MessageDlg('Bitte erst alle Fenster schließen bevor das Hauptfenster geschlossen wird!', mtError, [mbOK], 0);
end;
im OnCreate wird noch die aktuelle Anzahl der Forms gesetzt steht immo bei 8.

Das Problem ist das der nun auch das fenster schliesst wenn noch ne form offen ist, was ja damit normalerweile verhindert werden soll. Sieht jemand nen Fehler da drin den ich seh irgendwie keinen
is ja im endeffekt nix anderes als die obere version


An anderer Stelle hab ich folgenden Code:
Delphi-Quellcode:
  for i := 1 to maxform do
    TForm('Form'+inttostr(i)).Font := FontDialog1.Font;
nur bekomm ich da ne Zugriffsverletzung :/

"Zugriffsverletzung bei Adresse 004B2316 in Modul 'Project1.exe'. Lesen von Adresse 00000000"

Geändert von Capa (23. Feb 2011 um 21:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MGC
MGC

Registriert seit: 15. Mai 2008
Ort: Helsa
106 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: FormCloseQuery FormShowing abfrage

  Alt 23. Feb 2011, 21:31
Schließt Dein Programm nur wenn noch 1 Form offen ist (außer dem Hauptform) oder auch wenn noch mehr Forms geöffnet sind?
Du schreibst maxforms = 8, prüfst aber nur die Forms 2-7 (=6).
Ich würde auch die Abfrage nicht undbedingt hardcoded gestalten, da Du Dir dadurch nur zusätzliche Arbeit bei späteren Erweiterungen machst.
Marc
  Mit Zitat antworten Zitat
Capa

Registriert seit: 26. Okt 2003
102 Beiträge
 
RAD-Studio 2010 Arc
 
#3

AW: FormCloseQuery FormShowing abfrage

  Alt 23. Feb 2011, 21:39
Es soll quasi nur dann schliessen wenn Form1 die einzige angezeigte form ist.

Zitat:
Du schreibst maxforms = 8, prüfst aber nur die Forms 2-7 (=6).
? wieso das
for i := 2 to maxform do der fängt mit Form2 an und hört mit Form8 auf hab da ja kein maxform-1 stehen
form 1 is ja klar das die noch angezeigt wird weils das hauptfenster ist, aber
alle anderen sollen geschlossen werden.

L := 1; und das was ich bei der for schleife mit 2 anfange hab ich vorher ja schon festgelegt bei L
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: FormCloseQuery FormShowing abfrage

  Alt 23. Feb 2011, 21:43
Moin Capa,

hier mal ein anderer Ansatz:


Delphi-Quellcode:
var
  i : Integer;

begin
  for i := 0 to Application.ComponentCount-1 do begin
    if Application.Components[i] is TForm then begin
      if (Application.Components[i] as TForm).Visible and
         ((Application.Components[i] as TForm).Tag = 1) then begin
        CanClose := False;
        break;
      end;;
    end;
  end;
  if not CanClose then MessageBox(self.Handle,'Erst alle anderen Formulare schliessen','Fehler',MB_ICONERROR);
end;
Alle Unterformulare bekommen, entweder manuell im Objektinspektor, oder per Programm im OnCreate die Eigenschaft Tag auf 1 gesetzt (Tag ist ein beliebig verwendbarer Integerwert).
Sobald eines sichbar ist, und Tag=1 ist darf das Hauptformular nicht geschlossen werden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Capa

Registriert seit: 26. Okt 2003
102 Beiträge
 
RAD-Studio 2010 Arc
 
#5

AW: FormCloseQuery FormShowing abfrage

  Alt 23. Feb 2011, 21:53
funzt super danke
dann weiß ich jetzt auch wie ich meine anderen Probleme lösen kann

Mfg Capa
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: FormCloseQuery FormShowing abfrage

  Alt 24. Feb 2011, 02:56
Wofür denn das Tag setzen? Nur um herauszufinden, ob die Form nicht die MainForm ist?

If MyForm <> Application.MainForm then Das geht immer und man kann dabei nichts vergessen (z.B. das Tag setzen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Capa

Registriert seit: 26. Okt 2003
102 Beiträge
 
RAD-Studio 2010 Arc
 
#7

AW: FormCloseQuery FormShowing abfrage

  Alt 24. Feb 2011, 12:23
Wenns mir um die Mainform gehen würde könnte ich auch name='Form1'; abfragen
aber so kann ich zum bsp auch das Programm schliessen lassen, wenn noch ne Form angezeigt wird
wo keine speicherrelevanten daten drin sind sondern nur anzeigen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

AW: FormCloseQuery FormShowing abfrage

  Alt 24. Feb 2011, 13:18
Könnte man nicht einfach Screen.FormCount abfragen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: FormCloseQuery FormShowing abfrage

  Alt 24. Feb 2011, 15:55
Diese MainForm prüft alle (mit Application als Owner) Formulare, ob diese sich schließen können.

Mit der Property CloseForce kann man das Schliessen erzwingen (was beim Abmelden/Herunterfahren -> WM_ENDSESSION auch gemacht wird).
Delphi-Quellcode:
unit frmMain;

interface

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

type
  TForm1 = class( TForm )
    procedure FormCloseQuery( Sender : TObject; var CanClose : Boolean );
    procedure FormCreate( Sender : TObject );
  private
    FCloseForce : Boolean;
  protected
    procedure WMEndSession( var message : TWMEndSession ); message WM_ENDSESSION;
  public
    property CloseForce : Boolean
      read FCloseForce
      write FCloseForce;
  end;

var
  Form1 : TForm1;

implementation

uses
  frmData;

{$R *.dfm}

procedure TForm1.FormCloseQuery( Sender : TObject; var CanClose : Boolean );
var
  idx : Integer;
begin
  if not CloseForce
  then
    for idx := 0 to Application.ComponentCount - 1 do
      if ( Application.Components[idx] <> Self ) and ( Application.Components[idx] is TForm )
      then
        CanClose := CanClose and TForm( Application.Components[idx] ).CloseQuery;
end;

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

procedure TForm1.WMEndSession( var message : TWMEndSession );
begin
  inherited;
  CloseForce := True;
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Capa

Registriert seit: 26. Okt 2003
102 Beiträge
 
RAD-Studio 2010 Arc
 
#10

AW: FormCloseQuery FormShowing abfrage

  Alt 24. Feb 2011, 17:15
oO wieso sollte ich das den erzwingen wollen der user soll doch das programm solange nicht schliessen können
bis alle forms geschlossen sind, wenn ich das nun erzwinge is doch das ganze was ich damit versuche zu erreichen
zwecklos oder seh ich das falsch ?
  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 14:46 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