Panel a bsSizeable – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Panel a bsSizeable – Delphi – Fórum – Programujte.comPanel a bsSizeable – Delphi – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
dyžon0
Stálý člen
3. 8. 2012   #1
-
0
-

cau,

chci Vas poprosit, jestli by mi nekdo neporadil jak udelat, kdyz mam BorderStyle formulare na bsNone a na nem pres jeho cast Panel1, BorderStyle taky bsNone, aby mi sla za behu programu zvetsovat velikost toho Panel1.

formular mam o neco vetsi a pruhlednej.

nasel jsem tuhle proceduru ... 
--------------------------------------------------------------------------------------------

procedure TForm1.CreateParams(var Params: TCreateParams) ;
begin
   BorderStyle := bsNone;

   inherited;

   Params.ExStyle := Params.ExStyle or WS_EX_STATICEDGE;
   Params.Style := Params.Style or WS_SIZEBOX;
end;
-------------------------------------------------------------------------------------------

ale to je jen pro zmenu velikosti formulare.

nevite nekdo jak docilit efektu,jako kdybych u Panel1.BorderStyle zadal hodnotu bsSizeable, ktera neexistuje.

je mi jasny, ze bych musel bud formular udelat o neco vetsi, nebo napsat neco jako:

if Panel1.width >form1.width then form1.width = Panel1.width  +- nejaky pixely

ale potreboval bych poradit, jak provest to roztahovani panelu za behu programu.

dikec

Nahlásit jako SPAM
IP: 89.102.38.–
liborb
~ Redaktor
+18
Guru
3. 8. 2012   #2
-
0
-
Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
3. 8. 2012   #3
-
0
-

#2 liborb

jj, dekuju, akorat mam problem s tim, ze tenhle panel se teprve vytvari, kdezto ja ho mam vytvorenej predem.

zkousel jsem nekolik variaci,kde jsem dosazoval svuj panel,ale bohuzel vsechno spatne.

koukal jsem i na ten druhej priklad, ale tam se taky panel teprve vytvari  

Nahlásit jako SPAM
IP: 89.102.38.–
dyžon0
Stálý člen
5. 8. 2012   #4
-
0
-

tak jsem si s tim lamal hlavu dalsich nekolik hodin,ale diky svymu neumu jsem to na jiz vytvorenej panel nedokazal prevest.

ale nasel jsem jinej kod primo na to, co potrebuji,ovsem je tady zapis funkce GetRectCorner, kterou mi D7 nechce prelozit a se kterou si nevim rady. pomuze mi prosim nekdo ??

konkretneji radek  ...  if x if y else  , znam zapis if x <>= neco then neco a potom az else, ..  to mi dava logiku,ale tenhle zapis vidim poprve a nevim co s nim. prosim poradte.

type
TRectCorner = (rcClient,rcTopLeft,rcTop,rcTopRight,rcLeft,rcRight,
rcBottomLeft,rcBottom,rcBottomRight);

function GetRectCorner(BoundsRect: TRect; P: TPoint): TRectCorner;
const
BorderSize = 4;
CornerSize = 16;
begin
with BoundsRect,P do
if y if x else if x>Right-CornerSize then Result:=rcTopRight
else Result:=rcTop
else if y>Bottom-BorderSize then
if x else if x>Right-CornerSize then Result:=rcBottomRight
else Result:=rcBottom
else if x if y else if y>Bottom-CornerSize then Result:=rcBottomLeft
else Result:=rcLeft
else if x>Right-BorderSize then
if y else if y>Bottom-CornerSize then Result:=rcBottomRight
else Result:=rcRight
else
Result:=rcClient;
end;

function RectCornerToSizeCursor(Corner: TRectCorner; Default: TCursor): TCursor;
begin
case Corner of
rcLeft,rcRight: Result:=crSizeWE;
rcTop,rcBottom: Result:=crSizeNS;
rcTopLeft,rcBottomRight: Result:=crSizeNWSE;
rcTopRight,rcBottomLeft: Result:=crSizeNESW;
else
Result:=Default;
end;
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
SC_SIZELEFT = 1;
SC_SIZERIGHT = 2;
SC_SIZETOP = 3;
SC_SIZEBOTTOM = 6;
var
Corner: TRectCorner;
MsgCode: Integer;
begin
Corner:=GetRectCorner(Panel1.BoundsRect,
ScreenToClient(Panel1.ClientToScreen(Point(X,Y)))) ;
if Corner<>rcClient then
begin
SetCursor(Screen.Cursors[
RectCornerToSizeCursor(
GetRectCorner(Panel1.BoundsRect,
ScreenToClient(Panel1.ClientToScreen(Point(X,Y)))) ,
Cursor)]);
MsgCode:=SC_SIZE;
if Corner in [rcTopLeft,rcLeft,rcBottomLeft] then
Inc(MsgCode,SC_SIZELEFT)
else if Corner in [rcTopRight,rcRight,rcBottomRight] then
Inc(MsgCode,SC_SIZERIGHT);
if Corner in [rcTopLeft,rcTop,rcTopRight] then
Inc(MsgCode,SC_SIZETOP)
else if Corner in [rcBottomLeft,rcBottom,rcBottomRight] then
Inc(MsgCode,SC_SIZEBOTTOM);
ReleaseCapture;
SendMessage(Panel1.Handle,WM_SYSCOMMAND,MsgCode,0) ;
end;
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
SetCursor(Screen.Cursors[
RectCornerToSizeCursor(
GetRectCorner(Panel1.BoundsRect,
ScreenToClient(Panel1.ClientToScreen(Point(X,Y)))) ,
Cursor)]);
end;

