[ chachka @ 12.06.2008. 11:15 ] @
Ovako. Svi znamo kako se ponaša TPageControl - klikom na karticu se prikazuje njen sadržaj. Ono što ja hoću da napravim je da se klikom na karticu prikaže njen sadržaj a odmah ispod i sadržaj narednih kartica ako za taj sadržaj ima mesta na kontroli (ekranu).

Ovo sam uspeo da napravim upotrebom TTabControl i TFrame-ova. Frejmovi se kreiraju dinamicki i prikazuju se po potrebi i po raspoloživom prostoru. Ono što mi nikako ne uspeva je da se ti frejmovi prikazuju u ispravnom redosledu.

U programu kojeg sam atačovao postoji TabControl sa četiri taba. Kada se klikne na prvi tab on prikaže sadržaj prvog frejma, a ako ima mesta pokazuje i sadržaj drugog, i trećeg, itd. Kada se klikne na drugi tab on prikazuje sadržaj drugog frejma, pa onda i trećeg ako ima mesta, i četvrtog itd. Videćete ponašanje programa kada budete povećavali i smanjivali visinu glavnog prozora kao i kada budete menjali tabove.

Problem je što program ne prikazuje frejmove redom: prvi, drugi, treći, četvrti, nego se prikazuju nekim (random) redosledom kojeg ne mogu da utvrdim, a i ne pada mi na pamet kako da utičem na njega.

Da li neko ima lek za ovo?
[ nikomak @ 12.06.2008. 12:15 ] @
Koliko sam uspeo da pohvatam, HideFrames je krivac.

Pokusaj ovako

Code:

procedure TxFrameManager.HideFrames;
  var
    i: Integer;
begin
  // sakrivanje svih frameove
  for i := FrameCount - 1 downto 0 do
    FrameInfos[i].Frame.Parent := nil;
end;


Od poslednjeg ka prvom, ako sam dobro shvatio poentu :)
[ chachka @ 12.06.2008. 13:09 ] @
Interesantno - promena redosleda nilovanja je doprinela da se frejmovi prikazuju od poslednjeg ka prvom!

Nažalost - meni treba da se frejmovi prikazuju od prvog ka poslednjem.

Probao sam i da u jednoj petlji prvo pohvatam sve frejmove koji se mogu prikazati, a da onda u drugoj petlji te frejmove i prikažem. I ne vredi :(
[ chachka @ 12.06.2008. 13:17 ] @
Ah, kako je rešenje prosto :) (radi i sa originalnom verzijom HideFrames procedure)

Samo sam nakon prikaza Frema postavio njegov Top na dovoljno veliki broj :)
Code:
procedure TxFrameManager.ShowFrame(pIndex: Integer; pWinControl: TWinControl);
...
      if lCanDraw then begin
        lFrameInfo.ShowFrame(pWinControl);
        lFrameInfo.Frame.Top := 2000; // <- dovoljno veliki broj :)
      end;
...
end;

Hvala nikomak, a hvala i svima ostalima koji su posvetili barem i sekund vremena :)