ورود

View Full Version : سوال: مشکل با نوشتن کامپوننت



baran_2005
شنبه 22 اسفند 1388, 13:42 عصر
سلام
من می خواهم یک کامپوننت بنویسم که به جای Button از اون استفاده کنم تا حالا هم کامپوننتی ننوشتم . برای این کار یک کامپوننت با وراثت از پنل ایجاد کردم و یک label و shape در اون قرار دادم . فقط shape رو به صورت client تعریف کردم . حالا می خواهم وقتی پنل رو تغییر سایز میدم این label هم تغییر سایز پیدا کنه اما نمی دونم چه جوری این کار باید انجام بدم لطفا راهنمای کنین . باید چه طوری میزان Heightو width برچسب و با مقدار Heightو width پنل برابر کنم . البته باید برای برچسبم این میزان کوچکتر باشد .
کد اولیم و اینجا گذاشتم . از دوستانی که لطف میکنند و جواب میدن ممنون .

unit HRCButton;

interface

uses
SysUtils, Classes, Controls, ExtCtrls,StdCtrls,Graphics;

type
THRCButton = class(TPanel)
private
SHButton: TShape;
LBButton:tlabel;{ Private declarations }
FOnClick_LBButton: TNotifyEvent ;

procedure SetCaption_LBButton(newValue: TCaption);
function GetCaption_LBButton: TCaption;
procedure Click_LBButtonTransfer(Sender: TObject); { TNotifyEvent }

protected
procedure CreateWindowHandle(const Params: TCreateParams); override; { Protected declarations }

public

constructor Create(AOwner: TComponent); override;
{ Public declarations }
published
// property Width: Integer read GetWidth write SetWidth;
property Caption_LBButton: TCaption read GetCaption_LBButton write SetCaption_LBButton;
property OnClick_LBButton: TNotifyEvent read FOnClick_LBButton write FOnClick_LBButton;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('HRC', [THRCButton]);
end;
constructor THRCButton.Create(AOwner: TComponent);
{ Creates an object of type THRCButton, and initializes properties. }
begin
inherited Create(AOwner);
Left := 1;
Top := 1;
Width := 80;
Height := 28;
TabOrder := 0;
caption:='';
LbButton := Tlabel.Create(Self);
LBButton.Parent := Self;
SHButton := Tshape.Create(Self);
SHButton.Parent := Self;
end; { Create }


procedure THRCButton.CreateWindowHandle(const Params: TCreateParams);
{ Calls inherited CreateWindowHandle and initializes subcomponents. }
begin
inherited CreateWindowHandle(Params);
with LBButton do
begin
Left := 1;
Top := 1;
Width := 77;
Height := 25;
Cursor := crHandPoint;
Hint := 'Ctrl+P';
AutoSize := False;
BiDiMode := bdRightToLeft;
Caption := ' '#1575#1606#1589#1585#1575#1601;
Color := 6172194;
// Font.Charset := ARABIC_CHARSET;
Font.Color := clWhite;
Font.Height := -13;
Font.Name := 'Traffic';
Font.Style := [fsBold];
ParentBiDiMode := False;
ParentColor := False;
ParentFont := False;
ParentShowHint := False;
ShowHint := True;
Transparent := False;

end; { LB_Label }
with SHButton do
begin
Left := 1;
Top:= 1;
Width := 78;
Height := 26;
Cursor := crHandPoint;
Align := alClient;
Brush.Color := clBlack ;
Pen.Color:= clWhite;
Pen.Mode := pmMerge;
// ExplicitWidth := 79;
// ExplicitHeight := 25 ;
end; { SH_Shape }
end; { CreateWindowHandle }


