Autor Téma: Komponenta pro BDS 2006  (Přečteno 7655 krát)

Offline J.T

  • Příspěvků: 13
  • Karma: 0
    • Verze Delphi: Turbo 2006
Komponenta pro BDS 2006
« kdy: 11-06-2012, 22:10:22 »
Zdravím Vás, snažím se vytvořit komponentu, jako předka jsem zvolil TCustomControl. Chtěl jsem novou komponentu obohatit o Anchors, ale ve výsledném programu se komponenta nechová při změně velikosti formuláře správně (mám nastaveno akRight,akBottom), ale v designeru funguje jak má.
Anchors jsem do komponenty přidal tak, že jsem pod __published: doplnil __property Anchors;
« Poslední změna: 11-06-2012, 22:30:49 od J.T »

Offline J.T

  • Příspěvků: 13
  • Karma: 0
    • Verze Delphi: Turbo 2006
Re:Komponenta pro BDS 2006
« Odpověď #1 kdy: 14-06-2012, 19:59:32 »
Přidám i zdroják, protože Anchors mě pořád nechce poslouchat:

CPP

Kód: C++ [Vybrat]
  1.  
  2. #include <vcl.h>
  3.  
  4. #pragma hdrstop
  5.  
  6. #include "SwitchBttn1.h"
  7. #pragma package(smart_init)
  8.  
  9.  
  10. static inline void ValidCtrCheck(TSwitchBttn *)
  11. {
  12.         new TSwitchBttn(NULL);
  13. }
  14. //---------------------------------------------------------------------------
  15. __fastcall TSwitchBttn::TSwitchBttn(TComponent* Owner)
  16.         : TGraphicControl(Owner)
  17. {
  18.   FMousePos = 0;
  19.   FBmpResID = 0;
  20.   FSwitchID = 0;
  21.   FSwitchMax = 0;
  22.   FHintID=0;
  23.   FAutoLoad = false;
  24.   FAutoSwitch = true;
  25.   Cursor = crHandPoint;
  26.   Width = 100;
  27.   Height = 36;
  28.   FBmp = new Graphics::TBitmap();
  29. }
  30. //---------------------------------------------------------------------------
  31. __fastcall TSwitchBttn::~TSwitchBttn()
  32. {
  33.  delete FBmp;
  34. }
  35. //---------------------------------------------------------------------------
  36. void __fastcall TSwitchBttn::Paint()
  37. {
  38.  if(FBmp==NULL || FBmp->Empty || FBmp->Width<4 || FSwitchMax>(USHORT)FBmp->Height)
  39.  {
  40.   Canvas->Brush->Color = Color;
  41.   Canvas->Pen->Color = Color;
  42.   Canvas->FillRect(Canvas->ClipRect);
  43.  
  44.   if(Width>2 && Height>2)
  45.   {
  46.    Canvas->Pen->Color = clBtnHighlight;
  47.    Canvas->MoveTo(0,0);
  48.    Canvas->LineTo(0,Height-1);
  49.    Canvas->MoveTo(0,0);
  50.    Canvas->LineTo(Width-1,0);
  51.    Canvas->Pen->Color = clBtnShadow;
  52.    Canvas->MoveTo(0,Height-1);
  53.    Canvas->LineTo(Width-1,Height-1);
  54.    Canvas->MoveTo(Width-1,0);
  55.    Canvas->LineTo(Width-1,Height-1);
  56.   }
  57.   return;
  58.  }
  59.  
  60.  int TP = FSwitchID * Height;
  61.  if( TP > (int)(FBmp->Height-Height) )TP=0;
  62.  
  63.  int LFT;
  64.  
  65.  if(Enabled)
  66.  {
  67.   switch(FMousePos)
  68.   {
  69.    case CNTSMOUSE_IN : LFT = FBmp->Width/4; break;
  70.    case CNTSMOUSE_DOWN   : LFT = FBmp->Width/2; break;
  71.    default : LFT=0; break;
  72.   }
  73.  }
  74.  else LFT = Width * 3;
  75.  
  76.  TRect r;
  77.  r.Left = LFT;
  78.  r.Right = LFT + Width;
  79.  r.Top = TP;
  80.  r.Bottom = TP+Height;
  81.  
  82.  Canvas->CopyRect(ClientRect, FBmp->Canvas, r);
  83. }
  84. //---------------------------------------------------------------------------
  85. void __fastcall TSwitchBttn::SetBtnBitmap(Graphics::TBitmap *bmp)
  86. {
  87.  if(bmp!=FBmp)
  88.  {
  89.   FBmp->Assign(bmp);
  90.   if(!FBmp->Empty)
  91.   {
  92.    Height = FSwitchMax==0 ? FBmp->Height : (FBmp->Height / (FSwitchMax+1));
  93.    if(FBmp->Width<4)return;
  94.    Width = FBmp->Width/4;
  95.   }
  96.   Paint();
  97.  }
  98. }
  99. //---------------------------------------------------------------------------
  100. void __fastcall TSwitchBttn::SetResourceID(USHORT v)
  101. {
  102.  FBmpResID = v;
  103. }
  104. //---------------------------------------------------------------------------
  105. void __fastcall TSwitchBttn::SetSwitchMax(USHORT m)
  106. {
  107.  if(m < (USHORT)0xFFFF)FSwitchMax = m;
  108.  else FSwitchMax = m-1;
  109.  if(FBmp->Empty)return;
  110.  
  111.  if(FBmp->Height>(USHORT)FSwitchMax)
  112.  {
  113.   Height = FSwitchMax==0 ? FBmp->Height : (FBmp->Height / (FSwitchMax+1));
  114.   Paint();
  115.  }
  116. }
  117. //---------------------------------------------------------------------------
  118. void __fastcall TSwitchBttn::SetSwitchID(USHORT id)
  119. {
  120.  if(id>FSwitchMax)FSwitchID=0;
  121.  else FSwitchID=id;
  122.  Paint();
  123. }
  124. //---------------------------------------------------------------------------
  125. void __fastcall TSwitchBttn::SetHintID(USHORT v)
  126. {
  127.  FHintID = v;
  128. }
  129. //---------------------------------------------------------------------------
  130. void __fastcall TSwitchBttn::WndProc(Messages::TMessage &Message)
  131. {
  132.  switch ( Message.Msg )
  133.   {
  134.         case CM_MOUSEENTER : if(Enabled && !ComponentState.Contains(csDesigning)){FMousePos = CNTSMOUSE_IN; Paint();}; break;
  135.         case CM_MOUSELEAVE : if(Enabled && !ComponentState.Contains(csDesigning)){FMousePos = CNTSMOUSE_OUT; Paint();}; break;
  136.     default : break;
  137.   }
  138.   TGraphicControl::WndProc(Message);  //??::WndProc
  139. }
  140. //---------------------------------------------------------------------------
  141. void __fastcall TSwitchBttn::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
  142. {
  143.  TGraphicControl::MouseDown(Button, Shift, X, Y);
  144.  
  145.  if(!Shift.Contains(ssLeft))return;
  146.  
  147.  if(!Enabled)return;
  148.  FMousePos = CNTSMOUSE_DOWN;
  149.  Paint();
  150. }
  151. //---------------------------------------------------------------------------
  152. void __fastcall TSwitchBttn::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
  153. {
  154.  TGraphicControl::MouseUp(Button, Shift, X, Y);
  155.  
  156.  if(!Shift.Contains(ssLeft))return;
  157.  
  158.  FMousePos = CNTSMOUSE_OUT;
  159.  Paint();
  160. }
  161. //---------------------------------------------------------------------------
  162. void __fastcall TSwitchBttn::Loaded(void)
  163. {
  164.  if(!ComponentState.Contains(csDesigning))
  165.  {
  166.   if(FAutoLoad)
  167.   {
  168.    if(FBmpResID!=0)
  169.    {
  170.         FBmp->LoadFromResourceID(0, FBmpResID);
  171.     if(!FBmp->Empty)
  172.         {
  173.          Height = FSwitchMax==0 ? FBmp->Height : (FBmp->Height / (FSwitchMax+1));
  174.          if(FBmp->Width<4)return;
  175.          Width = FBmp->Width/4;
  176.         }
  177.         Paint();
  178.    }
  179.   }
  180.  
  181.   if(FHintID!=0)
  182.   {
  183.    Hint = LoadStr(FHintID);
  184.   }
  185.  }
  186. }
  187. //---------------------------------------------------------------------------
  188. void __fastcall TSwitchBttn::SetAutoLoad(bool b)
  189. {
  190.  FAutoLoad = b;
  191. }
  192. //---------------------------------------------------------------------------
  193. void __fastcall TSwitchBttn::SetEnabled(bool Value)
  194. {
  195.  TControl::Enabled = Value;
  196.  Paint();
  197. }
  198. //---------------------------------------------------------------------------
  199. void __fastcall TSwitchBttn::SetColor(TColor)
  200. {
  201.  Paint();
  202. }
  203. //---------------------------------------------------------------------------
  204. void __fastcall TSwitchBttn::Switch(void)
  205. {
  206.   if(FSwitchID==FSwitchMax)FSwitchID=0;
  207.   else FSwitchID++;
  208.  
  209.   Paint();
  210. }
  211. //---------------------------------------------------------------------------
  212. void __fastcall TSwitchBttn::SwitchTo(USHORT id)
  213. {
  214.  if(id>FSwitchMax)return;
  215.  else
  216.  {
  217.   FSwitchID=id;
  218.   Paint();
  219.  }
  220. }
  221. //---------------------------------------------------------------------------
  222. void __fastcall TSwitchBttn::Click()
  223. {
  224.  TGraphicControl::Click();
  225.  if(FAutoSwitch && Enabled)Switch();
  226. }
  227. //---------------------------------------------------------------------------
  228. void __fastcall TSwitchBttn::SetAutoSwitch(bool b)
  229. {
  230.  FAutoSwitch = b;
  231. }
  232. //-------------------------------------------------------------------------
  233. namespace Switchbttn1
  234. {
  235.         void __fastcall PACKAGE Register()
  236.         {
  237.                 TComponentClass classes[1] = {__classid(TSwitchBttn)};
  238.                 RegisterComponents("JT Components", classes, 0);
  239.         }
  240. }
  241. //---------------------------------------------------------------------------

