Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - wsMaximized := - unter welchen Bedingungen ausgeführt?


Hidden - Di 29.04.08 15:59
Titel: wsMaximized := - unter welchen Bedingungen ausgeführt?
Hi,

Ich habe folgenden, skurrilen, Fall:

Wenn ich in einer Prozedur myForm.WindowState := wsMaximized; verwende, wird dies nicht umgesetzt. Verwende ich dagegen eine Prozedur, in der am Ende myForm.WindowState := wsMaximized; steht, wird maximiert :shock:

Beide Prozeduren sind Prozeduren desselben Objektes, diesbezüglich sollte es keine Schwierigkeiten geben...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 procedure MyClass.MyProcedure1;
begin
  doSomething;
  myForm.WindowState := wsMaximized;
end;

procedure MyClass.MyProcedure2;
begin
  //myForm.WindowState := wsMaximized;  //ändert nichts
  self.MyProcedure1;  //Funktioniert
end;


Es wird noch ein stück skurriler: Wenn ich vor myForm.WindowState := wsMaximized; ein myForm.WindowState := wsNormal; setze, klappts...

Eigentlich habe ich da nur eine Deutungshypothese: Aus irgendeinem Grund ist ein setzen auf wsMax in dem Moment nicht erlaubt; der zusätzliche Befehl verbraucht Zeit und bis dahin hat Windows das Setzen wieder enabled.

Andere Ideen?

mfG,


jaenicke - Di 29.04.08 16:11

Das kann ich nicht nachvollziehen, ich habe eine neue Klasse erstellt mit deinem Quelltext, aber der tut (wie ich auch nicht anders erwartet habe ;-)) seinen Dienst. Kannst du vielleicht ein Beispielprogramm anhängen?


Hidden - Do 01.05.08 16:00

Hi,


Edit:Es liegt anscheinend doch noch an anderen Sachen: dieses Beispiel funktioniert...

Das ganze Programm veröffentlichen werde ich erstmal nicht, da überlege ich noch, ob es Freeware oder Open Source werden soll.

Insofern danke für die Mühe, wahrscheinlich kann mir ohne den kompletten Source dann niemand helfen.


Ich würde mal stark tippen, dass der Fehler durch meine Prozedur zum laden der Form-Einstellungen zustande kommt..
In der Prozedur, nach der ich WS setzen wollte, klappt es nämlich auch nicht!

Tschuldigung, dass ich diese, ausschlaggebende, Sache weggelassen habe... :oops:

Ändert einiges :wink:

Ich habe es jetzt so gelöst, dass ich einfach vor Windowstate := wsMaximized ein WindowState := wsNormal setze - damit gehts.


Die betreffende Codezeile hab ich mal markiert:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
unit mSpeicherObjekt;

interface

uses
  Types, Forms, mFormAnzahl;

type
  TArrangeForm = record
    Size: TRect;
    Visible: Boolean;
    WindowState: TWindowState;
  end;
  TArrangeForms = Array[FormIndex] of TArrangeForm;

procedure SaveLayOut(const aFileName: String);
function TryLoadLayOut(const aFileName: String): Boolean;
function GetFormArrangement: TArrangeForms;
procedure ReadFormArrangement(const qArrangement: TArrangeForms);

implementation

uses
  SysUtils, mFormKommunikation;

procedure SaveLayOut(const aFileName: String);
var
  F: File of TArrangeForm;
  Arrangement: TArrangeForms;
  i: FormIndex;
begin
  Arrangement := GetFormArrangement;
  try
    AssignFile(F, aFileName);
    ReWrite(F);
    for i := 0 to FormAnzahl - 1 do
      Write(F, Arrangement[i]);
  finally
    CloseFile(F);
  end;
end;

function TryLoadLayOut(const aFileName: String): Boolean;
var
  F: File of TArrangeForm;
  Arrangement: TArrangeForms;
  i: FormIndex;
begin
  result := FileExists(aFileName);
  if result then begin
    try
      AssignFile(F, aFileName);
      Reset(F);
      for i := 0 to FormAnzahl - 1 do
        Read(F, Arrangement[i]);
    finally
      CloseFile(F);
    end;
    ReadFormArrangement(Arrangement);
  end;
end;

function GetFormArrangement: TArrangeForms;
var
  i: FormIndex;
  Frm: PForm;
begin
  for i := 0 to FormAnzahl - 1 do begin
    Frm := GlobalTraffic.Forms[i];
    result[i].WindowState := Frm^.WindowState;
    Frm^.WindowState := wsNormal;
    result[i].Size := Rect(Frm^.Left, Frm^.Top, Frm^.Width, Frm^.Height);
    result[i].Visible := Frm^.Visible;
    Frm^.WindowState := result[i].WindowState;
  end;
end;

procedure ReadFormArrangement(const qArrangement: TArrangeForms);
var
  i: FormIndex;
  Frm: PForm;
begin
  for i := 0 to FormAnzahl - 1 do begin
    Frm := GlobalTraffic.Forms[i];
    Frm^.Left := qArrangement[i].Size.Left;
    Frm^.Top := qArrangement[i].Size.Top;
    Frm^.Width := qArrangement[i].Size.Right;
    Frm^.Height := qArrangement[i].Size.Bottom;
    Frm^.Visible := qArrangement[i].Visible;
    Frm^.WindowState := wsNormal;  //Windows zickt sonst beim Maximieren
    Frm^.WindowState := qArrangement[i].WindowState;
  end;
end;

end.


Edit:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
type
  TArrangeForm = record
    Size: TRect;
    Visible: Boolean;
    WindowState: TWindowState;
  end;
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Arr: TArrangeForm;
  Frm: TForm;
begin
  Frm := self;
  Arr.Size := Rect(00300300);
  Arr.Visible := true;
  Arr.WindowState := wsMaximized;
  Frm.Left := Arr.Size.Left;
  Frm.Top := Arr.Size.Top;
  Frm.Width := Arr.Size.Right;
  Frm.Height := Arr.Size.Bottom;
  Frm.Visible := Arr.Visible;
  //Frm.WindowState := wsNormal;  //Windows zickt sonst beim Maximieren
  Frm.WindowState := Arr.WindowState;
  ShowMessage('Passiert');
end;


mfG,