تغییر سایز و محل عناصر فرم با تغییر اندازه فرم در ویژوال بیسیک

kalazim

New Member
سلام دوست عزیز
راستش مشکلی داشتم ، خواستم اگر لطف کنی منو راهنمایی کنی.
می خواهم در ویژوال بیسیک ، وقتی فرم رو بزرگ میکنم تمام عناصر موجود در آن همراه فرم بزرگ شوند ( با ابعاد مناسب). و وقتی فرم رو کوچک کردم ، دوباره عناصر کوچک شوند.در حال حاظر وقتی فرم رو بزرگ میکنم تمام عناصر موجود در آن جابجا می شوند که اصلا قشنگ نیست. اگر منو راهنمایی کنی ممنون میشوم. در ضمن آدر س ایمیل من ([email protected]) است.و تلفن تماسم هم (09177048020) است. اگر به من بگی که جوابم رو کجا می تونم پیدا کنم ممنون میشوم. با تشکر فراوان . عظیم.
 

saalek110

Well-Known Member
http://www.dreamincode.net/forums/showtopic34776.htm


سایت بالا فکر کنم مربوط به این قضیه باشد.

ولی چیزی که من بلدم خودم اینه که در رویداد Resize فرم(قابل انتخاب در پنجره کد) عناصر فرم را( و احتمالا محل آنها را) با توجه به اندازه فرم تغییر دهید.
 

the_king

مدیرکل انجمن
من این کدی که در www.dreamincode.net نوشته شده را توصیه نمی کنم، چون طوری کل فرم را تغییر اندازه می ده
که انگار کل فرم، یک تصویر گرافیکی است. ما به روتینی احتیاج داریم که با توجه به نظر ما شیوه تغییر اندازه و موقعیت
هر کنترل را بصورت جداگانه تعیین کنیم. مثل Anchor در VB.Net

من دقیقا همین کار رو کردم، یک کلاس به نام ClassResizeForm ساختم که مشخصات کامل هر کنترل را بصورت جداگانه
ذخیره می کنه و عملیات تغییر اندازه رو به سادگی انجام می ده.
مساله اینجا بود که کنترلهای استاندارد VB مشخصه ای به نام Anchor نداشتند، من این مشکل را با استفاده از مشخصه
Tag حل کردم. چون تمامی کنترلهای VB مشخصه Tag را دارند و در اکثر برنامه ها هیچ استفاده ای از این مشخصه نمیشه.

تعریف من از Anchor اینه :
در هر کنترل شما می توانید در مشخصه Tag یکی یا چند تا از عبارتهای زیر را با هر ترتیبی که دوست دارید، بنویسید :
Left
Right
Top
Bottom

کسانی که با VS.NET برنامه نویسی کرده اند با مفهوم Anchor و نحوه کار با آن آشنا هستند، در مورد Tag شما مابین
این عبارتها می توانید از هر کاراکتری که خواستید استفاده کنید و یا آنها را بدون فاصله به هم بچسبانید، بزرگی و کوچکی
حروف هم اصلا مهم نیست. چون مقدار پیشفرض Top,Left است، می توانید آنرا ننویسید. این همان حالت اصلی VB است.
مثلا کنترلی که در Tag آن نوشته شده Top,Right ، همواره از سمت راست فرم فاصله ثابتی خواهد داشت و طول و عرض
آن ثابت خواهد بود.
یا کنترلی که در Tag آن Top,Left,Right نوشته شده، با تغییر طول فرم، طولش تغییر می کند و عرض آن ثابت است.
کنترلی که در Tag آن Left,Right,Top,Bottom نوشته شده طول و عرض آن با تغییر اندازه فرم تغییر خواهد کرد تا فاصله از
حاشیه افقی و عمودی فرم همواره ثابت باشد.
این کلاس با انواع حالت های ScaleMode و انواع کنترلهای استاندارد سازگار است و اگر تنظیم حالت خطا
را به درستی انجام داده باشید (Break on Unhandled Errors) برای موارد غیر استاندارد هم عملکرد مناسبی دارد.

روتینهای برنامه ایندو هستند :

کد:
Public Sub SaveLocations(ByRef Form As Object)
Public Sub Resize(ByRef Form As Object)
اولی مشخصات و موقعیت کنترلهای یک فرم را می خواند و ذخیره می کند.
دومی اندازه یک فرم را با توجه به مشخصات ذخیره شده برای تغییر ظاهر فرم بکار می گیرد.
نیازی به فراخوانی روتین اول نیست، مگر آنکه در حالت اجرای برنامه، شخصا تغییری در فرم ایجاد کرده باشید.
روتین اول در اولین فراخوانی روتین دوم به صورت خودکار صورت می گیرد. شما کافی است که این کد ها را به فرم اضافه کنید :