function THRCButton.GetCaption_LBButton: TCaption;
{ Returns the Caption property from the LBButton subcomponent. }
begin
result := LBButton.Caption;
end; { GetCaption_LB_Button }
procedure THRCButton.SetCaption_LBButton(newValue: tCaption);
{ Sets the LBButton subcomponent's Caption property to newValue. }
begin
LBButton.Caption := newValue;
end; { SetCaption_LBButton }


procedure THRCButton.Click_LBButtonTransfer(Sender: TObject);
{ Transfers the LBButton OnClick event to the outside world. }
begin
if assigned(FOnClick_LBButton) then
FOnClick_LBButton(Self); { Substitute Self for subcomponent's Sender. }
end; { Click_LBButtonTransfer }
end.

vcldeveloper
شنبه 22 اسفند 1388, 13:50 عصر
من می خواهم یک کامپوننت بنویسم که به جای Button از اون استفاده کنم تا حالا هم کامپوننتی ننوشتم . برای این کار یک کامپوننت با وراثت از پنل ایجاد کردم
خب، چرا از TCustomButton آن را مشتق نکردید؟!


اید چه طوری میزان Heightو width برچسب و با مقدار Heightو width پنل برابر کنم . البته باید برای برچسبم این میزان کوچکتر باشد .
کنترل ها یک متد Resize دارند که در صورت تغییر سایز آن کنترل، فراخوانی میشه. در صورت Override کردن این متد، کد شما با هر بار تغییر سایز اون کنترل اجرا میشه.

baran_2005
شنبه 22 اسفند 1388, 17:48 عصر
در زمان اجرا پیغام این که خصوصیت taborder وجود ندارد را نمایش میدهد مشکل از چیه ؟

baran_2005
یک شنبه 23 اسفند 1388, 12:03 عصر
یک سوال دیگه در زمان طراحی من رنگ و متن این دکمه رو که تغییر میدم درست عمل میکنه اما تو اجرا همون خصوصیات اولیش و نشون میده برای اینکه تغییرات جدید و نشون بده باید چکار کتم ؟

vcldeveloper
یک شنبه 23 اسفند 1388, 12:36 عصر
یک سوال دیگه در زمان طراحی من رنگ و متن این دکمه رو که تغییر میدم درست عمل میکنه اما تو اجرا همون خصوصیات اولیش و نشون میده برای اینکه تغییرات جدید و نشون بده باید چکار کتم ؟
برای اینکه Theme Support در پروژه فعال هست.

در پست قبلی هم اشاره کردم، من متوجه نمیشم شما چرا دارید همچین کلاسی می نویسید! اگر میخواید دکمه داشته باشید، باید از کلاس TCustomButtom یک کلاس جدید مشتق کنید، نه اینکه از یک Panel انتظار دکمه شدن داشته باشید. Button یکی از کنترل های اولیه سیستم عامل ویندوز هست. اگر هم کسی بخواد از اول چرخ را اختراع کنه، با همان کلاس Button ویندوز که جزو Common Controls ویندوز هست، شروع میکنه.

baran_2005
یک شنبه 23 اسفند 1388, 14:53 عصر
یک سوال دیگه :
زمانی که من یکسری از property ها رو در CreateWindowHandle مقداردهی میکنم دیگه مقادیری رو که تغییر دادم در زمان اجرا نمایش نمیدهد چه طوری میشه یک سری مقدار دهی اولیه کرد ولی بعدا هم قابل تغییر باشند ؟

SAASTN
دوشنبه 24 اسفند 1388, 01:31 صبح
همونطور که قبلا هم گفته شده راه رو دارین اشتباه می رین.
با توجه به کدی که قرار دادید، احتمالا قصد شما تنها ایجاد تغییرات در ظاهر Button هست. برای این کار بهتره یک کلاس از TButton مشتق کنید و Paint اون رو بازنویسی کنید. Canvas در اختیار هست و انجام هر تغییر گرافیکی با اون ممکنه.
اگر هم از کنترل جدیدتون انتظارات دیگه ای دارید که شما رو به استفاده از Lable و Shape سوق داده بهتره اون ها رو مطرح کنید. شاید راه بهتری باشه.