View Full Version : آموزش: ساخت دکمه در ماشین حساب
joooje
جمعه 27 خرداد 1390, 19:15 عصر
سلام
من میخوام یه دکمه توی برنامه ماشین حساب ویندوز بسازم
چرا این کد جواب نمیده؟؟؟؟
procedure TForm1.Button1Click(Sender: TObject);
var
Object1 : TButton ;
Hand: THandle;
begin
Hand:= FindWindow('CalcFrame', 'Calculator');
Object1 := TButton.Create(self);
Object1.Parent := FindControl(Hand);
Object1.Show ;
end;
SAASTN
جمعه 27 خرداد 1390, 23:05 عصر
این که این کد چرا کار نمی کنه به خاطر FindControl هست. چون FindControl تنها در بین هندل های متعلق به پروسه فعلی دنبال کنترلها می گرده. پروسه فعلی هم که مربوط به برنامه شما هست نه ماشین حساب. اگه کد رو هم دیباگ کنید که می بینید که FindControl داره nil بر می گردونه.
اما این که این کار رو چطور میشه انجام داد، من نمی دونم!
Felony
جمعه 27 خرداد 1390, 23:49 عصر
باید از متد CreateParented استفاده کنید و هندل پنجره مورد نظر رو به متد ارسال کنید :
Object1 := TButton.CreateParented(Hand);
joooje
شنبه 28 خرداد 1390, 10:13 صبح
سلام
ممنون
ولی من اولش از همون کد استفاده کردم که جواب نمی داد
گفتم شاید این یکی جواب بده
کدی که قبلا استفاده کرده بودم و شما هم فرمودید این میشه که باز هم کار نمیده؟؟؟
procedure TForm1.Button1Click(Sender: TObject);
var
Object1 : TButton ;
Hand: THandle;
begin
Hand:= FindWindow('CalcFrame', 'Calculator');
Object1 := TButton.CreateParented(Hand);
Object1.Show ;
end;
میشه راهنمایی کنید چرا؟
Felony
شنبه 28 خرداد 1390, 14:00 عصر
شئ Button در برنامه مورد نظر ساخته میشه ولی نمایش داده نمیشه ؛ میتونید با صدا زدن EnumChildWindow که یک Callback Function هست از این موضوع مطمئن بشید ( پست شماره 52 (http://barnamenevis.org/forumdisplay.php?140-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D8%B9%D9%85%D9%88%D9%85%DB%8C-%D8%AF%D9%84%D9%81%DB%8C-%D9%88-%D9%BE%D8%A7%D8%B3%DA%A9%D8%A7%D9%84)) ؛ برای نمایش باید اول برای Button یک Owner تائین کنید و سپس به وسیله متد ParentWindow اون رو به پنجره دلخواه انتقال بدید :
var
Hand: THandle;
Object1: TButton;
begin
Hand := FindWindow('CalcFrame', 'Calculator');
Hand:= FindWindowEx(Hand, 0, 'CalcFrame', nil);
object1 := TButton.Create(Self);
object1.ParentWindow := Hand;
end;
akar_program
شنبه 28 خرداد 1390, 15:18 عصر
من ویندوز 7 نیشون داد ولی میره زیر همه ابجیكتهای ماشین حساب
joooje
شنبه 28 خرداد 1390, 16:22 عصر
ممنون از راهنماییتون
دقیقا درست جواب میده
فقط ممکنه یکم در مورد این قسمتهایی که رنگی کردم بیشتر توضیح بدید که کارشون چی هست یا یه منبع معرفی بکنید که توش بتونه راهنمایی کرده باشه
Hand:= FindWindowEx(Hand, 0, 'Tform1', nil);
چون مثلا من برای برنامه خودتون (Silver Handle Viewer) کد زیر رو اجرا کردم که جواب نداد،
procedure TForm1.Button1Click(Sender: TObject);
var
Hand: THandle;
Object1: TButton;
begin
Hand := FindWindow('Tform1', 'Silver Handle Viewer');
Hand:= FindWindowEx(Hand, 0, 'Tform1', nil);
object1 := TButton.Create(Self);
object1.ParentWindow := Hand;
object1.show ;
end;
Felony
شنبه 28 خرداد 1390, 16:56 عصر
از تابع FindWindowEX برای گرفتن هندل یکی از Child های یک هندل که داریمش استفاده میشه ، تو اون کد که من قرار دادم از FindWindowEX کردم چون روی فرم Calculator یک Panel قرار داده بودن و روی اون کنترل ها رو چیده بودند ، اگر مستقیما مقدار هندل به دست اومده از FindWindow رو به متد ParentWindow میدادم دکمه میرفت زیر پنل و معلوم نمیشد .
در کدی که خودتون قرار دادید نیازی به اون نیست چون شما میخواین دکمه رو مستقیما روی فرم قرار بدید :
var
Hand: THandle;
Object1: TButton;
begin
Hand := FindWindow('TForm1', 'Silver Handle Viewer');
object1 := TButton.Create(Self);
Object1.OnClick:= MyClick;
object1.ParentWindow := Hand;
end;
منبع هم بهتر از MSDN میخواین ؟!
joooje
شنبه 28 خرداد 1390, 21:33 عصر
تشکر از شما
مشکل حل شد!!
فقط یه سوال : وقتی مثلا با این روش یه چکباکس یا رادیو باکس میسازم ، اطرافش یه رنگی وجود داره که با رنگ فرم قبلی یکسان نیست
آیا میشه این مشکل رو اصلاح کرد یا راه حلی براش وجود نداره ؟
joooje
یک شنبه 29 خرداد 1390, 15:31 عصر
سلام و ممنون از دوستان
من مشکل سوال قبل رو حل کردم
یعنی تصمیم گرفتم دکمه رو توی یه Panel بسازم و از کد زیر استفاده کردم که مشکلم حل شد:
procedure TForm1.Button1Click(Sender: TObject);
var
Hand: THandle;
Object1: TPanel;
Object2: TButton;
begin
Hand := FindWindow('TForm1', 'Silver Handle Viewer');
object1 := TPanel.Create(Self);
object1.ParentWindow := Hand;
object2 := TButton.Create(Self);
object2.ParentWindow := Object1.Handle;
end;
ولی یه مشکل جدید برام به وجود اومد و اونم اینه که چرا اگر به جای Button بخوامSplitter رو مثل کد بالا بسازم ایراد میگیره؟
به خط ستاره دار گیر میده. چرا؟ مگه Button با Splitter چه تفاوتی داره؟
procedure TForm1.Button1Click(Sender: TObject);
var
Hand: THandle;
Object1: TPanel;
Object2: TSplitter;
begin
Hand := FindWindow('TForm1', 'Silver Handle Viewer');
object1 := TPanel.Create(Self);
object1.ParentWindow := Hand;
object2 := TSplitter.Create(Self);
****object2.ParentWindow := Object1.Handle;
end;
ممنون از راهنماییهاتون
Felony
یک شنبه 29 خرداد 1390, 19:22 عصر
ولی یه مشکل جدید برام به وجود اومد و اونم اینه که چرا اگر به جای Button بخوامSplitter رو مثل کد بالا بسازم ایراد میگیره؟
شئ Object2 از کلاس TSplitter مشتق شده ، خود TSplitter هم از TGraphicControl و خود TGraphicControl هم از TControl، اشیائی که از TControl مشتق میشن متد ParentWindow ندارن ، اون اشیائی که متد ParentWindow دارن از TWinControl مشتق شدن .
joooje
یک شنبه 29 خرداد 1390, 22:44 عصر
ممنون
ولی پس به جای اون از چه کدی میشه استفاده کرد؟
lord_viper
دوشنبه 30 خرداد 1390, 17:32 عصر
برای تغییر پرنت دکمه ای که میسازی باید از تابع api
SetParent استفاده کنی نه از متد SetParent خود کنترل
در ضمن با این کار متد onclick باتن جواب نمیده یا باید هوک بنویسی یا از متد onMouseDown استفاده کنی
Felony
دوشنبه 30 خرداد 1390, 18:01 عصر
ولی پس به جای اون از چه کدی میشه استفاده کرد؟
اون قبیل اشیاء هندلی ندارن که بخواین منتقلشون کنید .
برای تغییر پرنت دکمه ای که میسازی باید از تابع api
SetParent استفاده کنی نه از متد SetParent خود کنترل
خود کنترل متد ParentWindow داره ، نیازی به استفاده از اون تابع API نیست .
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.