[ Milos D @ 01.11.2004. 09:41 ] @
Skoro u svim mojim programima povremeno (ne mogu da provalim pod kojim tacno okolnostima se desava, a mislim da se cak ni isti kod ne ponasa uvek isto) imam problem sa ucitavanjem velicine i pozicije glavnog prozora prilikom starta (da bi prozor ostao onakav kakav je bio kada je korisnik zatvorio program). Naime, ako prilikom tog ucitavanja maksimizujem prozor desava se da on ostane u "normalnoj" velicini (dakle nije preko celog ekrana), ali taster restore/maximize je u stanju "restore" tj. ponasa se kao da je prozor maksimizovan. Ako ga kliknem, prozor ce ostati iste velicine, ali ce se malo pomeriti i taster ce preci u stanje "maximize". Ako ga opet kliknem maksimizovace prozor korektno i dalje sve radi OK.

Ponekad mi deluje da je stvar u tajmingu, pa sam premestao taj kod u OnCreate, Loaded, konstruktor forme, u dpr fajl, pre pravljenja drugih prozora, posle pravljenja drugih prozora, pa sam probao da maksimizujem preko WinAPI poziva (kojekakvih), svasta sam probao i taman kada pomislim da radi lepo opet isto %$#^&.

Da li ste imali slicna iskustva ili da ja potrazim neki sprej protiv gremlina?
[ dekys @ 01.11.2004. 10:29 ] @
Najlakse ti je da iskoristis dogadjaje OnActivate i OnClose i napises za prvi citanje velicine i pozicije prozora iz ini fala koji mozes da distribuiras iz Apalikacju.

primer (iz neke moje app koji pamti stanja nekih CheckBox-ova):
procedure TForm1.FormActivate(Sender: TObject);
var
MyIniFile: TIniFile;
begin
MyIniFile := TIniFile.Create(ExtractFilePath (Application.ExeName)+'myapp.ini');
with MyIniFile do
begin
Form1.CheckBox1.Checked := ReadBool('Main', 'CPH', CheckBox1.Checked);
Form1.CheckBox2.Checked := ReadBool('Main', 'Mid', CheckBox2.Checked);
Form1.Predhodnosortiranje1.Checked := ReadBool('Main', 'Sort', Form1.Predhodnosortiranje1.Checked);
end;
MyIniFile.Free;
end;
//Upisivanje u ini fajl
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
MyIniFile: TIniFile;
begin
MyIniFile := TIniFile.Create(ExtractFilePath (Application.ExeName)+'myapp.ini');
with MyIniFile do
begin
MyIniFile.WriteBool('Main', 'CPH', CheckBox1.Checked);
MyIniFile.WriteBool('Main', 'Mid', CheckBox2.Checked);
MyIniFile.WriteBool('Main', 'Sort', Form1.Predhodnosortiranje1.Checked);
end;
MyIniFile.Free;
end;

Ako zelis da ti se prilikom startovanja prikaze kao maxi onda trebas osobinu WindowsState postaviti kao wsMaximized.
[ bancika @ 01.11.2004. 11:25 ] @
evo ti komponenta koju ja koristim
ona moze da radi i sa INI i sa registry. samo nije originalno napravljena da cuva maximizovan prozor i tako to. ja sam je dopravio, ali samo za registry, lako je da napises za INI ako ti treba
Code:

unit PosSaver;

interface

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

type
  TPosSaverHKEY = (_CLASSES_ROOT, _CURRENT_USER, _LOCAL_MACHINE, _USERS,
    _PERFORMANCE_DATA, _CURRENT_CONFIG, _DYN_DATA);

  TPosSaver = class(TComponent)
  private
    { Private declarations }
    FIniName: string;
    FIniSection: string;
    FUseRegistry: boolean;
    FRegKey: string;
    FRegRootKey: HKEY;
    F_RegRootKey: TPosSaverHKEY;
  protected
    { Protected declarations }
    procedure SetRegRootKey(Value: TPosSaverHKEY);
  public
    { Public declarations }
    procedure Restore;
    procedure Save;
  published
    { Published declarations }
    property IniName: string read FIniName write FIniName;
    property IniSection: string read FIniSection write FIniSection;
    property UseRegistry: boolean read FUseRegistry write FUseRegistry;
    property RegKey: string read FRegKey write FRegKey;
    property RegRootKey: TPosSaverHKEY read F_RegRootKey write SetRegRootKey;
  end;

procedure Register;

implementation

Uses
   IniFiles, Registry;

procedure Register;
begin
  RegisterComponents('Misc', [TPosSaver]);
end;

procedure TPosSaver.SetRegRootKey(Value: TPosSaverHKEY);
begin
  F_RegRootKey:=Value;
  case Value of
    _CLASSES_ROOT: FRegRootKey:=HKEY_CLASSES_ROOT;
    _CURRENT_USER: FRegRootKey:=HKEY_CURRENT_USER;
    _LOCAL_MACHINE: FRegRootKey:=HKEY_LOCAL_MACHINE;
    _USERS: FRegRootKey:=HKEY_USERS;
    _PERFORMANCE_DATA: FRegRootKey:=HKEY_PERFORMANCE_DATA;
    _CURRENT_CONFIG: FRegRootKey:=HKEY_CURRENT_CONFIG;
    _DYN_DATA: FRegRootKey:=HKEY_DYN_DATA;
  end;
