Ищете лучший способ установить свойства для элементов управления формы

Я использую приведенный ниже код во многих формах и нескольких приложениях:

Private Sub EnableEdit(strFieldname As String, Optional bUseRed As Boolean = False)
  Me.Controls(strFieldname).Enabled = True
  Me.Controls(strFieldname).Locked = False
  If Not Me.Controls(strFieldname).ControlType = acCheckBox Then
    Me.Controls(strFieldname).BackStyle = 1
    If bUseRed Then
      Me.Controls(strFieldname).ForeColor = vbRed
    Else
      Me.Controls(strFieldname).ForeColor = vbBlack
    End If
  End If
End Sub

' and the calls e.g.
  EnableEdit ("arHerstellerArtikelNr")
  EnableEdit ("arEAN")
  EnableEdit ("arArtikelNrIxxtraNice")
  EnableEdit ("arSort")

Недавнее изменение показало мне, что было бы намного лучше, чтобы код НЕ дублировался в каждом объекте класса. Сначала моя проблема заключалась в том, что код содержит «Me.Controls (strFieldname)» для обращения к свойствам, которыми я хочу манипулировать. По этой причине он должен был находиться в самом объекте класса --> требующем дублирования.

Поэтому я переписал свой код. Цель разработки заключалась в следующем: способ вызова 'EnableEdit' из событий нескольких форм, но предоставление кода для этого не в самом модуле форм, а в модуле или модуле класса, который предоставляется только один раз для приложения. Я думаю, как работает доступ, мне нужно передать дополнительный параметр, чтобы различать формы. Однако, если имя формы необходимо передать в качестве дополнительного параметра (например, EnableEdit("frmInventoryUpdate", "arSort")), код становится менее читабельным и более подверженным ошибкам. Поэтому мне пришла в голову идея передать имя как инвариант: «EnableEdit (Me.FormName, «arSort»)». Это привело меня к следующему решению:

Public Sub EnableEdit2(strFormName As String, strFieldname As String, Optional bUseRed As Boolean = False)
Dim frmCurrentForm As Form
  Set frmCurrentForm = Forms(strFormName)
  frmCurrentForm.Controls(strFieldname).Enabled = True
  frmCurrentForm.Controls(strFieldname).Enabled = True
  frmCurrentForm.Controls(strFieldname).Locked = False
  If Not frmCurrentForm.Controls(strFieldname).ControlType = acCheckBox Then
    frmCurrentForm.Controls(strFieldname).BackStyle = 1
    If bUseRed Then
      frmCurrentForm.Controls(strFieldname).ForeColor = vbRed
    Else
      frmCurrentForm.Controls(strFieldname).ForeColor = vbBlack
    End If
  End If
End Sub

' and the calls e.g.
  Call EnableEdit2(Me.FormName, "arHerstellerArtikelNr")
  Call EnableEdit2(Me.FormName, "arEAN")
  Call EnableEdit2(Me.FormName, "arArtikelNrIxxtraNice")
  Call EnableEdit2(Me.FormName, "arSort")

Решение приемлемо для меня, однако мне интересно, есть ли способ подавить даже «Me.FormName» в вызове и, таким образом, сделать вызовы более приятными?

Вы также можете рассмотреть возможность реализации WithEvents. См. мою статью Создание цветовой палитры и селектора Windows Phone с помощью WithEvents для примера и дальнейшего чтения.

Gustav 11.12.2020 12:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Никогда не передавайте имя формы, всегда передавайте форму:

Public Sub EnableEdit2(frmCurrentForm As Form, strFieldname As String, Optional bUseRed As Boolean = False)
  frmCurrentForm.Controls(strFieldname).Enabled = True
  frmCurrentForm.Controls(strFieldname).Enabled = True
  frmCurrentForm.Controls(strFieldname).Locked = False
  If Not frmCurrentForm.Controls(strFieldname).ControlType = acCheckBox Then
    frmCurrentForm.Controls(strFieldname).BackStyle = 1
    If bUseRed Then
      frmCurrentForm.Controls(strFieldname).ForeColor = vbRed
    Else
      frmCurrentForm.Controls(strFieldname).ForeColor = vbBlack
    End If
  End If
End Sub

'Call it:
EnableEdit2 Me, "arHerstellerArtikelNr" 
'Never use Call, that's a relic of very old code and not needed in modern code

Передача имени формы вызывает дополнительные накладные расходы, происходит неправильно, когда ваша форма является подчиненной формой, и происходит неправильно, когда вы хотите разрешить несколько экземпляров одной и той же формы (конечно, все они имеют одно и то же имя).

Вы всегда хотите передавать форму напрямую, потому что это позволяет избежать этих проблем и потому что это более лаконично.

Для более тщательной переработки я бы не стал передавать имя поля и вместо этого использовал бы свойство тега, чтобы определить, какие поля нуждаются в этом включении/отключении, учитывая, что поля не нужно отключать или включать независимо.

Другие вопросы по теме