PDA

View Full Version : سوال: چطور پروسیجری رو به رویداد OnMouseDown انتساب بدم؟



mbshareat
یک شنبه 27 فروردین 1391, 11:39 صبح
سلام
تا اونجا که یادمه در مورد OnClick سفارشی بحث شده بود.نمی دونستم چی رو باید جستجو بدم؟نیم ساعت داشتم نتایج جستجو رو می خوندم چیزی گیرم نیومد.
من می خوام یک پنجره سفارشی درست کنم. می خوام بتونم با گرفتن قسمت بالای پنجره اون رو جابجا کنم.
اول چند تا متغیر عمومی تعریف کردم (PicMouseDownوPicMouseXوFormLeftوFormTop)
بعد اومدم یه پروسیجر نوشتم:

procedure FormPicMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
If Y<30 then
Begin
PicMouseDown:=True;
PicMouseX:=Mouse.CursorPos.X-FormLeft;
PicMouseY:=Mouse.CursorPos.Y-FormTop;
End;
end;

بعد اون رو به OnMouseDown یک Image (در اینجا FormPic) منسوب کردم:

FormPic.OnMouseDown:=FormPicMouseDown;

اما ایراد گرفت که :

[Error] Unit1.pas(402): Incompatible types: 'method pointer and regular procedure'
چطور می تونم مشکل رو حل کنم؟

Felony
یک شنبه 27 فروردین 1391, 11:46 صبح
Procedure ی که مینویسید باید یک متد از یک کلاس باشه ، یعنی اعلان Procedure تون رو تو بخش Private کلاس فرم برنامتون یا ... تعریف کنید و بعد Ctrl + Shift + C رو بزنید تا روالتون ساخه بشه و بعد کدهاتون رو در داخل اون بنویسید و اون روال رو به OnMouseDown اختصاص بدید .

mbshareat
یک شنبه 27 فروردین 1391, 15:02 عصر
سلام
آقا لطف می کنین کد من رو نگاه کنین. (فکر کنم خندتون بگیره!):
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TFormImg = class(TImage)
private
procedure MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
End;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TFormImg.MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage(IntToStr(Y));
end;
procedure TForm1.Button1Click(Sender: TObject);
Var
FormImg:TFormImg;
begin
FormImg:=TFormImg.Create(self);
FormImg.OnMouseDown:=FormImg.MouseDown;
FormImg.Parent:=self;
FormImg.Picture.Bitmap.Width:=100;
FormImg.Picture.Bitmap.Height:=200;
end;

end.

آیا درست کار کردم؟
با فشار دکمه Y گزارش میشه. فقط نفهمیدم چرا حتما باید
FormImg.OnMouseDown:=FormImg.MouseDown; توی برنامه باشه
مگه من FormImg رو از نوع TFormImg تعریف نکردم؟ چرا چیزی که قبلا برای کلاس تعریف شده باید برای FormImg که یک نمونه از کلاس است هم تعریف کنم؟

mbshareat
یک شنبه 27 فروردین 1391, 18:47 عصر
ببخشید من درست توضیح ندادم با فشار دکمه Image درست میشه و وقتی روی تصویر ماوس را فشار بدیم Y گزارش میشه.
مگه Private به چه معناست. من فکر می کردم اختصاصی همون کلاس باشه اما این که یه نمونه از همون کلاس هم نتونه به Event دسترسی داشته باشه چی بگم؟!
من Public رو هم امتحان کردم باز هم به اون خط کد نیاز بود.

Mask
یک شنبه 27 فروردین 1391, 19:35 عصر
فرقی نمیکنه. شما این ایونت رو داری در بلوکهای این کلاس تعریف میکنی.
اگه میخای اینطور نباشه شی ایمیجت رو به صورت کلاس تعریف نکن و ایونت موس دان رو هم در بلوکهای کلاس فرم اصلی تعریف کن.

mbshareat
یک شنبه 27 فروردین 1391, 20:02 عصر
سلام
اصلا من تو یونیتم فرم اصلی ندارم. من فقط می خوام یه یونیت داشته باشم که در اون یه پنجره پیغام سفارشی داشته باشم.

mbshareat
یک شنبه 27 فروردین 1391, 20:53 عصر
سلام این فقط یک نمونه کد بود که بپرسم کدم درسته یا نه.
سرتون رو درد نیارم سورسهای نمونه آموزشی رو ببینین منظورم ColorMsg هستش!!!

Ananas
یک شنبه 27 فروردین 1391, 22:42 عصر
سلام.نمونه هایی که گذاشته بودی رو الان دیدم خیلی عالی و ارزنده هستند انشاالله موفق باشی.
کد شما رو تغییر دادم و برای formimg یک متد سازنده تعریف کردم. فکر میکنم مشکلتو حل کنه :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TFormImg = class(TImage)
private
procedure MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
public
constructor Create(AOwner : TComponent; AParent : TWinControl;
Width_ : Integer = 200; Height_ : Integer = 100);
End;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TFormImg.MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ShowMessage(IntToStr(Y));
end;

constructor TFormImg.Create(AOwner : TComponent; AParent : TWinControl;
Width_ : Integer = 200; Height_ : Integer = 100);
begin
inherited Create(AOwner);
Self.OnMouseDown := Self.MouseDown;
Self.Parent := AParent;
Self.Picture.Bitmap.SetSize(Width_, Height_);
Self.Width := Width_;
Self.Height := Height_;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
FormImg:TFormImg;
begin
FormImg:=TFormImg.Create(Self, Self, 200, 100);
//FormImg.OnMouseDown:=FormImg.MouseDown;
//FormImg.Parent:=self;
//FormImg.Picture.Bitmap.Width:=100;
//FormImg.Picture.Bitmap.Height:=200;
end;

end.

mbshareat
دوشنبه 28 فروردین 1391, 00:31 صبح
سلام همشهری
اگه خواستین یکمی توسعش دادم.ColorInput و ColorConfirm هم بهش اضافه کردم. فقط نمی دونم لازمه اشیای داخل فرم رو هم Free بکنم یا نه؟(که البته ربطی به این تاپیک نداره!)

Ananas
دوشنبه 28 فروردین 1391, 01:20 صبح
دستت درد نکنه.
در مورد free فکر کنم نخواد free کنی اگه Owner رو شی والدشون قرار بدی هر موقع والد از بین بره اونها هم از بین میرن یعنی شی Owner موقع آزاد شدن متد free این شی رو هم فراخونی میکنه پس فقط یک شی والد رو آزاد کن بقیه خودشون طی میشن. اگه درست گفته باشم.

mbshareat
دوشنبه 28 فروردین 1391, 08:47 صبح
سلام
درسته من نمی دونستم اصل کد رو از کجا گیر اوردم ولی حالا پیدا کردم: InputQuery