  
|
| Makale Tarihi : 16 Ocak 2000
Yazan:Can Kaynak |
|
TAnalysisControl
Hareket
edebilen bir panel çoğunlukla programımızın boyutları değiştiğinde yada bir
Treeview controlünde çok uzun parametreli bir satır görüntülendiğinde "Ah
keşke şu kontrolün boyutlarını bir değiştirebilseydim" dediğiniz
mutlaka olmuştur. Aslında işini bilen bir programcı için tereyağından kıl çekmek
kadar kolay. (Tereyağına da bağlı aslında). Bir program yaparken yapacağımız en
güzel şey ilk önce progamımıza yerleştireceğimiz kontrollerin yerlerini belirlemek
(Aklınızdan). Kontrollerin yerlerini belirledikten sonra o konrtollerin formun üstünde
sıkı durmasını sağlayacak paneller yerleştirmek. Paneller Tıpkı Html'de Table
etiketlerini sayfanızı tasarlarken kullandığınız gibi formunuzu tasarlarkende
kullanın. Kesinlikle pişman olmazsınız bir panele yerleştirilen bir nesneyi alClient
yaparsanız formunuz hangi çözünürlükte olursa olsun hangi boyutta olursa olsun
tıpkı ilk tasarladığınız gibi görüntülenecektir. Bunu da bir püf noktası olarak
kafanızın bir kenarına yerleştirin.
Gelelim asıl
konumuza Bir WM_SYSCOMMAND mesajına bir
WPARAM gibi bir parametre yollayarak kontrollerinizi
kolaylıkla hareket ettirebilirsiniz. Tabiki SC_SIZE değerini yollayıp xPos ve yPos'u istediğiniz şekilde ayarlayarak Bu parametrenin
pek fazla ayrıntılarına girmek istemiyorum. Bu paremetreyi API help dosyasından
aratarak daha fazla bilgi edinebilirsiniz yada istersdeniz size ayrıca detaylı bilgi
verebilirim.İsterseniz aşağıdaki kodu öğe olarak öğe paletine
yerleştirebilirsiniz. Bu kodu aslında "nasıl corel draw gibi nesnel bir
grafik programı yazabiliriz" diyen arkadaşa ithafen yazıyorum.
TAnalysisControl
= class( TCustomControl )
public
procedure MouseDown( Button : TMouseButton; Shift : TShiftState;
X, Y : integer ); override;
procedure MouseMove( Shift : TShiftState;
X, Y : Integer );override;
procedure Paint; override;
end;
implementation
uses Winprocs, Messages, Graphics;
const
sizeBorder
= 2;
sc_SizeLeft = $F001; { these are the variations on the }
sc_SizeRight = $F002; { SC_SIZE value }
sc_SizeTop = $F003;
sc_SizeTopLeft = $F004;
sc_SizeTopRight = $F005;
sc_SizeBottom = $F006;
sc_SizeBottomRigh = $F008;
sc_SizeBottomLeft = $F007;
sc_DragMove = $F012;
procedure TAnalysisControl.MouseDown( Button : TMouseButton; Shift : TShiftState;X, Y :
integer );
begin
if
Button = mbLeft then
begin
WinProcs.ReleaseCapture;
if ( X >= Width - sizeBorder ) And NOT(( Y <= sizeBorder ) or ( Y >= Height
-sizeBorder )) then
Self.Perform( WM_SysCommand, sc_SizeRight , 0 )
else
if Not( ( X <= sizeBorder ) or ( X >= Width
-sizeBorder ) ) And ( Y <= sizeBorder ) then
Self.Perform( WM_SysCommand, sc_SizeTop , 0 )
else
if (
X <= sizeBorder ) And ( Y <= sizeBorder ) then
Self.Perform( WM_SysCommand, sc_SizeTopLeft, 0 )
else
if ( X >= Width -sizeBorder ) and ( Y <= sizeBorder ) then
Self.Perform( WM_SysCommand, sc_SizeTopRight , 0 )
else
if Not( ( X <= sizeBorder ) or ( X >= Width -sizeBorder ) ) And
( Y >= Height - sizeBorder ) then
Self.Perform( WM_SysCommand, sc_SizeBottom , 0 )
else
if ( Y >= Height -sizeBorder ) And ( X <= sizeBorder ) then
Self.Perform( WM_SysCommand, sc_SizeBottomLeft , 0 )
else
if ( Y >= Height -sizeBorder ) and ( X >= Width - sizeBorder )
then
Self.Perform( WM_SysCommand, sc_SizeBottomRight , 0 )
else
if Not( ( Y <= sizeBorder ) or ( Y >= Height -sizeBorder ) ) And
( X <= sizeBorder ) then
Self.Perform( WM_SysCommand, sc_SizeLeft , 0 )
else
begin
Self.Perform( WM_SysCommand, SC_DragMove, 0 );
end;
end;
end;
procedure TAnalysisControl.Paint;
begin
With Canvas do
begin
Brush.Color := clRed;
Brush.Style := bsSolid;
FillRect( GetClientRect );
end;
end;
procedure TAnalysisControl.MouseMove( Shift : TShiftState;
X, Y : Integer );
begin
if ( X <= sizeBorder ) or ( X >= Width
-sizeBorder ) then
begin
if ( Y >= Height -
sizeBorder ) then
begin
if (
X >= Width - sizeBorder ) then
Cursor := crSizeNWSE
else
Cursor := crSizeNESW;
end
else
if ( Y <= sizeBorder ) then
begin
if ( X
>= Width -sizeBorder ) then
Cursor := crSizeNESW
else
Cursor := crSizeNWSE;
end
else
Cursor := crSizeWE;
end
else
if ( Y <= sizeBorder ) or ( Y >= Height - sizeBorder ) then
begin
Cursor := crSizeNS;
end
else
Cursor := crDefault;
end;
Artık bu kodu
geliştirmek size kaldı. Bunu eğer bir panel için uygulamak isterseniz Paint metodunu
kaldırın ve Ata sınıf olarakda TPaneli seçin. Tabiki herkez kahvebahane Paletinde ne
olduğu belli olamayan geometrik şekiller çıkıyor diyor. Eğer öğe paletindeki o
abuk resmi değiştirmek istiyorsanız implementation satırının altına aşağıdaki
satırı ekleyin:
{$RESOURCE Resources\Analysis.res}
Böylece
öğeniz dosyanızın bulunduğu dizinde bulunan resources dizininden Analysis.res
dosyasını kullanarak öğe paletinde tanımlana resmi gösterir. Otomatikman şu soru
gelecek nasıl tanımlayacağız? Image editor programından yeni bir res
yaratın içine bitmap ekleyin boyutunu 24X24 oarak belirleyin daha sonra belirlediğiniz
resmi çizip kaydedin bitmapin ismini TAnalysisControl olarak
değiştirin. Büyk Harflerle girin benim gibi güçük yazmayın.Daha sonra bunu
resources dizinine kaydedin. işlem tamam. |