PDA

View Full Version : مشکل در جانمایی فریم با کدنویسی



mohammadsaleh
چهارشنبه 22 آبان 1398, 14:52 عصر
سلام دوستان
برای تنظیم کنترلها در فرم با استفاده از خواص left- top-with-hight مکان نسبی کنترلها در فرم را می توان تعیین کرد
اما رفتار کنترل فریم کمی عجیب است. در صورتیکه بخواهیم ان را با کنترل دیگر در تراز چپ قرار دهیم به جای انتقال به مکان مورد نظر فقط اندازه ان بزرگ می شود. حتی اگر مکان دکمه ها را نیز با این خواص نسبت به کنترلهای دیگر تنظیم کنیم مشکل حل نمی شود
خلاصه مطلب اینکه اگر بخواهیم اندازه فریم و دکمه های ان و نیز مکان قرار گیری ان را نسبت به یکی از کنترلهای برنامه تنظیم کنیم با استفاده از روشهای معمول نمیشود. دوستان اگر تجربه ای در این زمینه دارند ممنون خواهم شد راهنمایی بفرمایند

mazoolagh
پنج شنبه 23 آبان 1398, 11:31 صبح
این فریم که نوشتین این شبهه رو پیش میاره که منظور object frame هست، در حالی که کنترلی که شما استفاده کردین option group هست.

این کنترل در واقع یک container برای کنترلهای داخلی اش هست و parent اونها حساب میشه.

این رفتار که میبینین by design محسوب میشه، به این صورت که کنترلهای داخلی اون نمیتونن تماما یا بخشی شون خارج از مرزهای parentشون باشن، برای همین اگر نترلهای درونی رو جابجا یا resize کنین مرزهای فریم خودکار طوری تنظیم میشن که کنترلها حتما درونش باقی بمونن (اگر لازم باشه).
از اون ور هم میتونین بگین: مرزهای فریم نمیتونه کنترلهای داخلش رو قطع کنه یا بیرون اونها باشه.

mohammadsaleh
پنج شنبه 23 آبان 1398, 13:37 عصر
در مورد فریم پوزش می طلبم
اما در هر صورت جابجایی دکمه ها با فریم اونها برای من ضروری است که انجام بشه.
چرا که در فرم اصلی برنامه که به صورت MAXIMIZED لود میشه جای کنترل ها براساس مانیتور هریک از استفاده کنندگان و رزولوشن اونها باید به صورت نسبی تنظیم بشه که همه کاربرها ظاهر برنامه را یک شکل ببینند. اگر فرم کل صفحه را نمی پوشاند این مورد اهمیتی نداشت ولی اکنون لازمه که هر یک از کنترل از سمت چپ نسبت به همدیگر جانمایی بشوند که فعلا در خصوص این کنترل این مشکل وجود داره تا راه حلی پیدا کنیم

mohammadsaleh
پنج شنبه 23 آبان 1398, 14:56 عصر
نمونه زیر راه حلی است که به نظر می آید نیاز من رو برآورده می کنه

mazoolagh
جمعه 24 آبان 1398, 10:39 صبح
برنامه پیوست رو دیدم و روش رو درست رفتین، یعنی اول باید موقعیت optionها رو جابجا کنین (چون در صورت نیاز فریم خودش رو تنظیم میکنه با موقعیت اونها)
و دست آخر موقعیت و اندازه فریم رو (که چون شما اون رو Transparent کردین نیازی نیست)

اونجور که من متوجه شدم هدف شما بیشتر navigation هست تا انتخاب (با توجه به اینکه از چک باکس یا Option استفاده نکردین)
اگر اینجور هست میتونین روی navigation control یا tab control هم فکر کنین.

از نظر تنظیمات ظاهر دستتون روی navigation control بازتر هست و customization بیشتری داره.

mazoolagh
جمعه 24 آبان 1398, 10:40 صبح
من براتون یک نمونه درست کردم با این دو کنترل که صحبتش رفت:
150958

mazoolagh
جمعه 24 آبان 1398, 10:43 صبح
اگر همین نمونه براتون مفید هست دیگه مشکل align کردن هم ندارین چون با زیرمجموعه هاشون روی هم یک group تشکیل میدن (برخلاف option group)

وگرنه کدتون هنوز جای کار و اصلاح داره که در صورت تمایل میتونم کمکتون کنم

