PDA

View Full Version : تشخیص نوع کامپوننت؟



user addi
دوشنبه 19 دی 1384, 19: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, 19:39 عصر
این طور اگه بنویسی فکر نمی کنم مشکلی پیش بیاد چون همه شون Color رو دارن.


If ActiveControl is TCustomEdit then
TEdit(ActiveControl).Color:=clRed;

من نوشتم جواب داد فکر نمی کنم در عمل هم مشکلی به وجود بیاد

shayan_delphi
دوشنبه 19 دی 1384, 22: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, 22:24 عصر
یادم رفت بگم..
همه اشیا مورد نظر مثل EDIT,LISTBOX,MEMO را انتخاب کن و بعد در رویداد مربوطه دستور را بنویس.
پس فقط یه بار هر دستور نوشته میشه.

m-khorsandi
سه شنبه 20 دی 1384, 07:49 صبح
if( key = #13) then
begin
if Sender.InheritsFrom(TCustomEdit) then
// ...
end;

از این کد استفاده کنید.

user addi
سه شنبه 20 دی 1384, 15:00 عصر
با تشکر از همه دوستان
اگر بخوام روی روال onexit هر کدوم از component ها این دستور رو بنویسم خیلی طول می کشه و باید برای همه اونها بنویسم یعنی اگه 20 تا edit روی فرم داشته باشم باید برای همشون بنویسم یا اینکه همه رو به یکی وصل کنم...
ولی من می خوام توی روال on key press فرمم این کار رو انجام بدم چون همه فرمهای من از یک فرم ارث می برن و میخوام این کار رو توی فرم پدر انجام بدم تا لازم نباشه برای هر کدوم از فرم ها دوباره این تنظیمات رو انجام بدم..

در ضمن اگه تو onkeypress فرم فقط کد مربوط به مثلا tedit رو بنویسم ولی تو فرمم یک memo یا چیز دیگه داشته باشم exception می ده.
یه راهش اینه که برای همه component ها کدشو بنویسم ولی از این کار خوشم نمیاد چون هردفعه یک کامپوننت جدید به یکی از فرمام اضافه کنم باید برم تو فرم پدر تعریفش کنم....

user addi
سه شنبه 20 دی 1384, 15:05 عصر
یه مطلب دیگه
tcustomedit اصلا property به نام color نداره اگه داشت که من دیگه مزاحم نمی شدم

mzjahromi
سه شنبه 20 دی 1384, 15:22 عصر
[QUOTE
در ضمن اگه تو onkeypress فرم فقط کد مربوط به مثلا tedit رو بنویسم ولی تو فرمم یک memo یا چیز دیگه داشته باشم exception می ده.
[/QUOTE]
ولی من امتحان کردم مشکلی نداشت. اگه اون Property رو همه داشته باشن مشکلی نداره

user addi
سه شنبه 20 دی 1384, 18:41 عصر
کدی که شما نوشتید برای همه جواب میده ؟؟؟!!!!!
من که هر کاری میکنم اررور می ده و میگه cast مناسب نیست
بازم من دوباره تست می کنم ....

mehdi_zangian
شنبه 20 اسفند 1384, 14:29 عصر
activecontrol تنها برای component هایی هست که focus بشن ولی برای speed button ها چکار باید کرد. در ضمن با استفاده از sender تنها می توان نوع کلاس یا component را تشخیص داد نه نام آن را(البته می توان نام آنرا با فرمان if تست کرد) در vb میتوان با sender.name به نام component دست یافت ولی تو دلفی نمی دانم .

Naficy
شنبه 20 اسفند 1384, 15:05 عصر
در دلفی هم بعد از کست کردن sender به کامپوننت (یا هر کلاس دیگری که از آن ارث می برد) می توان name را بدست آورد:
(sender as TComponent).Name