powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Итерация по коллекции элементов
25 сообщений из 28, страница 1 из 2
Итерация по коллекции элементов
    #39950216
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день.
Буду признателен за подсказку вот какого момента, есть форма, хочу забрать с нее словарь всех элементов TextBox с их размерами, что сделано не сложно, делаю так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Public Function gfncGetDataSheetFormsTxt(frmName As String) As Scripting.Dictionary
     ' процедура получает список контролов типа TextBox формы вида Datasheet
     
     Dim ctrl As Control
     Dim dictFields As New Scripting.Dictionary
     Dim frm As Form
     
     Set frm = Forms(frmName)
     If frm.DefaultView <> 2 Then Exit Function

     For Each ctrl In frm.Controls
          If ctrl.ControlType = acTextBox Then _
               dictFields.Add ctrl.Name, ctrl.ColumnWidth
     Next
     
     Set gfncGetDataSheetFormsTxt = dictFields
     
End Function


В данной конструкции есть одна проблема: так как ctrl изначально объявлен как Control, то в IntelliSense не будут отображаться его специфические методы и свойства. Проблем нет, объявляем как TextBox.
Код: vbnet
1.
Dim ctrl As Access.TextBox

В этом случае сразу получаем доступ к нужному свойству, но и одновременно с этим и Runtime Error в цикле For Each, которая укажет нам, что текущий элемент коллекции не может быть присвоен ctrl, т.к. он другого типа. Тут два варианта: берем, например, цикл For, сразу тестируем тип и после этого считываем нужный параметр или вариант №2 - просто прописываем нужное свойство в цикле For Each без IntelliSense зная, что такое свойство у контрола в случае если он TextBox имеется (как это сделано в первом примере):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
     Dim i As Integer
     For i = 0 To frm.Controls.Count - 1
          If frm.Controls(i).ControlType = acTextBox Then
               Set ctrl = frm.Controls(i)
               dictFields.Add ctrl.Name, ctrl.ColumnWidth
          End If
     Next i


И тот и тот вариант имеет определенный недостаток, в первом варианте используем предполагаемое свойство, то есть не получаем его на этапе "компиляция", а только проверяем элемент в рантайме и если получаем из коллекции нужный тип, то используем его свойство; второй вариант не отличается "изящностью" конструкции и оба эти варианта по сути делают избыточные движения по перебору всей коллекции и выявлению нужных элементов. Понимаю, в части быстродействия это большая условность, т.к. системе нужны милли/микросекунды чтобы перебрать все контролы, но все же из теоретического интереса, есть какая-либо синтаксическая конструкция, которая позволит пробежать цикл For Each не на всей коллекции контролов, а только на тех, что являются TextBox, то есть гипотетически как-то так:
Код: vbnet
1.
2.
3.
4.
 For Each ctrl In frm.Controls as TextBox
          If ctrl.ControlType = acTextBox Then _
               dictFields.Add ctrl.Name, ctrl.ColumnWidth
     Next

Все что мне нужно реализовал, размеры нужны чтобы в следующий раз форма открывалась с теми размерами полей (столбцов таблица), которые пользователь сам себе выставил. Хотелось бы написать "покрасивше". Спасибо за комменты
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950228
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр

Код: vbnet
1.
2.
3.
4.
 For Each ctrl In frm.Controls as TextBox
          If ctrl.ControlType = acTextBox Then _
               dictFields.Add ctrl.Name, ctrl.ColumnWidth
     Next


вот так было бы еще лучше, то есть убираем избыточное сравнение, если можем сразу итерацию сделать только по TextBox
Код: vbnet
1.
2.
3.
For Each ctrl In frm.Controls as TextBox
   dictFields.Add ctrl.Name, ctrl.ColumnWidth
Next
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950238
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Можно скрестить вариант1 с вариантом2:
Код: vbnet
1.
2.
3.
4.
5.
6.
     For Each ctrl In frm.Controls
          If ctrl.ControlType = acTextBox Then
            Set tbx = ctrl ' Dim tbx As Access.TextBox
            dictFields.Add tbx.Name, tbx.ColumnWidth
          End If
     Next


2. Штатной коллекции TextBoxes мне ни разу не встречалось. :)
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950243
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр
... забрать с нее словарь всех элементов TextBox с их размерами...
[src vba]
Не понял этот момент-поясните:
Вы хотите перебрать все TextBox(ы)формы и определить их имена и ширину (или другие сиойства) - так или не так?
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950263
ЦЦа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1)
Ганов Александр
Код: vbnet
1.
For Each ctrl In frm.Controls as TextBox

Вынесите этот as TextBox в отдельную функцию:
Код: vbnet
1.
2.
3.
Function asTextBox(ByVal Ctl As Control) As TextBox
 Set asTextBox = Ctl
