AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

form1.enabled:=false geht nicht

Ein Thema von Helmut · begonnen am 15. Jan 2003 · letzter Beitrag vom 16. Jan 2003
Antwort Antwort
Seite 3 von 3     123   
Daniel B
(Gast)

n/a Beiträge
 
#21
  Alt 15. Jan 2003, 21:26
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:

Form1.Button.Enabled := False; Daher darfst Du auf keinen Fall diese Variablen entfernen

Grüsse, Daniel
  Mit Zitat antworten Zitat
Helmut

Registriert seit: 22. Nov 2002
64 Beiträge
 
#22
  Alt 15. Jan 2003, 22: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...
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#23
  Alt 15. Jan 2003, 22:10
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...
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
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#24
  Alt 15. Jan 2003, 22:19
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
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Helmut

Registriert seit: 22. Nov 2002
64 Beiträge
 
#25
  Alt 15. Jan 2003, 22: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 .

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

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]
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#26
  Alt 15. Jan 2003, 22:37
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
  Mit Zitat antworten Zitat
Helmut

Registriert seit: 22. Nov 2002
64 Beiträge
 
#27
  Alt 15. Jan 2003, 22: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.
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#28
  Alt 15. Jan 2003, 23: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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#29
  Alt 16. Jan 2003, 00:17
Hi,

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

Gruß
Hansa
  Mit Zitat antworten Zitat
Helmut

Registriert seit: 22. Nov 2002
64 Beiträge
 
#30
  Alt 16. Jan 2003, 07:23
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
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 19:55 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