Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web

3382
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.