Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi form1.enabled:=false geht nicht (https://www.delphipraxis.net/2276-form1-enabled-%3Dfalse-geht-nicht.html)

Helmut 15. Jan 2003 17:32


form1.enabled:=false geht nicht
 
Hi,

während der computer rechnet (bei meinem spiel ein spielzug macht) soll bei mir eine form im vordergrund eingeblendet werden (form7). Währenddessen soll form1 (mainform) disabled werden (man kann kein knopf mehr drücken oder irgendetwas mit ihr machen.
Jetzt ruf ich die form7 auf:

form7.enabled:=true;
form7.visible:=true;
form1.enabled:=false;


und zusätzlich dazu noch ein form1.enabled:=false; in der onShow-prozedur der form7.
Ausserdem hab ich
SetWindowPos(Handle, HWND_TOPMOST, 0 , 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE); in form7 drin.

Aber es klappt nicht... die form 7 ist uwar im vordergrund, aber man kann noch alles mögliche bei der form1 machen. Ich hab schon alles durchgeschaut, ich find keinen fehler. Das verrückte ist ja, das ich noch eine form hab (auswertung) die auch aufgerufen wird, genau mit den gleichen befehlen und dort wird die form1 ordnungsgemäss disabled. Wenn man dann auf die form1 klickt kommt halt dieser warnton von windows. Ich hab alles ganau wie bei dieser form gemacht.

Bin ich verrückt?! :oops: :roll: :( :shock:

Ich stecke da jetzt richtig fest bei der sache..ich hab schon ne ganze weile probiert, aber ich komme keinen millimeter vorwärts :(

CalganX 15. Jan 2003 17:34

Ähm, mach doch Form7.ShowModal...

Chris

Daniel B 15. Jan 2003 17:34

Re: form1.enabled:=false geht nicht
 
Hallo Helmut,

Zitat:

Zitat von Helmut
Wenn man dann auf die form1 klickt kommt halt dieser warnton von windows. Ich hab alles ganau wie bei dieser form gemacht.

Das liegt warscheinlich! daran das Du das Formular Modal öffnest und DU somit keinen Zugriff auf die anderen Formulare hast, dann kommt dieser Ton.

Grüsse, Daniel :hi:

nailor 15. Jan 2003 17:35

Probiers mal mit ShowModal...

Chewie 15. Jan 2003 17:46

Zitat:

Zitat von Nailor
Probiers mal mit ShowModal...

Wenn ich mich nicht ganz irre, dann kann in diesem Fall Form1 keine Berechnungen mehr ausführen.

CalganX 15. Jan 2003 17:51

Stimmt, aber nur so lange halt das andere Formular nicht geschlossen wird.
Sonst musst du eben Show nehmen und enabled. Das hast du gemacht und Funktioniert nicht. Dann mach einen Schalter, ob Form7 aktiv ist und prüfe im OnActivate von Form1, ob es möglich ist, dass man Form1 anklickt.

Ist es das, was dz willst?

Chris

nailor 15. Jan 2003 17:54

Wenn es bei der einen Form geht, bei der anderen nicht, deutet das darauf hin, dass du Form1 im einen Fall aus Versehen zu früh wieder enablest.

Helmut 15. Jan 2003 18:16

also es kann sein das ich die eine form modal öffne... wenn dann aber unbewusst :? Ich glaube ihr meint diese mdi child oder so. Das ist aber nicht eingestellt. Bei der form die geht (also die im vordergrund ist und im hintergrund form 1 sichtbar aber nicht anklickbar) sind alle form-einstellungen genauso wie bei der form wos nicht klappt (hab jedes einzelne element verglichen :( . Auch der aufruf ist gleich.

Also was ich genau will:

Während der computer spielzüge auf form1 vollzieht (images werden verändert, labels gesetzt usw., also sollen die änderungen im hintergrund auch angezeigt werden) soll eine form im vordergrund darauf hinweisen das man warten soll bis der computer fertig ist.
Man soll nicht auf buttons klicken können die in form 1 sind. Wenn der computer ferzig ist wird die form vorne wieder invisible gemacht und man kann weiterspielen.

Ich möchte das so machen, weil ich viele bedingungen im spiel davon abhängig mache ob buttons enabled oder disabled sind. Deswegen kann ich nicht einfach alle elemente auf form1 auf disabled stellen.
Ausserdem soll der benutzer sehen können was der computer da macht (mit pausen zwischendurch).

nailor 15. Jan 2003 18:18

Irgendwann muss Form1 ja wieder enabled werden. Kuck dir mal an, wann die dazugehörige procedure aufgerufen wird.

Chewie 15. Jan 2003 18:22

In diesem Fall darfst du auf keinen Fall eine Form modal anzeigen, denn dann erhält die Form im Hintergrund keine Messages mehr. Also kein Verschieben von Grafiken.

Du musst eigentlich nix weiteres tun als die Hauptform zu disablen(Form1.Enabled := False), die andere Form mit Show (nicht ShowModal!!) anzeigen und zu warten, bis dann die Berechnungen fertig sind. Dann enablest du die Hauptform(Form1.Enabled := True) und schließt die andere Form(Form7.Close) (wichtig: in dieser Reihenfolge).

Helmut 15. Jan 2003 19:02

oh man, genau so mach ichs ja :(

Ich hab bis jetzt noch garkeinen aufruf in dem form1.enabled:=true gesetzt wird.
Ich such nu schon seitdem ich den threat hier gepostet hab, aber es ist einfach nix falsch eingestellt. Nix modal, kein enablen von form1.

Aber wenn ihr nicht wisst warum das so ist, dann muss ich mir wirklich was anderes überlegen wie ich das anstelle...

Chewie 15. Jan 2003 19:05

Poste doch am besten mal den ganzen relevanten Code.

Helmut 15. Jan 2003 19:16

Jo, wollt ich grade machen. Aber ich hab jetzt was rausgefunden was bestimmt zur lösung beiträgt.

Aber erstmal poste ich den code

Code:
[form1]
procedure TForm1.FormShow(Sender: TObject);
begin
 form7.enabled:=true;
 form7.visible:=true;
 // form1.enabled:=false (macht keinen unterschied ob gesetzt oder nicht)
end;

[form7]
procedure TForm7.FormShow(Sender: TObject);
begin
form1.Enabled:=false;
//button1.Click;
end;

{procedure TForm7.Button1Click(Sender: TObject);
begin
form1.enabled:=false;
end;}
So, jetzt mal kurz die erklärung was ich rausgefunden hab:

Ich hab in form7 einen button reingemacht (button1). Wenn man auf dne klickt wird form1.enabled auf false gesetzt (wie oben zu sehen). Und DAS geht. Man kann mit form 1 nix mehr machen.
Allerdings hat das form1.enabled in dem form7.show nicht diese wirkung (form1 bleibt enabled).
Wenn ich jetzt in form7.show den code: button1.click reinmache, bleibt form1 auch enabled!!??

Klärt mich bitte auf ! :?: :!: :?:

Hansa 15. Jan 2003 19:25

Hi,

wo ist denn Form7 als Variable deklariert und Form1 ? Überprüfe mal, ob Du die nicht aus Versehen irgendwo vielleicht doppelt drin hast. Trotzdem : reicht es nicht, nur visible zu benutzen ?

Gruß
Hansa

Helmut 15. Jan 2003 19:29

form1 als variable?
Ich hab einfach form 1 und form 7 (und die ganzen andern forms) über form einfügen erzeugt... Und eine variable die form1 (oder form7) heisst, hab ich 100%ig nicht :?

Und visible reicht halt nicht... weil ja der nutzer "sehen" soll was auf form1 passiert, es aber nicht beeinflussen darf.

Daniel B 15. Jan 2003 19:41

Zitat:

Zitat von Helmut
Und eine variable die form1 (oder form7) heisst, hab ich 100%ig nicht

:warn:

Schau mal was vor :!: implementation steht :!:

Delphi-Quellcode:
var
  Form1: TFomr1;
Grüsse, Daniel :hi:

Helmut 15. Jan 2003 19:53

oh.... ja... äh, naja :)

Code:
var
  Form7: TForm7;
Aber das hat delphi automatisch gemacht. Das ist bei mir in allen anderen units auch (also auch var form1)

Und wenn ich das wegmache funktioniert das nichtmehr :(

was soll ich jetzt tun? *totalverwirrtsei*

nailor 15. Jan 2003 20:00

vielleicht hat unit7 unit1 nicht in der uses-Liste. Aber dann müsste Delphi schon beim kompilieren mackern. Schau trotzdem mal bei unit7 nach uses und dann kuck, ob da irgendwas von unit1 steht.

Hansa 15. Jan 2003 20:05

Hi,

eine Form:

Code:
procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Enabled := true;
  Form1.Show;
  Form2.Enabled := false;
end;
nächste Form:

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Enabled := true;
  Form2.Show;
  Form1.Enabled := false;
end;
Beides ist sichtbar, zu minimieren usw. Das ist alles. Ist Form 1 aktiv, kann man Form2 nur anschauen und umgekehrt. :witch:

Gruß
Hansa

Daniel B 15. Jan 2003 20:23

Delphi-Quellcode:
var
  Form1: TForm1;

implementation
{$R *.dfm}

uses Form2, Form3, Form4;
Delphi-Quellcode:
var
  Form2: TForm2;

implementation
{$R *.dfm}

uses Form1, Form3, Form4;
usw., usw., usw.... Je nachdem welche Unit Du in welcher verfügbar haben willst!

HTH!

Grüsse, Daniel :hi:

Daniel B 15. Jan 2003 20:26

Zitat:

Zitat von Helmut
Und wenn ich das wegmache funktioniert das nichtmehr :(

Natürlich nicht, denn dann ist ja Form1 und alles was drauf ist nicht verfügbar.
Wenn Du in Form2 was von Form1 brauchst, z.B. ein Button, dann brauchst Du diese Variable.
Siehe mein anderes Posting wie man es macht, damit Variablen auch in anderen Units verfügbar sind.

Du schreibst z.B. in Form2:

Delphi-Quellcode:
Form1.Button.Enabled := False;
Daher darfst Du auf keinen Fall diese Variablen entfernen :!: :warn:

Grüsse, Daniel :hi:

Helmut 15. Jan 2003 21:02

oh man... das ist mir jetzt schon richtig peinlich ... es geht nicht.

Ich schreib einfach nochmal alles genau auf. Ich machs genau so wie ihr sagt, aber es geht so einfach nicht. Ihr denkt jetzt bestimmt das ich zu blöd oder so bin...

Zitat:

vielleicht hat unit7 unit1 nicht in der uses-Liste. Aber dann müsste Delphi schon beim kompilieren mackern. Schau trotzdem mal bei unit7 nach uses und dann kuck, ob da irgendwas von unit1 steht.
Zitat:

usw., usw., usw.... Je nachdem welche Unit Du in welcher verfügbar haben willst!

HTH!
Ich habe alle units in der uses liste.... hier nochmal der code von form1 und form2.

Form1:
Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, jpeg, ExtCtrls,unit2, ComCtrls, ImgList, ShellAPI;

type
wuerfelRecord = record
                 zahl: integer;
                 selected: boolean;
                 benutzt: boolean;
               end;
                 {usw.}
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    N1: TMenuItem;
    {usw.}
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    ProgressBar3: TProgressBar;
    {usw.}
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
 {+variablen von der hauptform}


implementation

uses Unit3, Unit4, Unit6, Unit7, Unit8;

{$R *.dfm}
Form2:
Code:
unit Unit7;

interface

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

type
  TForm7 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form7: TForm7;

implementation

uses Unit1,Unit2;

{$R *.dfm}

So... jetzt erzähl ich nochmal ganz genau wie was läuft (der ärger ist vielleicht herauszuhören, ich ärger mich über mich selber! :( )

In form1 ist in der FormShow-prozedur (diese prozedur wird aufgerufen wenn form1.visible:=true gesetzt wird) eine bedingung.

Code:
if spieler[1].steuerung=false then {computersteuerung beim ersten spieler?}
  begin
   form7.enabled:=true;
   form7.visible:=true;
   form1.enabled:=false;
  end;
So, dadurch, das form7.visible gesetzt wird, tritt in form7 die form7.formshow-prozedur ein (durch das visible machen):

Code:
procedure TForm7.FormShow(Sender: TObject);
begin
form1.Enabled:=false;
{SetWindowPos(Handle, HWND_TOPMOST, 0 , 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);}
label1.Caption:='Bitte warten sie, bis der Computer (' + spieler[r].name + ') seine Züge getätigt hat.';
end;
Das diese prozedur eintritt, seh ich daran das label1.caption sich oben entsprechend ändert.

An diesem Punkt ist aber form1 immernoch aktiv!
Ich habe unit1 in der uses liste, ihr könnt es ja alle oben sehen.

So. Dann hab ich mal testweise einen button in die form7 eingefügt. Dieser macht nix anderes als beim klick form1.enabled:=false zu setzen. Und siehe da, es funktioniert! Form1 ist nichtmehr anwählbar!

Und jetzt das paradoxum: Wenn ich diesen button (button1) in der FormShow-prozedur von form7 klicken lasse (button1.click) dann ist form1 immernoch aktiviert!!

Mehr gibt es nicht zu sagen. Das ist genau das was ich gemacht habe, nicht weniger, nicht mehr. Mit form4 passiert genau das gleiche, und da geht es. Der gleiche code, einfach genau das gleiche.

Kann es sein das es vielelicht ein problem gibt das form1 nicht sofort nach dem enablen auf disabled gesetzt werden kann? (formshow)

@Hansa:

Zitat:

eine Form:

Code:
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Enabled := true;
Form1.Show;
Form2.Enabled := false;
end;



nächste Form:

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Enabled := true;
Form2.Show;
Form1.Enabled := false;
end;

Das kann ich nicht nutzen für mein spiel irgendwie. 1. funktioniert das disabeln durch buttons ja (siehe oben) und ich brauchs ja in der formshow-prozedur. Und dann brauch ich form7.show; ja nicht machen, weil die automatisch aufgerufen wird, weil form7.visible:=true gesetzt wird.


So, jetzt lacht mich aus... ich weiss wirklich nicht was bei mir kaputt ist und ich mach euch schon wieder viel zu viel arbeit... :cry:

Daniel B 15. Jan 2003 21:10

Zitat:

Zitat von Helmut
So, jetzt lacht mich aus... ich weiss wirklich nicht was bei mir kaputt ist und ich mach euch schon wieder viel zu viel arbeit... :cry:

Niemand lacht Dich aus und Arbeit machst Du uns auch nicht.
Das würde anders aussehen. //z.B. in jeder Sparte das gleiche schreiben usw....

Poste doch einfach mal die gesamte Unit.
Oder am besten das ganze Projekt, dann kann man(n) es selbst ausprobieren. Ausserdem ist mir folgendes aufgefallen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, jpeg, ExtCtrls,unit2, ComCtrls, ImgList, ShellAPI;

type
wuerfelRecord = record
                 zahl: integer;
                 selected: boolean;
                 benutzt: boolean;
               end;
                 {usw.} 
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    N1: TMenuItem;
    {usw.} 
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    ProgressBar3: TProgressBar;
    {usw.} 
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;
{+variablen von der hauptform} 


implementation

uses Unit3, Unit4, Unit6, Unit7, Unit8;

{$R *.dfm}
Bei den uses im interface Teil, also ganz oben, hast Du auch Form2 drin. Mach es da weg, nur im implementation Teil, also unten.

Grüsse, Daniel :hi:

Chewie 15. Jan 2003 21:19

Zitat:

Zitat von Helmut
form1 als variable?
Ich hab einfach form 1 und form 7 (und die ganzen andern forms) über form einfügen erzeugt... Und eine variable die form1 (oder form7) heisst, hab ich 100%ig nicht :?

Schau dir mal an, was in deinen Units unter var steht :hello:

Helmut 15. Jan 2003 21:31

Das uses unit1 ganz oben hab ich rausgenommen. Da hab ich keine ahnung wie das da hin kam. Jedenfalls hat sich nichts geändert.
Ich hab das ganze projekt mal hochgeladen. Es ist teilweise mit kommentaren, aber ich glaube kaum das überhaupt jemand da durchsieht :oops: .

Um das "problem" zu < erzuegen > musst du (oder andere :)) nach dem start des programmes den spieler 1 einen namen geben (spieler 2 auch) und dann bei spieler 1 steuerung auf computer stellen.

Dann muss nämlich der computer die erste runde machen, und in der unit1 bei form1.formshow steht ganz am ende der aufruf von form7.
Das messagefenster hab ich auchnoch eingebaut.... seht aber selber. Es zeigt an das form1 disabled ist, was aber garnicht stimmt.

Sagt mir wenn was unverständlich ist.

Ich hab einfach mal alles gepackt was in meinem projektordner drin war, weil ich nicht weiss wleche dateien alle zum kompilieren benötigt werden (dfm.dpr,dof,cfg,pas,dcu,res?). Desshalb ist es leider auch gepackt 3mb gross.

Ich habs als selbstentpackendes rar-archiv gepackt, desshalb ist es eine exe (viele haben kein winrar). Nur das ihr wisst, es ist kein virus drin oder so! (ich geh nur von mir aus, ich geh auch lieber auf nummer sicher bei exen)

Projekt1

[edit]

nagut, ich geh jetzt erstmal drüber schlafen. Ich will euch an demselbigen natürlich auch nicht hindern :) . Die Sache muss ja nicht zu morgen fertig sein, bloss ihr wisst selber wie es ist wenn man unbedingt ein problem lösen will, und man nur über das nachdenkt :lol: :wink:

n8,
und danke für die grossartige hilfe bis jetzt, das engagement (bestimmt falsch geschrieben < g >) hier im forum ist echt super!

mfg
Helmut

[/edit]

Daniel B 15. Jan 2003 21:37

Zitat:

Zitat von Helmut
Ich hab einfach mal alles gepackt was in meinem projektordner drin war, weil ich nicht weiss wleche dateien alle zum kompilieren benötigt werden (dfm.dpr,dof,cfg,pas,dcu,res?). Desshalb ist es leider auch gepackt 3mb gross.

Bitte nur die *.pas, *.dfm und die eine .dpr.
Alle anderen braucht man nicht, die werden beim komplizieren erzeugt. Das passiert bei jedem dann. Dann sind es auch nur noch ca. 400Kb.

Grüsse, Daniel :hi:

Helmut 15. Jan 2003 21:42

ah, grade noch gesehen deinen post.

ok, werde morgen nochmal neu hochladen. Aber es wird keine grosse grössenersparniss geben. Die grösse liegt an den videos in meinem programm, und winrar kann besonders textdateien wie dpr usw. zu 90% komprimieren. Die videos kann ich jetzt auch nicht so auf die schnelle rausnehmen, weil die schon fest implementiert sind. :(

Daniel B 15. Jan 2003 22:18

Hi,

so ich habe es gefunden.

Das Problem ist die Zeile
Delphi-Quellcode:
procedure TForm7.FormShow(Sender: TObject);
begin
form1.Enabled:=false;
{button1.Click;}
{SetWindowPos(Handle, HWND_TOPMOST, 0 , 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);}
label1.Caption:='Bitte warten sie, bis der Computer (' + spieler[r].name + ') seine Züge getätigt hat.';
//if form1.enabled=true then showmessage('form1 aktiv!!') else showmessage('form1 nicht aktiv!!')
end;
Die mit // Kommentierte.
Nimm sie da raus, und schriebe sie in der OnPaint-Prozedur von Form1 rein!

Dann gehts, wenn ich es richtig verstanden habe. OnShow war einfach zu früh. OnPaint kommt erst danach.
Siehe auch: http://www.delphipraxis.net/viewtopic.php?t=200

Grüsse, Daniel :hi:

Hansa 15. Jan 2003 23:17

Hi,

Zitat:

aus und Arbeit machst Du uns auch nicht.
wie mans halt sieht. Und nun? geht das so oder nicht?

Gruß
Hansa

Helmut 16. Jan 2003 06:23

Zitat:

Zitat von Daniel B
Hi,

so ich habe es gefunden.

Das Problem ist die Zeile
Delphi-Quellcode:
procedure TForm7.FormShow(Sender: TObject);
begin
form1.Enabled:=false;
{button1.Click;}
{SetWindowPos(Handle, HWND_TOPMOST, 0 , 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);}
label1.Caption:='Bitte warten sie, bis der Computer (' + spieler[r].name + ') seine Züge getätigt hat.';
//if form1.enabled=true then showmessage('form1 aktiv!!') else showmessage('form1 nicht aktiv!!')
end;
Die mit // Kommentierte.
Nimm sie da raus, und schriebe sie in der OnPaint-Prozedur von Form1 rein!

Dann gehts, wenn ich es richtig verstanden habe. OnShow war einfach zu früh. OnPaint kommt erst danach.
Siehe auch: http://www.delphipraxis.net/viewtopic.php?t=200

Grüsse, Daniel :hi:

puhh, jo, in der formpaint-prozedur geht des disablen von form1. Die message war ja garnicht das wichtige, die hab ich nur zum überprüfen reingebaut ob form1 enabled auf false oder true ist.

Delphi-Quellcode:
procedure TForm7.FormShow(Sender: TObject);
begin
[color=#ff0008]form1.Enabled:=false;[/color] //das hat nicht funktioniert
label1.Caption:='Bitte warten sie, bis der Computer (' + spieler[r].name + ') seine Züge getätigt hat.';
end;
Also kann man den enabled-status in formshow nicht sofort nach dem erzeugen benutzen? Das soll erstmal einer wissen....

Aber jetzt klappt es ja, vielen dank nochmal für die Hilfe!

mfg
Helmut


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