PDA

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



delphiman00
جمعه 19 تیر 1383, 12:52 عصر
سلام
من در حال طراحی یک کامپوننت هستم که از کلاس TCustomPanel سرچشمه می گیرد در تاپیک های قبل مدیر سایت لطف کردند و انرا تا حدی بازسازی کردند :


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.

البته اصل این کامپوننت بسیار مفصل است که آوردن همه آن در این تاپیک لزومی ندارد

سؤال من :

من سه Event به این کامپوننت اضافه کردم OnKeyDown,OnKeyPress,OnMouseDown اما مشکل من این است که چون در Panel من دو تا Instance تعریف شده وقتی مثلا ماوس را روی Edit ها می بریم رویداد OnMouseDown اجرا نمی شود

در قسمت Create کامپوننت هم این کار را کردم اما فایده ای نداشت :

OnMouseDown:=fEdit1.OnMouseDown;

حال باید چه کار کرد ؟ ( ظاهرا این Instance ها جلوی دسترسی به اصل کامپوننت را می گیرند )!!! :?:

Sohrab_Tapar
جمعه 19 تیر 1383, 23:04 عصر
در کد onkeydown مربوط به edit بنویس


TPanel(Sender).KeyDown(Sender, Key,Shift)

delphiman00
شنبه 20 تیر 1383, 21:39 عصر
سهراب خان!
با تشکر از شما

دلفی از دستور فوق ایراد می گرفت و لذا آنرا به صورت زیر تغییر دادم :


TPanel(Sender).KeyDown(Key,Shift)

ولی پس از کامپایل کردن کامپوننت و به کارگیری آن در برنامه ام هر وقت کلیدی را فشار میدهم به جای اجرای رویداد ONKeyDown کامپوننتم خطای زیر رخ می دهد :

StackOverflow

مهدی کرامتی
شنبه 20 تیر 1383, 22:58 عصر
آقای DelphiMan00 ، اگر اشتباه نکرده باشم من قبلا به این سوال پاسخ دادم، درسته؟

shiva karimi
یک شنبه 21 تیر 1383, 10:31 صبح
ba salam
agar bekhahim liste tamame data base haye sql server ra dar 1 banameye delphi bebinim che dastore sqliy bayad benivisim
lotfan mara rahnamaye konid

Mohammad S
یک شنبه 21 تیر 1383, 14:36 عصر
ba salam
agar bekhahim liste tamame data base haye sql server ra dar 1 banameye delphi bebinim che dastore sqliy bayad benivisim
lotfan mara rahnamaye konid
ضمن خوشامدگویی به شما:
1) حتما فارسی بنویسید و اگر ویندوز شما فارسی نیست توسط فعال کردن کلید Scroll Lock فارسی بنویسید.
2) چرا این سوال را اینجا مطرح کرده اید؟ در بخش SQL، یک تاپیک جدید ایجاد کنید و سوالتان را آنجا مطرح کنید.

موفق باشید 8)

Sohrab_Tapar
یک شنبه 21 تیر 1383, 14:43 عصر
منظورم همین بود

delphiman00
یک شنبه 21 تیر 1383, 18:47 عصر
مدیر سایت عزیز
با کمال تشکر از بذل توجه شما
نه
قبلا راجع به کنترل رویداد OnKeDown خود Instance مثل Fedit1 صحبت کردیم اما من می خواهم رویداد OnkeyDown TFDate من فعال باشد.
کاری که شما گفتید و من انجام دادم برای داخل خود کامپوننت بود و طراحی من ولی یک کاربر می خواهد از رویداد OnKeyDown خود کامپوننت استفاده کند

چه باید بکنم ؟؟؟!

Sohrab_Tapar
یک شنبه 21 تیر 1383, 23:14 عصر
اگر دستوری مثل


OnKeyDown := FEdit1.OnKeyDown

داری حذفش کن
دستور


TPanel(sender).keydown(key,shift)

را درون کد onkeydown مربوط به edit1 قرار بده
این کد متد onkeydown مربوط به panel را اجرا میکنه
در صورتی که اون دستور اول را در جایی نوشته باشی یه حلقه بوجود
میاد و دو متد
onkeydown
مربوط به panelوedit
هم دیگر را فراخوانی میکنند و خطای مذکور رخ میدهد

delphiman00
جمعه 26 تیر 1383, 08:29 صبح
نه متاسفانه چنین دستوری را هم ندارم

و نمی دانم چه کار کنم

البته می دانید که panel رویداد OnKeyDown ندارد و من خودم صرفا یک پراپرتی OnKeyDown به قسمت Property کامپوننتم اضافه کردم شاید اشکال از این باشد و نیاز به تعریفهای دیگری نیز باشد ؟!!!