|
[ franjo_tahi @ 19.09.2008. 14:49 ] @
| Problem je sljedeći:
pri onclose forme pamtim parametre forme: left, top, hight, width kao i položaje splitera i ostali kontrola na formi.
pri otvaranju forme, na onshow forme učitavam sve te parametre. Ako se razlikuju od default-nih koje sam postavio pri kreiranju forme, tj. ako se forma resiz-a ili premješta, na ekranu se vidi njeno "skakanje".
Forma je MDIChild
Kako ju učiniti nevidljivom dok se ne postave svi njeni parametri?
Ili neka druga ideja? |
[ rambo @ 19.09.2008. 15:26 ] @
Za takve stvari koristi OnCreate a ne OnShow.
[ kiklop74 @ 19.09.2008. 16:19 ] @
Za takve stvari je mnogo bolje koristiti konstruktor.
[ franjo_tahi @ 19.09.2008. 19:20 ] @
Pokušao sam ih staviti u OnCreate i u OnShow, ali mi javljaju: "Access violation..."
ovo je primjer postavljanja parametara:
fmIdok.WindowState := dm.IniRead('FM_IDOK', 'STATE', self.WindowState);
fmIdok.Left := dm.IniRead('FM_IDOK', 'LEFT', fmIdok.Left);
dm je datamodul,
InRead je overlodana procedure koja iz ini file-a čita parametre. Ona odradi posao, greška se dogodi pri fmIdok.WindowState :=
koristim se sljedećim i to radi:
procedure TfmIdok.FormPaint(Sender: TObject);
begin
if (fmIdok <> nil) and not(LoadFirst) then begin
LoadFirst := true;
fmIdok.WindowState := dm.IniRead('FM_IDOK', 'STATE', self.WindowState);
...
Kako upitrijebiti konstuktor? POkušao sam napraviti:
Constructor create(TOwner: TControl); override;
pa u konstruktor, nakon inherited ubaciti fmIdok.WindowState := ... isto javi grešku
[ savkic @ 19.09.2008. 19:33 ] @
> fmIdok.WindowState := dm.IniRead('FM_IDOK', 'STATE', self.WindowState);
> fmIdok.Left := dm.IniRead('FM_IDOK', 'LEFT', fmIdok.Left);
WindowState := dm.IniRead('FM_IDOK', 'STATE', WindowState);
Left := dm.IniRead('FM_IDOK', 'LEFT', Left);
Ako i dalje budeš dobijao AV, stavi breakpoint na prvi red u metodi i onda redom mišem prelazi preko svih promenljivih dok ne nađeš onu koja je nil.
[ _deran_ @ 19.09.2008. 22:28 ] @
ne mozes nista koristiti iz datamodula u TfmIdok.OnCreate jer on u tom trenutku verovatno ne postoji. verovatno ti je fmIdok glavni form i kad se on kreira jos nista drugo nije kreirano. funkciju IniRead prebaci u fmIdok pa probaj tako
[ franjo_tahi @ 20.09.2008. 00:04 ] @
Savkic je u pravu, tako radi, ali djelomično :)
Ne javlja AV, ali forma pleše po ekranu kao i prije. Problem je WindowState.
Ako je postavljen ud design-u na wsMaximize, a korisnik ju je smanjio (što se pamti), pri sljedećem pokretanju forme, zapamčeno je i vraća se WindowState koji je postavio korisnik (wsNormal, a ja sam pri designu postavio wsMaximized).
Isto vrijedi i oratno...
Podešavanje pozicije radi OK, izvrši se trenutno, bez treperenja, jedino što postavljanje WindowState mora biti prvi, inaće pokvari položaj (left, top..)
Ne, TfmIdok nije glavna forma, datamodul je kreiran, funkcije se izvrše... nema smilsa da funkcije prebacujem u formu jer se koriste iz svih formi, a jedino datamodul je linkan u sve forme. U zadnje vrijeme za to koristim unit u kom nema forme za takove stvari - funkcije i klase koje koristim iz više mjesta.
Kako vi rješavate pamčenje izleda ekrana (izmjene koje napravi korisnik - veličina forme, raspored kolona grida, visina grida sa splitterom)? Po mogučnosti bez polke na keranu :)
Zanimljivo: pokušao sam učitavanje prebaciti u construcotr:
Constructor create(TOwner: TControl); override;
nakon toga forma više nije MDIChild !!!
[ 0rc @ 20.09.2008. 12:09 ] @
Cini mi se da imas nesrecan redosled poteza.. ili ti je forma poprilicno slozena, puno kontrola, mozda i neki OnResize handleri koji pozivaju jedni druge? Ja obicno posnimam sta mi treba na OnClose (ili OnDestroy), ucitavam na OnCreate. Za sada nisam imao problema koje opisujes. Jedno (kvazi)resenje koje ti mogu ponuditi je sledece:
Code:
LockWindowUpdate(Self.Handle);
try
...
(rad sa vizuelnim elementima forme ovde)
...
finally
LockWindowUpdate(0);
end;
Ovo nije bas najsrecnije, ali mozda ti pomogne dok ne resis na neki bolji nacin.
Citat: Zanimljivo: pokušao sam učitavanje prebaciti u construcotr:
Constructor create(TOwner: TControl); override;
nakon toga forma više nije MDIChild !!!
Zar ne bi trebalo
Code:
constructor Create(TOwner: TComponent); override;
A i proveri inherited poziv, da ga nisi izostavio, premestio sa pocetka, prosledio pogresni parametar?
[ franjo_tahi @ 22.09.2008. 07:36 ] @
Kad sam ubacio
Code:
LockWindowUpdate(Self.Handle);
....
LockWindowUpdate(0);
izgldeda ok. pojavi se gdje treba, u izgledu kako treba...
Hvala na pomoči
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|