Как я могу изменить ширину поля в форме доступа во время выполнения? - PullRequest
0 голосов
/ 03 июня 2009

Я работаю над созданием системы пользовательского макета для моих форм MS-Access. Пока все хорошо - у меня была идея! Но теперь наступает хитрый момент: изменение размеров отдельных полей таким образом, чтобы их ширина соответствовала привлекательным образом.

К сожалению, я немного застрял здесь - наверняка должен быть какой-то вызов функции, свойства или метода, который позволил бы мне указать точную ширину для данного поля ... Но если это так, я был не в состоянии найти это.

Может ли кто-нибудь здесь предоставить мне информацию, в которой я так отчаянно нуждаюсь? Или еще лучше , предложите соответствующий запрос Google или справочный сайт, который мог бы дать мне ответ на мой запрос?

Ответы [ 4 ]

2 голосов
/ 03 июня 2009

В коде, во время выполнения, это то, что вы делаете:

Я! MyControl.Width = 1,5 *1440* 1003 *

1,5 - это 1,5 ", а 1440 - это нечто, называемое TWIP, которые представляют собой относительные единицы измерения, размер которых зависит от разрешения экрана и базового размера шрифта Windows.

Теперь, где ты это делаешь?

Если у вас есть разные записи в одной и той же таблице, для которых требуются разные макеты, вы сделаете это в событии OnCurrent. Таким образом, при переходе от одной записи к другой событие OnCurrent будет проверять любые элементы управления данными, какую ширину вы используете, и устанавливать ширину. Если есть только два макета, лучше использовать If / Then / Else. Если их больше двух, лучше выбрать SELECT CASE.

Кроме того, если вы измеряете и выравниваете столбцы, было бы полезно назначить константы уровня модуля, что-то вроде этого (это взято из приложения, которое я впервые создал в 1997 году, которое имеет 15 различных типов записей и 3 основных макета). с 8 или 9 незначительными вариациями):

Const Height = 0.1583 * 1440
Const row1Top = 1.0208 * 1440 ' top of first row
Const row2Top = row1Top + 0.2083 * 1440
Const row3Top = row2Top + 0.2083 * 1440
Const row4Top = row3Top + 0.2083 * 1440
Const row5Top = row4Top + 0.2083 * 1440
Const row6Top = row5Top + 0.2083 * 1440
Const row7Top = row6Top + 0.2083 * 1440
Const Logic0Top = 1.6833 * 1440
Const logic1Top = Logic0Top + 0.1667 * 1440
Const logic2Top = logic1Top + 0.1667 * 1440
Const logic3Top = logic2Top + 0.1667 * 1440
Const logic4Top = logic3Top + 0.1667 * 1440
Const lblLogic0Top = Logic0Top - 0.0208 * 1440
Const lblLogic1Top = lblLogic0Top + 0.1667 * 1440
Const lblLogic2Top = lblLogic1Top + 0.1667 * 1440
Const lblLogic3Top = lblLogic2Top + 0.1667 * 1440
Const lblLogic4Top = lblLogic3Top + 0.1667 * 1440
Const DateWidth = 0.7833 * 1440
Const lWidth = 2.0167 * 1440
Const rWidth = 2.7771 * 1440
Const lMemoWidth = 4.8771 * 1440
Const commtWidth = (2.745 * 1440)
Const lCommt = 3.775 * 1440
Const CommtHeight = 1.5 * 1440
Const memoHeightOffset = 0.94 '0.8354
Const bksCommtHeight = ((memoHeightOffset + 0.5) * 1440) + 250
Const ConditionWidth = 4.2417 * 1440 - 15
Const memo3Tall = ((memoHeightOffset + 1.4146) * 1440) + 160
Const memo4Tall = ((memoHeightOffset + 1.2063) * 1440) + 160
Const memo5Tall = ((memoHeightOffset + 0.9979) * 1440) + 160
Const memo6Tall = ((memoHeightOffset + 0.7896) * 1440) + 160
Const memoShort = (1.5208 * 1440) + 160 ' Height of memo
Const lblOffset = -0.3291 ' adjusts memo label top for new layout
Const lblMemoTop3 = ((lblOffset + 1.9167) * 1440) - 480 - 100
Const lblMemoTop4 = ((lblOffset + 2.125) * 1440) - 480 - 55
Const lblMemoTop5 = ((lblOffset + 2.3333) * 1440) - 480 - 100
Const lblMemoTop6 = ((lblOffset + 2.5417) * 1440) - 480 - 100
Const lblMemoTop7 = ((lblOffset + 2.75) * 1440) - 480 - 100
Const lblBib0 = (2.5833 * 1440) - 480
Const Bib1 = 2.4674 * 1440
Const Bib2 = 2.6257 * 1440
Const Bib3 = 2.784 * 1440
Const Bib4 = 2.9424 * 1440

Очень сложно, потому что форма очень сложна (событие OnCurrent стало настолько большим, что мне пришлось разделить его на две разные подпрограммы - я не могу вспомнить точный максимальный размер подпрограммы, но это может быть 64 КБ. Да Вот как это было плохо, и да, я сожалею о том, что реализовал что-то таким образом. Если бы мне пришлось это делать, я бы использовал элемент управления вкладками с невидимыми вкладками и выделил одну вкладку для каждого типа записи. Но я не думал этого пути тогда.

Если вам не нужно перемещать или изменять размер по вертикали, вы можете обойтись с горсткой констант:

Col1Left
Col2LeftA
Col2LeftB
Col1WidthA
Col1WidthB
Col2WidthA
Col2WidthB

Это позволит вам иметь два столбца элементов управления с двумя разными горизонтальными позициями для второго столбца и двумя разными ширинами для каждого столбца. Я бы порекомендовал очень прозрачные имена для этих констант, чтобы ваш код был более-менее понятен.

0 голосов
/ 09 июня 2009

Почему вы хотите изменить ширину поля во время выполнения? Такое поведение выходит за рамки типичных соглашений Windows UI и, вероятно, будет проходить через ваших пользователей в цикле, когда вещи начнут менять размер после отображения формы. Просто дайте полям широкое поле и оставьте размеры после отображения формы.

Для такой проблемы просто подумайте перчатки .

0 голосов
/ 03 июня 2009

как изменить ширину полей [вопрос]

Использование SQL DDL:

ALTER TABLE MyTable ALTER MyField VARCHAR(20);

Это не повлияет на другие свойства столбца, например, он останется NOT NULL, если изначально создан таким образом, и значение по умолчанию (если оно есть) будет таким же.

P.S. Я отвечаю на вопрос ОП, а не на спорный отредактированный.

0 голосов
/ 03 июня 2009

На все свойства любого данного элемента управления можно ссылаться в коде VBA, используя me.CtlName.PropertyName или Forms! CtlLName.PropertyName. В вашем случае это будет me.CtlName.Width.

Обратите внимание, что размеры свойств указаны в твипах. И есть 1440 твипов на дюйм. Если вы используете метрику, я понятия не имею, сколько твипов в см.

Это сказало, что я изменяю размер моих форм, чтобы соответствовать 1024x768, если клиент не запрашивает иначе.

...