PDA

View Full Version : طراحی کامپوننت



delphiman00
سه شنبه 02 تیر 1383, 18:43 عصر
سلام
یک کامپوننت طراحی کرم که در آن یک Panel است درون Panel دو تا EditBox تشکیل می شود
حال سؤال:
به چه صورت می توانم رویدادهای مختلف درون این Edit ها را کنترل کنم یعنی کامپوننتم اتوماتیک کنترل کند

مثلا : هر موقع کلید Up زده شد در edit1 من کلمه up چاپ شود

توجه کنید که وقتی کامپوننت کامپایل می شود دیگر من به رویدادهای خاص edit1 دسترسی ندارم :roll:

مهدی کرامتی
سه شنبه 02 تیر 1383, 19:37 عصر
سورس کامپوننت رو اینجا ضمیمه کنید تا بررسی شود.

_alish_
چهارشنبه 03 تیر 1383, 14:07 عصر
سلام
بعضی از عناصر پیامهای ویندوز را به Child خود منتقل نمی کنند برای اینکار

Procedure WMCommand (Var Message:TWMCommand);
begin
inherited;
if (ControlCount>0) then
FindControl(Message.Ctl).Dispatch(message);
end;
پیام را به دیگر کنترل بفرستید
البته نمی دانم که در Panel
هم می شود یا نه امتحان کنید

Mohammad S
جمعه 05 تیر 1383, 00:26 صبح
آقا این دستور یعنی چی؟

inherited;
خیلی دوست دارم کارشو بدونم! :oops:

hr110
جمعه 05 تیر 1383, 00:42 صبح
یعنی :

inherited WMCommand (Message);
یعنی متد همنام کلاس پدر(کلاسی که کلاس جاری از ان به ارث گرفته شده است) صدا شود.

استفاده از این دستور در پیاده سازی کلاسها نکته مهمی است.

اگر بخواهید عملکرد متد شما با متد قبلی(متد پدر) متفاوت باشد نباید از ان استفاده کنید ولی اگر بخواهید عملکرد متد شما علاوه بر متد پدر باشد این خط را باید بنویسید. مکان فراخوانی متد پدر نیز میتواند در ابتدا، انتها و یا هر مکان دیگری از متد شما باشد ، دقت کنید :متفکر:

delphiman00
جمعه 05 تیر 1383, 08:33 صبح
سلام
این هم کد برنامه :


type
TFDate = class(TWinControl)
private
FPanel:TPanel;
FMEdit1:TMaskEdit;
FMEdit2:TMaskEdit;
FColor_S:TColor;
FColor:TColor;
FFont:TFont;
procedure SetColor_S(Value: TColor);
procedure SetColor(Value: TColor);
procedure SetFont(Value:TFont);
function GetFont:TFont;
protected
procedure WMSize(var Message:TWMSize); message WM_Size;
public
constructor create(AOwner:TComponent);override;
destructor destroy;override;
published
property color:TColor read FColor write SetColor;
property Font:TFont read GetFont write SetFont;
end;

procedure Register;

implementation

procedure TFDate.WMSize(var Message:TWMSize);
begin
inherited;

FPanel.Height:=Message.Height;
FPanel.Width:=Message.Width;
FMEdit1.Height:=Message.Height;
FMEdit2.Height:=Message.Height;
end;

constructor TFDate.create(AOwner:TComponent);
begin
inherited create(AOwner);

FColor:=clWhite;
FColor_S:=clRed;
FFont:=TFont.Create;
FFont.Name:='Tahoma';
FFont.Size:=10;

FPanel:=TPanel.Create(self);
FPanel.Parent:=self;
FPanel.Color:=clWhite;
FPanel.Width:=76;
FPanel.Height:=21;
FPanel.BevelInner:=bvNone;
FPanel.BevelOuter:=bvNone;
FPanel.BorderStyle:=bsSingle;
FPanel.Font.Assign(FFont);


FMEdit2:=TMaskEdit.Create(self);
FMEdit2.Parent:=FPanel;
FMEdit2.ParentFont:=true;
FMEdit2.BorderStyle:=bsNone;
FMEdit2.EditMask:='00;1;0';
FMEdit2.Width:=14;

