Delphi-PRAXiS
Seite 3 von 3     123   

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)

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 14:22 Uhr.
Seite 3 von 3     123   

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