end;

Procedure TPosSaver.Restore;
Var
   Ini:TIniFile;
   r: TRegistry;
   s: string;
Begin
  if FUseRegistry then
    begin
      r:=TRegistry.Create;
      r.RootKey:=FRegRootKey;
      r.OpenKey(FRegKey,false);
      if r.ValueExists('Top') and r.ValueExists('Left')  and r.ValueExists('Width') and r.ValueExists('Height') then
       begin
         (Owner as TForm).Top:=r.ReadInteger('Top');
         (Owner as TForm).Left:=r.ReadInteger('Left');
         (Owner as TForm).Width:=r.ReadInteger('Width');
         (Owner as TForm).Height:=r.ReadInteger('Height');
         if r.ReadBool('Maximized') then
          (Owner as TForm).WindowState := wsMaximized;
       end
      else
        (Owner as TForm).Position := poDesktopCenter;
      r.CloseKey;
      r.Free;
    end
  else
    begin
      Ini:=TIniFile.Create(FIniName);
      if FIniSection='' then s:='TPosSaver' else s:=FIniSection;
      (Owner as TForm).Top:=Ini.ReadInteger(s,'Top',(Owner as TForm).Top);
      (Owner as TForm).Left:=Ini.ReadInteger(s,'Left',(Owner as TForm).Left);
      (Owner as TForm).Width:=Ini.ReadInteger(s,'Width',(Owner as TForm).Width);
      (Owner as TForm).Height:=Ini.ReadInteger(s,'Height',(Owner as TForm).Height);
      Ini.Destroy;
    end;
End;

Procedure TPosSaver.Save;
Var
   Ini:TiniFile;
   r: TRegistry;
   s: string;
Begin
  if FUseRegistry then
    begin
      r:=TRegistry.Create;
      r.RootKey:=FRegRootKey;
      r.CreateKey(FRegKey);
      r.OpenKey(FRegKey,false);
      try r.WriteBool('Maximized', ((Owner as TForm).WindowState = wsMaximized));
      except on ERegistryException do ;  end;
      if (Owner as TForm).WindowState = wsMaximized then
       Exit;
      try r.WriteInteger('Top',(Owner as TForm).Top);
      except on ERegistryException do ;  end;
      try r.WriteInteger('Left',(Owner as TForm).Left);
      except on ERegistryException do ;  end;
      try r.WriteInteger('Width',(Owner as TForm).Width);
      except on ERegistryException do ;  end;
      try r.WriteInteger('Height',(Owner as TForm).Height);
      except on ERegistryException do ;  end;
      r.CloseKey;
      r.Free;
    end
  else
    begin
      Ini:=TIniFile.Create(FIniName);
      if FIniSection='' then s:='TPosSaver' else s:=FIniSection;
      Ini.WriteInteger(s,'Top',(Owner as TForm).Top);
      Ini.WriteInteger(s,'Left',(Owner as TForm).Left);
      Ini.WriteInteger(s,'Width',(Owner as TForm).Width);
      Ini.WriteInteger(s,'Height',(Owner as TForm).Height);
      Ini.Destroy;
    end;
End;


end.
[ Milos D @ 01.11.2004. 11:34 ] @
Hvala na odgovorima, ali problem nije u samom ucitavanju/snimanju nego u samom maksimizovanju forme. Ja dobro snimim i dobro ucitam podatak iz fajla da je prozor maksimizovan, ali kada postavim wsMaximized ili na bilo koji drugi nacin pokusam da (iz koda) maksimizujem prozor, dolazi do problema. Ponekad.
[ vladab @ 01.11.2004. 16:56 ] @
Imam i ja slican problem. Pravio sam program koji treba da se startuje maximizovan i da sve komponente budu srazmerne sa tim. To nije problem. Problem je sto na rezoluciji 800x600 neki dugmici (koji u pocetku nisu vidljivi), kada se prikazu, budu podignuti u odnosu na mesto gde bi trebalo da stoje. Na svim ostalim (vecim) rezolucijama radi kako treba. Ne znam kako ovo da sredim.
[ bancika @ 01.11.2004. 17:10 ] @
hoce to ponekad, ja onda koristim "divljacko resenje": stavi Timer sa intervalom 20ms i na OnTimer stavis
WindowState = wsMaximized; Timer1.Enabled := False
...to uvek radi
[ morlic @ 01.11.2004. 19:35 ] @
stavi da ti inicijalna pozicija prozora (Position u Object inspector-u) bude poDefault pa probaj onda...

javi kako je proslo.
[ bancika @ 02.11.2004. 00:09 ] @
cool, to radi :)
samo ostaje da kada se povrati u "normalno" stanje nece stajati na sredini nego na poDefault
[ Milos D @ 02.11.2004. 18:01 ] @
Ha, pa kad bi me trenutno zezalo ja bi probao, ali eto sada radi kako treba (sa poDesigned) pa ne vredi da probam. Cim bude poceo da zeza (a pocece u najgorem mogucem trenutku, na primer kada budem upload-ovao 999-ti KB najnovije verzije na sajt) ja cu da probam sa poDefault jer to jos nisam probao.

Hvala na savetu u svakom slucaju.