mohammadsaleh
جمعه 24 آبان 1398, 15:45 عصر
تشکر از حسن توجه و نظرتون
البته اندازه فریم مهم هست. چون فریم در سمت راست فرم قرار می گیره و افزایش اندازه آن فرم را به هم می ریزه . در خصوص navigation هم من تا حالا از این کنترل استفاده نکردم.
احتمالا متوجه منظور اصلی من شده باشید.
گروپ یا نویگیشن در سمت راست فرم ماکزیمایز شده باید قرار بگیره و اندازه اون با یکی از کنترلها مثلا یک باکس بشه و همزمان عرض دکمه ها با اندازه باکس تنظیم بشه .
طوری که مثلا اگر 5 دکمه هست عرض هریک از دکمه یک پنجم کمی کمتر از باکس بشه طوری که پنج تا دکمه روی باکس در سمت راست دیده بشه

mohammadsaleh
جمعه 24 آبان 1398, 15:48 عصر
150962

یه چیزی شبیه به این شکل باید از کار دربیاد

mazoolagh
شنبه 25 آبان 1398, 17:21 عصر
پس navigation control مناسب هست؟

خبر بدین درست گرفتم مطلب رو یا نه:
1- یک navigation control با n باتن داریم (n متغیر هست)
2- کنترل قبلا ساخته شده (رنگ و شکل باتن ها و کپشن اونها و ...)
3- یک textbox معین هست که عرض مشخص و فیکس شده داره
4- این کنترل باید top-right فرم قرار بگیره و عرضش با textbox یکی بشه
5- textbox بیاد زیر این کنترل
6- عرض باتن ها یکسان و با یک فاصله کم (و یکسان از هم)

درسته این؟

mohammadsaleh
دوشنبه 27 آبان 1398, 13:42 عصر
سلام دقیقا همین رو میخوام

mazoolagh
سه شنبه 28 آبان 1398, 19:14 عصر
برای رسیدن به خواسته شما باید کارهایی رو navigation control انجام بدیم که مستقیما در محیط design نمیشه و نیاز به آموزش و توضیح داره.

Time ...

mohammadsaleh
چهارشنبه 29 آبان 1398, 09:38 صبح
ممنون استاد

mohammadsaleh
پنج شنبه 30 آبان 1398, 12:26 عصر
ضمن اینکه منتظر زحمت شما هستم. یک اشکالی که در نویگیشن در این فایل دیده میشه اینه که با کلیک روی هریک از دکمه کنترلهای روی فرم می لرزند. البته در تب کنترلی که گذاشتید این اشکال خیلی محسوس نیست

mazoolagh
پنج شنبه 30 آبان 1398, 18:11 عصر
پرش (flicker) بیشتر بخاطر داشتن کنترل های فرمت شده (شکل غیر مستطیل یا سایه دار و ...) یا داشتن تصویر پس زمینه است.
همینجور کنترل هایی که مرزهاشون همپوشانی دارن.

باتن های ساده استفاده کنین، باحتمال زیاد مشکل ندارین.

mazoolagh
پنج شنبه 30 آبان 1398, 18:18 عصر
مقدمات:

Navigation Control یک کنترل ترکیبی هست که برای تنظیم اون باید رفتارش رو بشناسیم.
درون خودش تعدادی کنترل از نوع Navigation Button داره که یکی از اونها کارش فقط اضافه کردن باتن های دیگه است و هیچ property قابل ویرایش نداره!
همچنین در design view هم قابل حذف نیست.

وقتی navigation control به فرم اضافه میشه همراه خودش یک subform اضافه میکنه که ایندو با هم stacked layout هستن.
این subform اسم ثابت داره Navigation Subform و این هم در design view قابل حذف نیست حتی اگر layout رو Remove کنین.

mazoolagh
پنج شنبه 30 آبان 1398, 18:21 عصر
هر دو کنترل که بالا بحثش رفت در این مسئله خاص دست و پاگیر هستن و باید حذف بشن.
برای اضافه کردن باتن جدید کافی هست روی نویگیشن کنترل راست کلیک و بعد insert button رو انتخاب کنیم.

این دو کنترل رو در تصویر زیر میبینید:
150981

mazoolagh
پنج شنبه 30 آبان 1398, 18:25 عصر
قرارداد:

1- نام نویگیشن کنترل در این نمونه NC است.
2- باتن ها به ترتیب از سمت چپ NB1 و NB2 و ... اسم گذاری شدن.
3- textbox که قرار هست زیر NC جا بگیره اسمش TB0 هست.

چون از این نامگذاری در کدها استفاده شده در تغییر اونها باید دقت کرد که کدها هم متناظر با اونها ویرایش بشه.

mazoolagh
پنج شنبه 30 آبان 1398, 18:29 عصر
همه کارها با کدنویسی خالص قابل انجام نیست (یا ارزش نداره!)
بعضی مراحل کار باید در design view و دستی انجام بشه.

