[ franjo_tahi @ 27.01.2010. 10:02 ] @
Na formi imam nekoliko panela (pregled, unos, unos stavke itd...)
Na određenu akciju korisnika postavljam određeni panel kao gornji - vidljivi (Panel.BringToFron)

Kako odrediti koji mi je postavljen kao najgornji, tj. koji je vidljiv?
Rješio sam to preko tag-a, tako da postavljam vrijednost na 1 za onaj koji je gornji, zanima me da li je to oguće odrediti drugačije.
[ Vic @ 27.01.2010. 11:01 ] @
Ako sam dobro shvatio, tebi od nekoliko panela treba samo jedan da bude vidljiv? Onda tu nema gornji i donji, odnosno mislim da je to pogresno. Panel je ili visible:=true ili nije, a proveru vrsis sa if panelX.visible then ....
[ franjo_tahi @ 27.01.2010. 11:27 ] @
Ne, imam više panela na formi, svima je Align = alClinet, Visible = true

Prema potrebi neki od njih postavljam sa BringToFront

Kako odrediti koji je posljednji postavljen sa BringToFront, tj. koji je najgornji?

Odlučio sam kreirati svoju kontrolu kao nasljednika TPanel. U noj varijablu koja se setira sa BrigToFront, a properti vraća tu vrijdnost. Našao sam način kako svima ostalima panelima koji su na formi, a nisu onaj za koji pozivam BringToFront, postaviti tu varijablu na false.

Kako dodati evente:

OnBringToFront
OnSendToBack

Jasno je po imenu kada bi se okidali.
[ Vic @ 27.01.2010. 11:34 ] @
Zbog problematike koja tebe muči, takav pristup se ne koristi. Ili koristi dinamički kreirane panele ili u okviru jednog panela koji je alClient kreiraj objekat tipa frame za tvoje potrebe. Napravis 5 različitih objekata i u zavisnosti od potrebe, postavljas ih na panel.
[ savkic @ 27.01.2010. 11:54 ] @
> Na formi imam nekoliko panela (pregled, unos, unos stavke itd...)
> Na određenu akciju korisnika postavljam određeni panel kao gornji - vidljivi (Panel.BringToFron)

> Kako odrediti koji mi je postavljen kao najgornji, tj. koji je vidljiv?
> Rješio sam to preko tag-a, tako da postavljam vrijednost na 1 za onaj koji je gornji, zanima me da li je to oguće odrediti drugačije.


Code:

function FindTopPanel(const AParentHandle: HWND): TPanel;
var
  Temp: HWND;
  Control: TWinControl;
begin
  Temp := GetTopWindow(AParentHandle);
  Control := FindControl(Temp);
  while Assigned(Control) and not (Control is TPanel) do
  begin
    Temp := GetWindow(Control.Handle, GW_HWNDNEXT);
    Control := FindControl(Temp);
  end;

  Result := TPanel(Control);
end;

i poziva se sa FindTopPanel(Form1.Handle);

[ Vic @ 27.01.2010. 12:05 ] @
Ovo sto je Igor napisao je potpuno OK, sve dok se ne odlucis da koristis kombinovanje panela, da su ti neki alClient, neki alLeft.... ovo radi za alClient.
[ rambo @ 27.01.2010. 19:12 ] @
Jedno praktično pitanje. Zašto za tako nešto koristiš panele a ne TPageControl? Ako ti je potrebno da u jednom trenutku vidiš samo jedan panel, čemu onda paneli? Zato je napravljen TPageControl. Ako ti smeta to što se vide tabovi na njemu, možeš da ih ukloniš. Ako ti se i to ne sviđa, možeš da koristiš TNotebook komponentu.
[ franjo_tahi @ 27.01.2010. 22:07 ] @
Hvala na odgovorima, iskušat ću ono što je napisao savkic.

Kako ukloniti tabove iz TPageControl-a? U ObjectInspector-u se ne mogu ukloniti, tj. mogu se staviti gore-dolje, lijevo-desni i prikaz kao: Tabs, Buttons, FlatButtons. On bi zaista bio zgodnije rješenje i lakše za programiranje.

Moram otvoriti još jednu temu radi vidljivosti property-a...

Pogledao sam kontrolu TNotebook, ima sve što mi treba. Nije mi jasno zašto ju nikada nisam pogledao (valjda jer je u Win 3.1), a kolega koji je prije mene radio program radio ga je sa panelima, ja nastavio...

U svakom slućaju - hvala.

[Ovu poruku je menjao franjo_tahi dana 27.01.2010. u 23:40 GMT+1]
[ tkaranovic @ 28.01.2010. 05:57 ] @
Ovo što je savkic napisao... sa BringToFront, SendToBack, GetTopWindow i GetWindow se regulišu Z Order pozicije prozora. Prozor koji je ne vrhu Z Order liste će biti na vrhu šta god da je prozorima (panelima...) u align propertiju. Tako da je to uvek sasvim upotrebljiv0.

Inače se ovako mogu sakriti tabovi (mogu i iz ObjectInspectora):

Code (delphi):

 for strane := 0 to PageControl1.PageCount-1 do
  PageControl1.Pages[strane].TabVisible := false;
 PageControl1.Style := tsButtons;
 PageControl1.ActivePage := TabSheet1;
 


uz napomenu da je tako PageControl1.TabIndex neupotrebljiv (uvek je -1) a umesto njega se može koristiti PageControl1.ActivePage.PageIndex, a strane se mogu menjati i(li) proveravati koja je aktivna sa:

Code:

if PageControl1.ActivePage = TabSheet1 then 
 PageControl1.ActivePage := TabSheet2;

[ franjo_tahi @ 28.01.2010. 23:39 ] @
Ipak sam odlučio sve prebaciti na PageControl kontrolu
Tabove ne skrivam u runtime, već u Form.OnShow tako da mi je lakše igrati se po fromi, a bez selektiranja kontrole u Object inspector-u ili u Structure.

TNotebook mi se na kraju i nije toliko svidio, čudno se ponaša. Kada na jednu od stranica postavim kontrolu, on ju prebaci na drugu... nisam se puno igrao jer mi je PageControl sasvim OK.

Hvala na pomoći.