PDA

View Full Version : عدم انتخاب tabsheet يك pagecontrol با موس



Site Admin
شنبه 22 آبان 1389, 22:28 عصر
سلام از عنوان مشخصه كه چي ميخوام

BORHAN TEC
شنبه 22 آبان 1389, 23:14 عصر
مشکلتون رو دقیقاً متوجه نشدم.نمی دونم که این مشکل رو در زمان طراحی دارین یا در زمان اجرا. اگه در زمان طراحی مشکل دارین باید ابتدا یک سربرگ را انتخاب کنید تا فعال شود و سپس برای انتخاب tabsheet مربوطه قسمت مشخص شده در عکس زیر رو انتخاب کنید.

Mahmood_M
یک شنبه 23 آبان 1389, 00:19 صبح
کامپوننت PageControl یک رویداد داره به نام OnChange ، توی این رویداد می تونید چک کنید که اگر کاربر به به یک Tab غیر مجاز وارد شده بود ، از اون تب خارج بشید و به تب دیگه ای برید ، البته این روش چند تا مشکل داره ، یک مشکل برای پیدا کردن تب قبلی هست ، مثلا فرض کنید ، توی صفحه ی یک هستید و نمیخواید که کاربر به صفحه ی 2 بره ، باید طوری عمل کنید که کاربر با انتخاب صفحه ی دو دوباره به صفحه ی قبل یعنی صفحه یک برگرده ، ولی اینکه چطور بفهمید که صفحه ی یک صفحه ی قبلی بوده کمی دردسر داره ! ، مشکل بعدیش هم اینه که ممکنه با حجیم شدن صفحات کمی پرش تصویر در حین این کار مشاهده بشه ...

ولی راه حل منطقی تری هم هست ، PageControl یک رویداد دیگه به نام OnChanging داره ، در این رویداد یک متغیری به نام AllowChange در اختیارتون هست که بهتون اجازه میده که تعیین کنید که آیا صفحه عوض بشه یا نه ، فقط مشکل اصلی در اینجا اینه که باید بفهمیم کاربر قصد ورود به کدوم صفحه رو داره ...

در یونیت CommCtrl یک تابع به نام TabCtrl_HitTest قرار داره ، که با گرفتن Handle یک PageControl و مختصات یک نقطه از اون ، شماره ی Index اون رو برمیگردونه ! ، ( HitTest برای خیلی از کنترلها کاربرد داره ، فعلا فقط یک استفاده ی کوچیک ازش میکنیم ! و زیاد وارد جزئیاتش نمیشیم !! )
اول باید برای مشخص کردن TabSheet ای که موس روی Tab اون قرار داره و همینطور TabSheet ای که نباید انتخاب بشه دو متغیر به صورت عمومی تعریف کنید ، مثال :

var
Form1: TForm1;
CurrentIndex, DisabledIndex : Integer;

implementation

متغیر CurrentIndex برای Index ای که موس روش هست و DisabledIndex هم برای Index ای که صفحه ی مربوط به اون نباید انتخاب بشه ...
خوب ، از HitTest به صورت زیر در رویداد OnMouseMove مربوط به PageControl استفاده میکنیم :
procedure TForm1.PageControl1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
ChInfo : TTCHitTestInfo;
begin
ChInfo.pt.X := X;
ChInfo.pt.Y := Y;
ChInfo.flags := TCHT_ONITEM;
CurrentIndex := TabCtrl_HitTest(PageControl1.Handle, @ChInfo);
end;
با اجرای دستور بالا Index مربوط به Tab ای که موس روش قرار داره درون CurrentIndex قرار میگیره ...
حالا باید در رویداد OnChanging بررسی کنیم که اگر CurrentIndex برابر با DisabledIndex بود ، صفحه عوض نشه :
procedure TForm1.PageControl1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
if CurrentIndex = DisabledIndex then
AllowChange := False;
end;
صفحه ای که نباید انتخاب شده رو هم می تونید هر بار که نیاز شد تعیین کنید ، مثلا در رویداد OnCreate فرم اصلی :
procedure TForm1.FormCreate(Sender: TObject);
begin
DisabledIndex := 1;
end;

دوباره یادآوری میکنم که یونیت CommCtrl ( با ComCtrls اشتباه نگیرید ! ) باید به قسمت Uses اضافه بشه ...

فکر میکنم نحوه ی استفاده مشخص باشه ولی اگر نیاز بود بگید تا مثالی قرار بدم ، موفق باشید ...

mohammad_kerman65
سه شنبه 04 مهر 1391, 10:57 صبح
با سلام و خسته نباشيد خدمت اساتيد محترم
من توی برنامه ام از page control استفاده کرده ام که توی هر تب آن یکسری فیلد گذاشتم.یک فیلد دارم برای شماره چک که توی onexit ان گفتم که چک کند که ایا این شماره چک هستش یا خیر اگه نبود پیغام دهد و دوباره توی همون فیلد setfocus كنه.حالا اگه کد اشتباه خورده باشه و با موس تب رو عوض کنم چون تب عوض شده نمیتونه توی فیلد setfocus کنه و error میده آیا راه حلی برای این مشکل وجود داره؟؟؟
با تشکر

mohammad_kerman65
سه شنبه 04 مهر 1391, 11:10 صبح
فکر کنم سوالم در جای مناسبی نپرسیدم.ببخشید.اگه میشه همینجا جواب بدید یا اینکه راهنمائی کنید کجا سوالم بپرسم
با تشکر

MohsenB
سه شنبه 04 مهر 1391, 12:08 عصر
سلام

خوب شما ابتدا خاصیت TabIndex رو ست کنید بعد از ست فوکوس استفاده کنید.

موفق باشید

mohammad_kerman65
سه شنبه 04 مهر 1391, 12:36 عصر
نمیشه اقا محسن
من حتی واسش شرط گذاشته در صورتی که تب فعال هست فوکوس کنه
if pagecontrol.activepageindex=0 then
Echek.setfocus;
اما باز هم اررور میده.
یا اینکه شرط گذاشتم که اول تب رو فعال کن بعد فوکوس کن
pagecontrol.activepageindex := 0;
Echek.setfocus;
اما باز هم نمیشه...

mohammad_kerman65
سه شنبه 04 مهر 1391, 13:19 عصر
از اساتید کسی روشی نداره که بشه این مشکل حل کرد؟؟؟
اگه هم نخوام setfocus کنم جالب در نمیاد...

Felony
سه شنبه 04 مهر 1391, 13:34 عصر
همون پست شماره 3 میتونست کمکتون کنه ؛ کامپوننت PageControl برای این مورد دارای 2 رویداد مجزا هست ، یکی OnChange که وقتی Tab تغییر کرده باشه اجرا میشه و یکی هم OnChanging که قبل از تغییر Tab فعال میشه ، شما کد بررسی رو تو رویداد OnChanging بنویس و اگر شرطت برقرار نشد و قرار شد روی فیلدی فکوس کنی اول AllowChange رو False کن تا Tab عوض نشه و بعد روی فیلد مورد نظر فکوس کن .

mohammad_kerman65
چهارشنبه 05 مهر 1391, 06:57 صبح
با تشکر از اینکه وقت گذاشتید واسه جواب دادن
اما من شرطم داخل onexit مربوط به ادیت بررسی میشه که onchanging مربوط به pagecontrol زودتر از onexit ادیت اجرا میشه.مشکل اینجاست که اول باید onexit اجرا شود که اگه شرط برقرار نبود مثلا یه متغیر رو falseکنه که onchanging h اجرا نشه.و همچنین نمیشه شرطی که توی onexit نوشته شده رو توی onchanging بنویسم....