PDA

View Full Version : مشکل در Focus کنترل



JalaliMehr
شنبه 29 خرداد 1389, 10:51 صبح
سلام به دوستان



من یک کنترل نوشته ام از کلاس TscrollingWinContol و داخل آن چند تا کنترل دیگر از کلاس TCustomControl ایجاد کرده ام ولی وقتی که در زمان اجرا کنترل والد رو ایجاد می کنم فوکوس من روی Button ی قرار دارد که در OnClick آن این کنترل رو ایجاد کرده ام.در داخل Constructor کنترل والد TabStop هم True می باشد. ولی باز هم Focus ندارد و یک مشکل دیگر در زمانیکه در Constructor کنترل های فرزند SetFocus می کنیم از سوی کامپایلر پیغام خطا صادر می شود من در اینجا SetFocus رو نیاز دارم CanFocus مقدار False را بر می گرداند.

مصطفی ساتکی
شنبه 29 خرداد 1389, 21:37 عصر
اینجا SetFocus رو نیاز دارم CanFocus مقدار False را بر می گرداندعملکرد CanFocus به گونه ای که تمام کنترل بالادستی به صورت سلسله مراتبی Enable و Visible شون چک میشه در صورت True بودن همشون SetFocus با موفقیت صورت می گیره .

در Constructor کنترل های فرزند SetFocus می کنیم از سوی کامپایلر پیغام خطا صادر می شود چه تضمینی وقتی کنترل TscrollingWinControl شما Create میشه حتماً Parent اش مشخص باشه و شما زمانی نمی تونید SetFocus کنید Parent کنترل مشخص نباشه که خطا دریافت می کنید شما در Create مربوط به کلاسی که از TscrollingWinControl به ارث بردین Parent رش رو Twincontrol(AOwner) قرار بدید.

SAASTN
یک شنبه 30 خرداد 1389, 23:33 عصر
شما در Create مربوط به کلاسی که از TscrollingWinControl به ارث بردین Parent رش رو Twincontrol(AOwner) قرار بدید.
سلام
این کار به هیچ وجه اصولی نیست، روش درست اینه که SetParent مربوط به کنترل بازنویسی بشه:
TMyScrollingWinControl = class(TScrollingWinControl)
protected
procedure SetParent(AParent: TWinControl); override;
end;

...

{ TMyScrollingWinControl }

procedure TMyScrollingWinControl.SetParent(AParent: TWinControl);
begin
inherited;
if Assigned(Parent) then
Self.SetFocus;
end;

مصطفی ساتکی
دوشنبه 31 خرداد 1389, 08:25 صبح
این کار به هیچ وجه اصولی نیست، روش درست اینه که SetParent مربوط به کنترل بازنویسی بشهموضوع چه ربطی داره به Override متد SetParent . زمانیکه parent یک کنترل فرزند تنظیم میشه این دلیل نمیشه که بتون SetFocus کنه چون ممکن parent والد این instance مشخص نشده باشه شما قبل از فراخوانی رویه SetFocsu بایستی رویه CanFocus رو فراخوانی کنید عملکرد CanFocus به گونه ای که تمام کنترل بالادستی به صورت سلسله مراتبی Enable و Visible شون چک میشه در صورت True بودن همشون SetFocus با موفقیت صورت می گیره . ولی تا این زمان parent مروط به والد تنظیم نشده که بایستی به صورت پیش فرض برابر Owner همان کنترل والد گردد.
اولا همیشه در SetParent هر کنترل ComponetState رو چک کن . دوما اون SetFocus که اونجا قرار دادید آیا از Visible بودن Parent اون اطمینان دارید سوما اگر سوال جناب JalaliMehr (http://barnamenevis.org/forum/member.php?u=149256) دقت می خوندید ایشون در اون کنترل های فرزند رو SetFocus کنه نه خود کنترلو

در زمانیکه در Constructor کنترل های فرزند SetFocus می کنیم از سوی کامپایلر پیغام خطا صادر می شود

SAASTN
دوشنبه 31 خرداد 1389, 09:30 صبح
قربون شکلت چرا آسمون ریسمون می کنی؟
ست کردن Parent با Owner کار درستی نیست. شما همون مسائلی که می فرمائید رو مگه تو Create چک کردی؟ اصلا ممکنه یه کنترل موقع نمونه سازی Ownerش nil باشه و یا همون مسائلی که می فرمائید در مورد Owner هم صادق نباشه.
چیزی که من می گم اینه که Owner و Parent دوتا مشخصه مجرا از هم هستند و اینکه اکثرا ما هر دو اینها رو به یک کنترل ست می کنیم دلیل نمیشه که همیشه یکی باشند. اگه قرار بود همیشه یکی باشند یه Property می شدن. حالا شما اومدی خود سرانه Parent یه کنترل رو برابر Ownerش قرار دادی که این کار درستی نیست.
موفق باشید