آموزش Mdi . فرم های وابسته . (پدر و فرزند)
سلام
خیلی از دوستان براشون سوال پیش میاد که
چطور میتونیم یک فرم رو در فرم دیگر قرار بدیم که از فرم اصلی خارج نشه :question:
مثل جعبه ابزار Photoshop.
به این فرم ها MDI گفته میشه که دو یا چندین فرم هستند ، یک پدر و یک یا چند فرزند
که فرزندان وابسته به پدر هستند. حالا برای حل مشکلات یه آموزش نیمه کامل گذاشتم
توجه داشته باشید در آموزش. به جای فرم فرزند نوشتم : FormChild
و همچنین به جای فرم پدر یا اصلی نوشتم : FormParent.
قبل از آموزش برای اینکه کامل باهاش آشنا بشید به عکس زیر نگاه کنید.:46:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حالا ، خاصیت FormStyle فرم اصلی رو fsMDIForm بزارید. و خاصیت
FormStyle فرم دوم یا فرزند رو fsMDIChild بگذارید. اما برای اینکه
بتونید داینامیک فرم دوم رو فرزند قرار بدید. و توی فرم اصلی بزارید
باید خاصیت فرم دوم رو در هنگام اجرا بودن برنامه fsMDIChild قرار بدید.
برای اینکار باید از این کد استفاده کنید.
کد:
FormChild.FormStyle := fsMDIChild;
اما حالا فرم فرزند بسته نمیشه و وقتی میخواستید ببندیدش Minmize میشه
برای جلوگیری از این مشکل باید این کد رو توی OnClose فرم دوم یا فرزند قرار بدید.
حالا چند فرمان برای کار با MDI رو بخونید. چون ممکنه نیاز داشته باشید.
پنهان کردن فرم فرزند
کد:
ShowWindow(FormChild.Handle, SW_HIDE),
رسم یک تصویر به صورت کاشی در فرم اصلی(پدر)
اول این رو توی private بزارید.
کد:
procedure Tile(c:TCanvas;b:TBitMap);
حالا این تابع رو باید تعریف کنیم.
کد:
procedure FormParent.Tile(c:TCanvas;b:TBitMap);
var
x,y,h,w,i,j:integer;
begin
with b do begin
h:=b.height;
w:=b.width;
end;
y:=0;
with c.Cliprect do begin
i:=bottom-top-1; //height
j:=right-left-1; //width
end;
while y<i do begin
x:=0;
while x<j do begin
c.draw(x,y,b);
inc(x,w);
end;
inc(y,h);
end;
end;
در آخر باید توی OnPaint فرم اصلی فراخوانی کنیم.
کد:
if Sender is TForm then
Tile(TForm(Sender).Canvas,تصویر از نوع متغیر بیتمپ);
نمونه
کد:
if Sender is TForm then
Tile(TForm(Sender).Canvas,Image1.Picture.Bitmap);
حذف TitleBar در فرم فرزند
اول تعریفش کنید
کد:
type
TFormChild = class(TForm)
{ other stuff above }
procedure CreateParams(var Params: TCreateParams); override;
{ other stuff below }
end;
در آخر استفاده کنید.
کد:
procedure TFormChild.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style and not WS_OVERLAPPEDWINDOW or WS_BORDER;
یا
Params.Style := Params.Style and (not WS_CAPTION);
end;
اما شما نمیخواهد یا رو هم بزارید. منظورم اینه که یکی از این رو فرمان رو بنویسید و دیگری رو حذف کنید.
در آینده ای زود نمونه هم به تاپیک اضافه خواهد شد.
در آخر یک مشکل برای MDI هست که شی های فرم اصلی روی فرم های فرزند هم میاد!
هنوز حل نشده. اگر این مشکل حل شد به آموزش اضافه اش میکنم.
نظرتون رو بگید :10:
موفق باشید.
دمت گرم اقاي soldier !!!!
اقاي soldier دمت گرم كدت دو تا اشكال داشت اولي وقتي فرمتشو توي on create صفر مي كردي ديگه حركت نمي كرد بايد 1 يا2 مي گزاشتي . , و به جاي highet بايد عرض صفحه رو مي زاشتي چون highet يكم پايين تر از صفحه مي رفت يه بازي باهاش ساختم چطوري بايد upload كنم .واقعا دمت گرم ؟؟!!!:40::40::40::40::11::2:
soldier عزيز كمك مي خوام؟!