View Full Version : تشخیص نوع کامپوننت؟
  
user addi
دوشنبه 19 دی 1384, 20:06 عصر
همونطور که می دونیم تمامی کامپوننتهای edit,memo,dbedit و ... که می تونیم توشون داده وارد کنیم از کلاس customedit ارث بردن.
حالا من میخوام تشخیص بدم نوع کنترلی که الان روش focuse کردم چی هست.
میتونیم با کد زیر تشخیص بدیم که کنترل از نوع customedit هست ولی نمی تونم نوع دقیق اونو تشخیص بدم لطفا راهنمایی کنید..
if( ( activecontrol as component ) is tcustomedit ) then
begin
....
end
در واقع می خوام تمامی کامپوننتهایی که از customedit ارث بردن موقعی که روشون focuse کردم رنگشون عوض بشه .
من این کار رو تا حدودی انجام دادم ولی هر دفعه که یه کامپوننت جدید استفاده می کنم باید کدم رو update  کنم که زیاد از این کار خوشم نمیاد.
روش من تو on key press  فرم به این صورته :
if( key  #13 )then
begin
if( ( activecontrol as tcomponent) is tcustomedit ))then
begin
if( ( activecontrol  as tcomponent ) is tedit ) then
(activecontrol as tedit).color = clred;
if( ( activecontrol as tcomponent ) is Tmemo ) then
(activecontrol as tmemo).color = clred;
.
.
.
.
end;
end;
mzjahromi
دوشنبه 19 دی 1384, 20:39 عصر
این طور اگه بنویسی فکر نمی کنم مشکلی پیش بیاد چون همه شون Color رو دارن.
If ActiveControl is TCustomEdit then
  TEdit(ActiveControl).Color:=clRed;
من نوشتم جواب داد فکر نمی کنم در عمل هم مشکلی به وجود بیاد
shayan_delphi
دوشنبه 19 دی 1384, 23:13 عصر
اینم یه راهه:(اشیا دلخواه هستند)
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   if (Sender is TEdit)  then
     TEdit(Sender).Color := clRed;
   if (Sender is TMemo)  then
     TMemo(Sender).Color := clBlue;
   if (Sender is TListBox) then
     TListBox(Sender).Color := clYellow;
end;
و
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  TEdit(Sender).Color := clWhite;
  TMemo(Sender).Color := clWhite;
  TListBox(Sender).Color := clWhite;
end;
shayan_delphi
دوشنبه 19 دی 1384, 23:24 عصر
یادم رفت بگم..
همه اشیا مورد نظر مثل EDIT,LISTBOX,MEMO را انتخاب کن و بعد در رویداد مربوطه دستور را بنویس.
پس فقط یه بار هر دستور نوشته میشه.
m-khorsandi
سه شنبه 20 دی 1384, 08:49 صبح
if( key = #13) then
  begin
    if Sender.InheritsFrom(TCustomEdit) then
      // ...
  end;
از این کد استفاده کنید.
user addi
سه شنبه 20 دی 1384, 16:00 عصر
با تشکر از همه دوستان
اگر بخوام روی روال onexit هر کدوم از component ها این دستور رو بنویسم خیلی طول می کشه و باید برای همه اونها بنویسم یعنی اگه 20 تا edit روی فرم داشته باشم باید برای همشون بنویسم یا اینکه همه رو به یکی وصل کنم...
ولی من می خوام توی روال on key press  فرمم این کار رو انجام بدم چون همه فرمهای من از یک فرم ارث می برن و میخوام این کار رو توی فرم پدر انجام بدم تا لازم نباشه برای هر کدوم از فرم ها دوباره این تنظیمات رو انجام بدم..
در ضمن اگه تو onkeypress فرم فقط کد مربوط به مثلا tedit رو بنویسم ولی تو فرمم یک memo  یا چیز دیگه داشته باشم exception می ده.
یه راهش اینه که برای همه component ها کدشو بنویسم ولی از این کار خوشم نمیاد چون هردفعه یک کامپوننت جدید به یکی از فرمام اضافه کنم باید برم تو فرم پدر تعریفش کنم....
user addi
سه شنبه 20 دی 1384, 16:05 عصر
یه مطلب دیگه 
tcustomedit اصلا property به نام color نداره اگه داشت که من دیگه مزاحم نمی شدم
mzjahromi
سه شنبه 20 دی 1384, 16:22 عصر
[QUOTE
در ضمن اگه تو onkeypress فرم فقط کد مربوط به مثلا tedit رو بنویسم ولی تو فرمم یک memo  یا چیز دیگه داشته باشم exception می ده.
[/QUOTE]
ولی من امتحان کردم  مشکلی نداشت. اگه اون Property رو همه داشته باشن مشکلی نداره
user addi
سه شنبه 20 دی 1384, 19:41 عصر
کدی که  شما نوشتید برای همه جواب میده ؟؟؟!!!!!
من که هر کاری میکنم اررور می ده و میگه cast مناسب نیست
بازم من دوباره تست می کنم ....
mehdi_zangian
شنبه 20 اسفند 1384, 15:29 عصر
activecontrol  تنها برای component هایی هست که focus بشن ولی برای speed button ها چکار باید کرد. در ضمن با استفاده از sender تنها می توان نوع کلاس یا component  را تشخیص داد نه نام آن را(البته می توان نام آنرا با فرمان if  تست کرد) در vb میتوان با  sender.name  به نام component  دست یافت ولی تو دلفی نمی دانم .
Naficy
شنبه 20 اسفند 1384, 16:05 عصر
در دلفی هم بعد از کست کردن sender به کامپوننت (یا هر کلاس دیگری که از آن ارث می برد) می توان name را بدست آورد:
(sender as TComponent).Name
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.