برای هر مرحله کار نتیجه اون در دیتابیس پیوست با یک شماره بعد از اسم فرم (Form1) اومده که بعنوان مرجع یادگیری قابل استفاده است.
شروع کار از Form1_0 هست که تصویرش بالا اومده و نتیجه نهایی Form1_4 هست.

mazoolagh
پنج شنبه 30 آبان 1398, 18:32 عصر
مرحله اول حذف نویگیشن باتن [Add New] و navigation subform هست.

حذف باتن ساده است ولی برای حذف سابفرم اول باید اون رو از navigation control جدا کنیم.

برای این کار از کد زیر کمک میگیریم:

mazoolagh
پنج شنبه 30 آبان 1398, 18:37 عصر
Public Sub ResetNavigationControl(FormName As String)
DoCmd.OpenForm FormName, acDesign, , , , acHidden
Dim frm As Form
Set frm = Forms(FormName)
Dim NC As NavigationControl
Set NC = frm("NC")
NC.HorizontalAnchor = acHorizontalAnchorRight
NC.VerticalAnchor = acVerticalAnchorTop
NC.Properties("NavigationSubform") = ""
Dim NB As NavigationButton
For Each NB In NC.Controls
If NB.Caption = "[Add New]" Then
DeleteControl FormName, NB.Name
Exit For
End If
Next
DoCmd.Close acForm, FormName, acSaveYes
Set frm = Nothing
End Sub

mazoolagh
پنج شنبه 30 آبان 1398, 18:39 عصر
حالا هم باتن غیرضروری حذف شده و هم اینکه میتونیم navigation subform رو دستی حذف کنیم.

نتیجه کار به شکل زیر هست:
150983

mazoolagh
پنج شنبه 30 آبان 1398, 18:42 عصر
حالا دستی به سر و صورت NC میکشیم (در صورت تمایل) و TB0 رو هم اضافه میکنیم:

150984

mazoolagh
پنج شنبه 30 آبان 1398, 18:47 عصر
گام بعدی تنظیم پهنای NC با TB0 هست که از کد زیر برای اینکار استفاده میکنیم.

توضیح:
TWIP : واحد اندازه گیری اندازه ها در فرم ها و ریپورتهاست و هر اینچ 1440 twip هست (طبق تعریف)
اینجا ابعاد رو به سانتی متر میدیم پس به 2.54 تقسیم میکنیم.

ButtonSpacing : فاصله بین باتن ها بر حسب سانتی متر

mazoolagh
پنج شنبه 30 آبان 1398, 18:49 عصر
Option Compare Database
Option Explicit
Const TWIP As Single = 1440 / 2.54
Public Sub SetWidth(FormName As String, ButtonSpacing As Single)

DoCmd.OpenForm FormName, acDesign, , , , acHidden

Dim frm As Form
Set frm = Forms(FormName)

Dim NC As NavigationControl
Set NC = frm.Controls("NC")


Dim ButtonsCount As Integer
ButtonsCount = NC.Controls.Count

Dim TB As TextBox
Set TB = frm.Controls("TB0")

Dim WNB As Single
WNB = (TB.Width - (ButtonsCount - 1) * ButtonSpacing * TWIP) / ButtonsCount

Dim NB As NavigationButton
Dim i As Integer
For i = 1 To ButtonsCount
Set NB = frm.Controls("NB" & i)
NB.Width = WNB
NB.TopPadding = 0
NB.BottomPadding = 0
NB.LeftPadding = ButtonSpacing
NB.RightPadding = IIf(i = ButtonsCount, 0, ButtonSpacing * TWIP)
Next

NC.Width = TB.Width

DoCmd.Close acForm, FormName, acSaveYes
Set frm = Nothing
End Sub

mazoolagh
پنج شنبه 30 آبان 1398, 18:50 عصر
حالا فرم ما به صورت زیر در اومده:

150985

mazoolagh
پنج شنبه 30 آبان 1398, 18:55 عصر
در گام آخر NC و TB0 رو Stacked Layout میکنیم :
در design view اول این دو رو select میکنیم و بعد از منوی arrange گزینه stacked


و مجموعه را به سمت بالای راست فرم میبریم

150986

mazoolagh
پنج شنبه 30 آبان 1398, 18:59 عصر
خب
کار ما اینجا تموم میشه

دقت کنین که چون anchoring مجموعه NC,TB0 روی TopRight هست با تغییر اندازه فرم خودکار همونجا هست و نیازی به کد نویسی نیست!

mohammadsaleh
جمعه 01 آذر 1398, 21:04 عصر
استاد خیلی زحمت کشیدید و وقت گذاشتید برای این کار که مطمئنم دیگران دوستان هم از این آموزش عالی بهره خواهند برد. در حقیقت شما چند موضوع را هم زمان با هم به ما آموختید. موفق باشید.