FMEdit1:=TMaskEdit.Create(self);
FMEdit1.Parent:=FPanel;
FMEdit1.ParentFont:=true;
FMEdit1.BorderStyle:=bsNone;
FMEdit1.EditMask:='0000;1;0';
FMEdit1.Width:=27;
Width:=FMEdit1.Width+FMEdit2.Width;
Height:=FPanel.Height;
end;

destructor TFDate.destroy;
begin
FMEdit1.Free;FMEdit2.Free;
FPanel.Free;
inherited destroy;
end;

امیدوارم منظورم را درست بیان کرده باشم
من می خواهم در کامپوننتم یک روال تعریف کنم که در این روال کنترل کند اگر در FMEdit1 کلید UP زده شد در این Edit کلمه Up چاپ شود و نمی خواهم این روال جزء Event های خود کامپوننتم باشد

آیا باید از رویداد OnKeyPress استفاده کنم و inherited را صدا بزنم و ... اصلا این رویداد OnKeyPress را کجا تعریف کنم ؟

delphiman00
یک شنبه 07 تیر 1383, 12:22 عصر
مدیر جان ! :heart:
اجازه کد هم گذاشتم...


لطفا... :roll:

مهدی کرامتی
چهارشنبه 10 تیر 1383, 00:06 صبح
در بدنه کلاس یک متد مشابه متد معمولی OnKeyDown کامپوننت MaskedEdit تعریف کن و کدت را داخلش بنویس:

procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
بعد موقع Create کردن Instance ها این متد رو به اونی که میخواهی نسبت بده.

من کامپوننت شما را بصورت ساده‌تر بازنویسی کردم.


unit MyPanel;

interface

uses
Mask,
Windows,
Messages,
SysUtils,
Classes,
Controls,
ExtCtrls;

type
TMyPanel = class(TCustomPanel)
private
fEdit1,fEdit2:TMaskEdit;
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure SetName(const Value: TComponentName);override;
protected
{ Protected declarations }
public
constructor create(AOwner:TComponent);override;
published
{ Published declarations }
property Caption;
end;

procedure Register;

implementation

{ TMyPanel }

constructor TMyPanel.create(AOwner: TComponent);
begin
inherited;

fEdit1:=TMaskEdit.Create(Self);
fEdit1.Parent:=Self;
fEdit1.Top:=5;
fEdit1.Left:=5;
fEdit1.OnKeydown:=EditKeyDown;

fEdit2:=TMaskEdit.Create(Self);
fEdit2.Parent:=Self;
fEdit2.Top:=30;
fEdit2.Left:=5;
fEdit2.ReadOnly:=True;

Width:= 131;
Height:=65;
end;

procedure TMyPanel.EditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_up then fEdit2.Text:='UP';
end;

procedure TMyPanel.SetName(const Value: TComponentName);
begin
inherited;
Caption:='';
end;

procedure Register;
begin
RegisterComponents('Mehdi', [TMyPanel]);
end;

end.

موفق باشید.

delphiman00
چهارشنبه 10 تیر 1383, 19:25 عصر
سلام
دقیقا من هم سعی کردم این کار را انجام بدهم اما نتوانستم حتما یک جای کارم اشکال داره
اما سعی می کنم کد شما را امتحان کنم

و فکر کنم جواب بده

از لطف شما بسیار ممنونم

rezamahdizadeh
یک شنبه 30 تیر 1387, 16:03 عصر
اگر بخواهيم براي fEdit1 يك رويدادي شبيه به OnKeyPress بنام OnKeyPress1 و براي fEdit2 رويدادي شبيه به OnKeyPress بنام OnKeyPress2 بنويسيم بطوريكه دو رويداد بنامهاي OnKeyPress1 و OnKeyPress2 به پنجره Object Inspector اين كامپوننت اضافه شود و براي هر كدام بتوان در فرمي كه شي اي از اين نوع كامپوننت در آن قرار دارد كد نوشت، چه تغييراتي بايد داد؟

Hsimple11
یک شنبه 30 تیر 1387, 16:08 عصر
در بخش Published برای اضافه شدن به ObjectInspector.
در مورد اضافه کردن رویدادها در سایت جستجو کنید.