End Function

и используйте asTextBox(ctrl), когда нужно добраться до интерфейса TextBox. Это то же, что заинлайнил Predeclared, но (чистая вкусовщина) выглядит приятней.

2) Чисто для галочки: альтернативой для
Код: vbnet
1.
If ctrl.ControlType = acTextBox Then

является
Код: vbnet
1.
If TypeOf ctrl Is TextBox Then

Но
Код: vbnet
1.
If ctrl.ControlType

легко превращается в
Код: vbnet
1.
Select Case ctrl.ControlType

, а с TypeOf такое не прокатит.

3) Чисто для галочки 2: элемент управления, имеющий определённые Width и Height, сдвинутый в другие Left и Top, может получить другие экранные размеры (+/-1 пиксель по обеим осям).
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950278
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр
Все что мне нужно реализовал, размеры нужны чтобы в следующий раз форма открывалась с теми размерами полей (столбцов таблица), которые пользователь сам себе выставил. Хотелось бы написать "покрасивше".
почему бы не сохранять и имена текстбоксов с их параметрами? первый раз опросили коллекцию на предмет определённого типа, далее выдёргивать только по именам. Где-то же всё это хранится между сеансами.
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950287
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю всех за ответы! Отличные идеи. Очень зашла идет с отдельной функцией проверки! Плюс действительно можно и имена хранить в какой-нить temp-таблице, об этом я почему-то не подумал. Одна голова хорошо, а несколько Acs-голов намного лучше. Еще раз всем спасибо :-)
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950288
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku, да все верно, делаю словарь:
Код: vbnet
1.
2.
3.
имя текстбокса01 ширина текстбокса 01
имя текстбокса02 ширина текстбокса 02
имя текстбокса03 ширина текстбокса 03


потом отдаю этот словарь в процедуры загрузки и закрытия формы, где для текст-боксов либо сохраняются размеры в сервисной таблице (при закрытии формы), либо восстанавливаются ранее сохраненные (при открытии формы). таким образом, получается что настроенная мышкой ширина столбца табличной формы при ее последующем открытии будет такая как сохранена ранее.
Опрос сделал на каждом открытии, т.к. поля могут поменяться и в сеансе, например, воткнул в форму новое поле через конструктор, при открытии сразу же опросятся все поля и если есть новое, то оно запишется в сервисную таблицу для дальнейшего использования. А вот еще зачем сделал словарь: при сохранении процедура сохранения проверяет словарь и имена поле в сервисной таблице и если в таблице есть какие-то поля, которых нет уже на форме, то сервисная таблица подчищается, ну и плюс словарь позволяет не писать одно и то же в процедуре открытия и закрытия, просто обращаюсь к функции и получаю все поля: итого в самое процедуре открытия/закрытия только одна строка
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950290
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург, отличная мысль. Обдумаю, может действительно так и сделать, тогда вообще не надо каждый раз опрашивать, а просто пользуем поля данного сеанса и все дела
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950329
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр
... в следующий раз форма открывалась с теми размерами полей (столбцов таблица), которые пользователь сам себе выставил...
А у Вас многопользовательская база
(табличными формами пользуюсь крайне редко и не знаю как таковые ведут себя в многопользовательской среде-в однопользовательской по умолчанию все происходит именно так,как Вы хотите)
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950396
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku, конкретно данная база однопользовательская, по формам также есть сохранение размеров, но для этого в служебной таблице имеется реквизит "user", то есть настройки сохраняются в разрезе каждого пользователя, вроде все работает без каких-либо проблем, у каждого юзера свои размеры, все как положено. Вообще, я не великий специалист по нескольким пользователям, поэтому тут дельное вряд ли что-то могу сказать (по крайней мере на данном этапе понимания access :-) )
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950418
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр,
1.открываем БД и устанавливаем ширину полей
2.закрываем/открываем БД ширина полей как установили
3.перегружаем(выключаем/включаем) комп-ширина полей как установили в п.1
А-2007
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950473
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku,

Ну, так совсем не интересно... нет ощущения что ты невообразимо крут и вообще кому-то нужен...
В многопользовательской БД, если все запускают свой персональный интерфейс, то тоже танцы с бубном не нужны...
Не удивлюсь, что это всё делает сам акс, а ТС думает, что это делает он...
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950499
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, у нас скорее всего с Вами разные представления о крутости :-). Работа в акс для меня просто определенный тех.навык и ничего больше. База acs2016, при закрытии и повторном открытии все сбрасывается. Если бы сохранялось, я бы не морочился, возможно, что есть какая-то волшебная галочка, которую можно поставить и все будет сохраняться. Речь идет именно о форме вида "табличная", не о самой таблице. Таблица - "да", действительно сохраняет свои размеры, в форме - нет. Если знаете как сделать, чтобы сохранялось без танцев с бубном средства Акса, буду благодарен за подсказку.
привожу видео-пруф
YouTube Video
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950510
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то же самое, только с сохранением размеров
YouTube Video
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950520
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр,