H

Kód: C++ [Vybrat]
  1. //---------------------------------------------------------------------------
  2.  
  3. #ifndef SwitchBttn1H
  4. #define SwitchBttn1H
  5. //---------------------------------------------------------------------------
  6.  
  7. //---------------------------------------------------------------------------
  8. #include <SysUtils.hpp>
  9. #include <Classes.hpp>
  10. #include <Controls.hpp>
  11. #include <ExtCtrls.hpp>
  12. #include <StdCtrls.hpp>
  13. //---------------------------------------------------------------------------
  14. #define CNTSMOUSE_OUT  0
  15. #define CNTSMOUSE_IN   1
  16. #define CNTSMOUSE_DOWN 2
  17. //---------------------------------------------------------------------------
  18. class PACKAGE TSwitchBttn : public TGraphicControl
  19. {
  20.  //typedef Controls::TGraphicControl inherited;
  21. private:
  22.  USHORT FBmpResID;
  23.  USHORT FHintID;
  24.  USHORT FSwitchID;
  25.  USHORT FSwitchMax;
  26.  BYTE FMousePos; //superprivate
  27.  bool FAutoLoad;
  28.  bool FAutoSwitch;
  29.  Graphics::TBitmap *FBmp;
  30.  
  31.  void __fastcall SetBtnBitmap(Graphics::TBitmap *bmp);
  32.  void __fastcall SetResourceID(USHORT v);
  33.  void __fastcall SetSwitchMax(USHORT m);
  34.  void __fastcall SetSwitchID(USHORT id);
  35.  void __fastcall SetHintID(USHORT v);
  36.  void __fastcall SetAutoLoad(bool b);
  37.  void __fastcall SetAutoSwitch(bool b);
  38.  
  39. protected:
  40. virtual void __fastcall Paint(void);
  41. virtual void __fastcall WndProc(Messages::TMessage &Message);
  42. DYNAMIC void __fastcall MouseDown(TMouseButton, TShiftState,int,int);
  43. DYNAMIC void __fastcall MouseUp(TMouseButton, TShiftState,int,int);
  44. virtual void __fastcall Loaded(void);
  45. virtual void __fastcall SetEnabled(bool);
  46. virtual void __fastcall SetColor(TColor);
  47. DYNAMIC void __fastcall Click(void);
  48.  
  49. public:
  50.         __fastcall TSwitchBttn(TComponent* Owner);
  51.         __fastcall ~TSwitchBttn();
  52.         void __fastcall Switch(void);
  53.         void __fastcall SwitchTo(USHORT id);
  54.  
  55. __published:
  56. __property OnClick;
  57. __property OnContextPopup;
  58. __property OnMouseDown;
  59. __property OnMouseUp;
  60. __property PopupMenu;
  61. //__property Action;
  62. __property Anchors  = {default=3};
  63. __property Enabled  = {default=1};
  64. __property ShowHint  = {default=1};
  65. __property Visible  = {default=1};
  66. __property Cursor = {default=crHandPoint};
  67. __property Color = {default=clBtnFace};
  68. __property Graphics::TBitmap *Bitmap = {read = FBmp, write = SetBtnBitmap};
  69. __property USHORT BitmapResID = {read=FBmpResID, write=SetResourceID, default=0};
  70. __property USHORT SwitchID = {read=FSwitchID, write=SetSwitchID, default=0};
  71. __property USHORT SwitchMax = {read=FSwitchMax, write=SetSwitchMax, default=0};
  72. __property USHORT HintResID = {read=FHintID, write=SetHintID, default=0};
  73. __property bool AutoLoad = {read=FAutoLoad, write=SetAutoLoad, default=false};
  74. __property bool AutoSwitch = {read=FAutoSwitch, write=SetAutoSwitch, default=true};
  75. };
  76. //---------------------------------------------------------------------------
  77. #endif
  78.  
  79.  

Děkuji za každý nápad.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1205
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Komponenta pro BDS 2006
« Odpověď #2 kdy: 14-06-2012, 20:30:00 »
nezkousel si v kodu priradit hodnoty do anchors, jestli to funguje pak, jak ma?

a nahodou v tom Loaded to vysku a sirku neprepisujes nejak podezrele?
pokud to v design jde a v runtime ne, tak to by mohlo byt zapricineno tim csDesigning ;)

Offline J.T

  • Příspěvků: 13
  • Karma: 0
    • Verze Delphi: Turbo 2006
Re:Komponenta pro BDS 2006
« Odpověď #3 kdy: 14-06-2012, 21:10:17 »
Díky za nakopnutí, už pár dnů to všelijak kombinuju, až teď vidím, že mi u Loaded chybí to hlavní:

TGraphicControl::Loaded(); S tímto už to funguje! Díky moc.

Citace
vysku a sirku neprepisujes nejak podezrele?

on vstupní obrázek pro komponentu bude vypadat nějak takto:
http://files.uloziste.com/fotky2/xea0234bd41d4571/9212db1a3144ccd2.jpg
« Poslední změna: 15-06-2012, 22:57:23 od J.T »