ورود

View Full Version : سوال: انتقال ماوس بر روی کنترل فعال فرم



hadisalahi2
دوشنبه 08 شهریور 1389, 14:21 عصر
سلام.
چطوری میتونم هنگام ورود به یک کادر یا انتقال فوکوس به یک کنترل خاص روی فرم ، موقعیت ماوس رو هم همون کنترل قرار بدم طوری که ماوس روی کنترل قرار بگیره؟

vcldeveloper
دوشنبه 08 شهریور 1389, 15:45 عصر
مختصات اون کنترل رور بر اساس مختصات صفحه نمایش به دست بیارید (با استفاده از ClientToScreen)، سپس با استفاده از SetCursorPos، اشاره گر موس را بر روی آن نقطه حرکت بدید.

hadisalahi2
دوشنبه 08 شهریور 1389, 17:14 عصر
سلام
اگه میشه روش استفاده از ClientToScreen رو بیان کنید. چون یک Tpoint میخواد که نمیدونم باید چی اونجا قرار بدم.
اگه مثلا به یک کنترل به نام Edit1 مثال بزنید ممنون میشم.
یا حق

Felony
دوشنبه 08 شهریور 1389, 17:57 عصر
var
Pos: TPoint;
begin
Pos:= ClientToScreen(Point(Button1.Left, Button1.Top));
ShowMessage(IntToStr(Pos.X));
ShowMessage(IntToStr(Pos.Y));
end;

nilidelphi
سه شنبه 09 شهریور 1389, 11:55 صبح
مختصات اون کنترل رور بر اساس مختصات صفحه نمایش به دست بیارید (با استفاده از ClientToScreen)، سپس با استفاده از SetCursorPos، اشاره گر موس را بر روی آن نقطه حرکت بدید.

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

tdkhakpur
سه شنبه 09 شهریور 1389, 12:52 عصر
اگه ما ندونیم که تب روی کدوم کنترل قرار داره باید از کجا بدونیم که باید از کدوم کنترل استفاده کنیم برای انتقال؟

برای این کار روشهای زیادی وجود داره با GetFocus میتوانید بدست بیارید


procedure CursorToActiveEdit(form : TForm);
var
hndl : HWND;
i : integer;
Name : array[0..256] of char;
EditClassName : AnsiString;
pt :TPoint;
begin
hndl := GetFocus;
GetClassName(hndl, Name, 256);
EditClassName := AnsiString(Name);
for i:=0 to form.ComponentCount-1 do
if (form.Components[i].ClassName = EditClassName) and (TEdit(form.Components[i]).Handle=hndl) then
begin
pt.X := TEdit(form.Components[i]).Left;
pt.Y := TEdit(form.Components[i]).Top;
pt := form.ClientToScreen(pt);
SetCursorPos(pt.x, pt.y);
break;
end;
end;
مثال
CursorToActiveEdit(Form1);

SAASTN
سه شنبه 09 شهریور 1389, 18:02 عصر
برای این کار روشهای زیادی وجود داره با GetFocus میتوانید بدست بیارید
یه راه ساده تر هم Form.ActiveControl هست.
اگر هم بخوایم از حلقه روی کامپوننت ها استفاده کنیم بازم میشه شرط رو به شکل زیر نوشت:
if (Components[I] is TWinControl) and TWinControl(Components[I]).Focused then


ضمنا من علت اون مقایسه ClassName رو هم نفهمیدم، میشه بیشتر توضیح بدین؟ مگه هندل ها می تونن تکراری باشن که یه چک دیگه هم لازم باشه؟

Felony
سه شنبه 09 شهریور 1389, 18:59 عصر
ضمنا من علت اون مقایسه ClassName رو هم نفهمیدم، میشه بیشتر توضیح بدین؟ مگه هندل ها می تونن تکراری باشن که یه چک دیگه هم لازم باشه؟
نه نمیتونن تکراری باشن و میشه اون شرط اول رو هم حذف کرد ؛ ولی همیشه اینطور نیست و همیشه نمیشه اون بررسی اول رو حذف کرد ؛ در اصل کار اصولی همون کد بالا هست ، به این تبدیل کد Hard Cast میگن ( Hard Cast ها به خودی خود ناامن هستن ) ، در این قسمت از کد : TEdit(form.Components[i]).Handle ما به کامپایلر اعلام میکنیم که منتظر چه شئ هستیم ( در اینجا TEdit ) حالا در هنگام فراخوانی کد وقتی حلقه داره روی اشیاء فرم حرکت میکنه ، ممکنه شئ جاری یک Button و از کلاس TButton باشه ولی ما میخوایم مثل یک TEdit بهش دسترسی داشته باشیم در این مثال مشکلی پیش نمیاد چون هم Button و هم Edit هر دو دارای متد Handle هستن ولی وقتی بخوایم به یک متد دیگه دسترسی داشته باشیم ممکنه شئ جاری اون متد رو نداشته باشه و در این زمان برنامتون با خطای دسترسی غیر مجاز ( Access Violation ) رو به رو میشه .

برای تبدیل یک Hard Cast از وضعیت نا امن به امن باید به صورت زیر عمل کرد ( در بررسی اول کد قبلی که شما بهش اشاره کردید یه همچین چیزی پیاده شده ) :

if Sender is TEdit then
TEdit(Sender).Handle:= SomeValue;