PDA

View Full Version : سوال: اشکال هنگام استفاده از کامپوننتی از نوع TImage در کامپوننتی از نوع TPanel



mbshareat
شنبه 02 اردیبهشت 1391, 21:53 عصر
سلام
من می خوام یک دکمه بسیار ساده با قابلیت دریافت فوکوس طراحی کنم.
من از ترکیب پنل و ایمیج استفاده کردم . پنل می تونه TabStop داشته باشه.
متاسفانه در ترسیم شکل دکمه دچار مشکل شدم. روش کارم اینطوره که یه کلاس از نوع پنل(TButPanel ) و یک کلاس از نوع ایمیج(TButImg) تعریف کردم و در کلاس اول از کلاس دوم استفاده کردم.
وقتی توی یک دکمه یه نمونه از کلاس دوم(TButImg) توی یک پنل معمولی استفاده می کنم مشکلی ندارم ولی وقتی در همین دکمه از کلاس اول(TButPanel) یک نمونه می سازم فقط پنل بدون نمونه کلاس دوم (TButImg) درست می کنه. نکته عجیب دیگه اینکه Invalidate باعث اجرای Paint نمیشه.
لطفا به کد من نگاه کنین و بفرمایین ایراد از کجاست یا اگه راه بهتری برای ایجاد دکمه با ترسیم شکل ظاهری
دکمه توسط کار با Canvas سراغ دارین دریغ نکنین.
امیدوارم از کدم خندتون نگیره:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Panel1: TPanel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TButImg = Class(TImage)
Public
Caption:String;
Procedure Paint;OverLoad;
End;
TButPanel = Class(TPanel)
Public
BI:TButImg;
Caption:String;
constructor Create(AOwner: TComponent);
destructor Destroy();
End;
var
Form1: TForm1;

implementation

{$R *.dfm}

{ TButImg }

procedure TButImg.Paint;
Var
W:Byte;
begin
Picture.Bitmap.Width:=Width;
Picture.Bitmap.Height:=Height;
Picture.Bitmap.Canvas.Rectangle(Picture.Bitmap.Can vas.ClipRect);
Picture.Bitmap.Canvas.Font.Name:='Tahoma';
Picture.Bitmap.Canvas.Font.Size:=12;
W:=Picture.Bitmap.Canvas.TextWidth(Caption);
Picture.Bitmap.Canvas.TextOut
(Width div 2- W Div 2,2,Caption);
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
BI:TButImg;
BP:TButPanel;
begin
BI:=TButImg.Create(self);
BI.Parent:=Panel1;
BI.Width:=100;
BI.Height:=30;
BI.Caption:='تایید';
BI.Paint;
BP:=TButPanel.Create(Self);
BP.Parent:=Self;
BP.Width:=200;
BP.Height:=30;
BP.Caption:='تایید';
end;
constructor TButPanel.Create(AOwner: TComponent);
begin
inherited;
BI:=TButImg.Create(self.Parent);
BI.Parent:=Self;
BI.AutoSize:=True;
BI.Left:=0;
BI.Top:=0;
BI.Width:=Width;
BI.Height:=Height;
BI.Caption:=Caption;
BI.Paint;
end;
destructor TButPanel.Destroy();
begin
BI.Free;
inherited Destroy();
end;

end.