Не знаю, может это особенности версии 2016 (всё, что не делается - все к худшему...)
В ролике вообще нет кода, две формы, одна обычная, в неё вставлена табличная...
Всё работает само собой...
Попробуйте перед закрытием формы выбрать сохранение...
https://drive.google.com/open?id=17R59NdtEfdII8AGoyXYezbO-HLz0LFh_
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950532
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag
sdku,
Ну, так совсем не интересно... нет ощущения что ты невообразимо крут и вообще кому-то нужен...
В многопользовательской БД, если все запускают свой персональный интерфейс, то тоже танцы с бубном не нужны...
Не удивлюсь, что это всё делает сам акс, а ТС думает, что это делает он...
Зато "пускать" юзера в конструктор(добавлять/удалять поля)....-это круто и очень интересно-что получится
А-2016 не юзал-неужели эта фича выкинута-НЕ ВЕРЮ (К.С Станиславский)
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950568
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, это одна форма со включенным видом "Табличная", то есть никаких вставок и т.д. Скорее всего это действительно особенность акс2016, ну.. по крайней мере до того, момента пока не будет установлено обратное
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Option Compare Database
Option Explicit

Private Sub Form_Load()

gprcFormLoad Me.Name, "Тестовая", True
gprcFormGetSize Me.Name

End Sub

Private Sub Form_Close()

gprcFormSetSize Me.Name
gprcSave Me.Name

End Sub


Это код формы. В Save все данные сохраняются через
Код: vbnet
1.
DoCmd.RunCommand acCmdSave


Что-то мне кажется что как-то можно заюзать
Код: vbnet
1.
DoCmd.RunCommand acCmdSaveLayout

но пока не нашел нормально описания, что данная команда делает.
Вставка в процедуру закрытия
Код: vbnet
1.
DoCmd.Save

тоже не дает результата (сохраняется только размер формы, но не ее столбцов). В общем, поэксперементирую еще. Фигня конечно полная, но приятно когда форма открылась с теми настройками, как ты оставил, а не с неведомой шириной
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950604
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр
это одна форма со включенным видом "Табличная", то есть никаких вставок и т.д.


Попробовал отдельно табличную форму t1 из своего видео...
- Размеры столбцов сохраняются автоматически при закрытии формы
- Размеры формы сохраняются, если перед закрытием ее сохранить
Думаю даже в 2016 если перед закрытием форму сохранить, она сохранится без всякого кода...
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950656
Фотография Ганов Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag, перед закрытием вызываю
Код: vbnet
1.
DoCmd.Save

, верно? сохраняется только размер формы. Странно, но факт. Попробую еще раз
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950666
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганов Александр
vmag, перед закрытием вызываю


Не нужно ничего вызывать, вы в ворде 2016 документ как сохраняете ?
Нажать на дискетку или Файл - сохранить, или как там в 2016 ? Я не знаю...
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950765
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант:автоматический размер-нет
выравнивание по центру-нет
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950808
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag,

А вы знаете, у меня была подобная картина на 2010.
Табличная форма, если подчиненная, состояние столбцов не сохранялось.
Не помогали дискетки, ни вызов сохранения из заголовка формы ни ctrl+s, ничего.
Стабильно состояние сохранялось, если открыть табличную форму одну, не подчиненной.
Я из за этого перешел на программное сохранение в таблицу и восстановление состояния при старте.
Правда, с тех пор к этому вопросу не возвращался...
Использовал класс, кстати, взятый или тут, или на просторах.
С минимальными переделками
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950951
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан
vmag,
А вы знаете, у меня была подобная картина на 2010.
.....
Использовал класс , кстати, взятый или тут, или на просторах.
С минимальными переделками
Считаю это "стрельбой из пушки по воробьям"
sdku
....табличными формами пользуюсь крайне редко
именно потому что это уже не таблица,но еще и не полноценная форма
Многое из того что на ленточной реализуется легко и просто на табличной сложно,а то и не возможно вовсе.Может просто создать ленточную форму(с полосой прокрутки или вместив все поля в один экран-короче подумать интерфейс) и не заморачиваться
...
Рейтинг: 0 / 0
Итерация по коллекции элементов
    #39950958
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вдогонку-и не фиг юзеру делать в конструкторе(добавлять/удалять поля)
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Итерация по коллекции элементов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]