کد:
Private ResizeData As New ClassResizeForm

Private Sub Form_Resize()
    ResizeData.Resize Me
End Sub

علاوه بر این دو پارامتر MinWidth و MinHeight را هم به کلاس اضافه کردم تا طول و عرض فرم از فلان مقدار معین کمتر نشود،
مقدار پیشفرض این دو پارامتر صفر است. (واحد این دو پارامتر Twip است)
مثلا این کدها را به فرم اضافه می کنم تا طول و عرض فرم از 300 در 200 پیکسل کمتر نشود :

کد:
Private Sub Form_Load()
    ResizeData.MinWidth = 300 * Screen.TwipsPerPixelX
    ResizeData.MinHeight = 200 * Screen.TwipsPerPixelY
End Sub

برای جلوگیری از پرش تصویر فرم در هنگامی که سعی در کوچکتر کردن فرم از این محدوده مشخص شده را دارید، بایستی
از WindowProc و بررسی WM_SIZING می کردم، ولی با توجه به مشکلاتی که در هنگام Debug کردن برنامه ها پیش می آید،
بهتر دیدم که از اینکار صرف نظر کنم.
پس اولین ایراد این برنامه این است که اگر سعی کنید فرم را از دو مقدار MinWidth و MinHeight کوچکتر کنید، صفحه فرم
پرش خواهد داشت.

من برای نمونه، ظاهر یک فرم را طراحی کردم که در Tag های کنترلها مقادیر Anchor مناسب نوشته شده است.
هیچکدام از کنترلهای برنامه کار خاصی انجام نمی دهند و این نمونه فقط ظاهر یک برنامه است.
همان کدهایی که قبلا اشاره کردم برای تغییر اندازه متناسب کنترلهای این فرم کفایت می کنند.
 

پیوست ها

  • Preview.gif
    Preview.gif
    4.5 کیلوبایت · بازدیدها: 73
  • ResizeForm.zip
    13.1 کیلوبایت · بازدیدها: 299

ProgramDevelope

New Member
سلام دوست عزیز

سلام دوست عزیز
یکی ار نکات جالب و دوست داشتنی برنامه نویسی اینه که یه برنامه نویس می تونه از چندین روش برای نوشتن برنامه ی خودش استفاده کنده
مثلا برای سوال شما
یکی از ساده ترین روش ها برای این کار اینه که شما اندازه ی اولیه فرم رو با کنترها یی که استفاده کردی بسنجی و تو رویداد RESIZE فرمت بگی که اندازه ی کنترل من برابر با اندازه ی فرم من منهای اون عددی که از اختلاف بین کنترل و فرمت بدست اومده
برای مثال من در فرمم از یک TEXTBOX استفاده کردم که می خواهم اندازه آن برابر با اندازه ی خود فرم باشه به عبارتی می خواهم در هنگام RESIZE همواره Height.* و Width.* کنترلم برابر با به ترتیب Height.* و Width.* فرمم باشه

Text1.Height = Form1.Height
Text1.Width = Form1.Width
" به همین ساده گی "

فراموش نشود که این کد باید در رویداد RESIZE فرمتان نوشته شود


 

MDP

Well-Known Member
اقا یه چیزی هم به نام Anchor وجود داره تو پراپرتی ها یه نگاه به اونم بندازی میشه یه کارایی کرد باهاش!!!
 

saalek110

Well-Known Member
به نقل از این پست:
http://forum.majidonline.com/showpost.php?p=283508&postcount=184
که از MSDN میکروسافت است.

کد:
Private Sub Form_Resize ()
' Expand text box to fill the current child form.
Text1.Height = [COLOR="Blue"]ScaleHeight[/COLOR]
Text1.Width = [COLOR="Blue"]ScaleWidth[/COLOR]
End Sub
كد بالا را به ((پنجره كد)) فرم 1 بيافزاييد.

اين كدي است كه به ((رويداد تغيير سايز)) فرم 1 واكنش نشان مي دهد. (مترجم: اين كد باعث مي شود كه تكست باكس در هر اندازه اي كه فرم1 بگيرد ، به اندازه فرم 1 بشود. يعني همه گوشه ها را بگيرد.)

سالک : منظورم از این پست این بود که بگویم طول و عرض فرم دو نوع است و باید نوعی را استفاده کنیم که محاسبات ما درست از آب درآید. نمی دانم به این طول و عرض چی می گن. فکر کنم منطقه کاربر یا چیزی شبیه این میگن.
 
  • Like
Reactions: MDP

جدیدترین ارسال ها

بالا