Nahlásit jako SPAM
IP: 89.102.38.–
liborb
~ Redaktor
+18
Guru
6. 8. 2012   #5
-
0
-

Tak je možné, že si našel nekompletní, ne? 

function GetRectCorner(BoundsRect: TRect; P: TPoint): TRectCorner;
const
BorderSize = 4;
CornerSize = 16;
begin
with BoundsRect,P do
if y<Top+BorderSize then
if x<Left+CornerSize then Result:=rcTopLeft
else if x>Right-CornerSize then Result:=rcTopRight
else Result:=rcTop
else if y>Bottom-BorderSize then
if x<Left+CornerSize then Result:=rcBottomLeft
else if x>Right-CornerSize then Result:=rcBottomRight
else Result:=rcBottom
else if x<Left+BorderSize then
if y<Top+CornerSize then Result:=rcTopLeft
else if y>Bottom-CornerSize then Result:=rcBottomLeft
else Result:=rcLeft
else if x>Right-BorderSize then
if y<Top+CornerSize then Result:=rcTopRight
else if y>Bottom-CornerSize then Result:=rcBottomRight
else Result:=rcRight
else
Result:=rcClient;
end;
Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
12. 8. 2012   #6
-
0
-

#5 liborb

Super, tohle funguje naprosto v pohode, ..  dikec,

Mam jeste jeden banalitni problem ...
upravil jsem proceduru Panel1MouseMove, aby se mi zaroven se zmenou velikosti panelu roztahl i DBGrid:

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin

DBGrid1.Height:= Panel1.Height -303;
DBGrid1.Width:= Panel1.Width -16;
SetCursor(Screen.Cursors[
 RectCornerToSizeCursor(
 GetRectCorner(Panel1.BoundsRect,
 ScreenToClient(Panel1.ClientToScreen(Point(X,Y)))) ,
 Cursor)]);
if (Panel1.width < 617) or (Panel1.Height < 441) then
begin
  Panel1.Width:= 617;
  Panel1.Height:=441;
 
  end;
end;

coz je v pohode, ..   trochu mi teda vadi, ze se da panel zmensit vic, nez je jeho defaultni velikost a to ikdyz jsem to zapsal takhle:

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if (Panel1.width >= 617) or (Panel1.Height >= 441) then
 begin
DBGrid1.Height:= Panel1.Height -303;
DBGrid1.Width:= Panel1.Width -16;
SetCursor(Screen.Cursors[
 RectCornerToSizeCursor(
 GetRectCorner(Panel1.BoundsRect,
 ScreenToClient(Panel1.ClientToScreen(Point(X,Y)))) ,
 Cursor)]);
 end
 else
 begin
  Panel1.Width:= 617;
  Panel1.Height:=441;
  end;
end;

ale i s tim bych se vyrovnal, pokud by nekdo vedel, tak bych to samozrejme upravil, ale co mi vadi vic je to, ze kdyz roztahnu panel v pravo dole, a zmensim ho tak, ze pravy dolni roh zustane na DBGridu, tak se mi panel pod nim nevykresli a zustane takhle:

 vykresli se az kdyz najedu mysi na viditelnou cast panelu. Zkousel jsem i na konci procedury zapsat  Panel1.Visible:=false; a hned pod to s Visible:=true; , nebo Panel1.Focused; , ale bohuzel je to porad stejny.
Potreboval bych neco jako Panel1.Active ....  nebo tak neco ..

Nahlásit jako SPAM
IP: 89.102.38.–
liborb
~ Redaktor
+18
Guru
13. 8. 2012   #7
-
+1
-
Zajímavé

No nevím ... a nastavení všech položek Anchor u DBGrid na true (tj. ukotvená na všechny strany) by tvůj problém neřešilo?

Nahlásit jako SPAM
IP: 78.80.52.–
dyžon0
Stálý člen
13. 8. 2012   #8
-
0
-

#7 liborb
jj, to pomohlo, ..  opet diky moc.

Nahlásit jako SPAM
IP: 89.102.38.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

Podobná vlákna

C# panel + image — založil Martin

Hlavní panel v delphix — založil maherik

Teacher Control Panel — založil Petr

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý