Mam kilka przypadków, w których zaczynam od podstawowego podformularza, a następnie mam 3 inne podformularze, które na nim bazują, z których każdy dodaje inne elementy do podstawowych. Oznacza to, że mam stronę kodową dla każdego podformularza, z dużą ilością powtórzeń. Czy można umieścić wspólne elementy w osobnym module i pozostawić tylko dodatkowy kod związany z każdym podformularzem na stronie kodowej? Czy są jakieś problemy z wydajnością?Kiedy należy przenieść kod VBA z modułu formularza do osobnego modułu?
Odpowiedz
Odnośnie ostatniej części pytania „? Czy są jakieś problemy z wydajnością z tym”
Istnieją 2 konsekwencje Jestem świadomy:
- czas ładowania forma
- użycie pamięci:
Jako hipotetyczny przykład wyobraź sobie, że masz formularz z kontrolką tabulacji. Ta kontrolka na karcie zawiera 10 stron, a każda strona zawiera podformułę. Jeśli te podformy zawierają kopie tego samego kodu VBA, ten wspólny kod musi zostać ponownie załadowany dla każdego podformularza. To wymaga czasu i zwiększa wykorzystanie pamięci.
Jeśli przeniesiesz wspólny kod do standardowego modułu i odniesiesz go do swoich podformularzy, musisz załadować go tylko raz ... zmniejszając zarówno czas ładowania formularza, jak i zużycie pamięci.
Rezultatem jest to, że podejście, które rozważasz, może sprawić, że Twoja aplikacja będzie bardziej elastyczna ... co może prowadzić do szczęśliwszych użytkowników.
Jednak nawet jeśli takie podejście nie przyniesie zauważalnej poprawy wydajności, nadal bym to robił, ponieważ oznacza to, że będziesz potrzebował zachować tylko jedną kopię wspólnego kodu.
Komputery wydają się być wystarczająco szybkie w tych dniach, że wspomniane problemy z wydajnością rzadko są oczywiste dla użytkownika. +1 dla Twojej ostatniej linii. Centralizacja kodu jest tak ważna, jeśli chodzi o przyszłe zarządzanie Twoim kodem/aplikacją. – HK1
@ HK1 Widziałem aplikację Chelle. Główna forma jest podobna do mojej "hipotetycznej" sprawy, a przy obciążeniu formularza występuje * znaczne * opóźnienie. Jednak nie zgadzam się z twoim punktem widzenia ... to nie byłby problem z mniej złożoną formą. W każdym razie brzmi jak ty i ja jesteśmy w całkowitej zgodności centralizacji kodu RE. :-) – HansUp
Wciąż uczę się nowych sposobów na poprawę zarządzania kodami. Wydaje się, że to niekończący się proces uczenia się i udoskonalania. – HK1
Krótka odpowiedź, tak, zrób to, podziel kod, który powtarza się między każdym z formularzy.
Dłuższa odpowiedź, ale wyciągnięcie kodu, który powtarza się w oddzielnym module lub klasie, jest, moim zdaniem, lepszym sposobem na zrobienie tego.
Zajęcia sprawiają, że kod jest łatwiejszy w obsłudze i łatwiejszy w utrzymaniu. Jeśli masz kod podobny do wielu miejsc, utrudnia on konserwację, ponieważ musisz go zmienić w każdej lokalizacji. Umieszczenie go w jednym miejscu ułatwia zarządzanie i konserwację.
Lista zalet została podjęta z Chicago Access Users Group (CAUG) talk - "Class Modules in Access"
:
Advantages of using classes/objects:
- let's you create more complex objects than tables or queries provide
alone
- using classes within classes let's you restrict function visibility
- class methods & attributes are more descriptive than module's
function list alone
- let's you use Intellisense for more efficient coding
- no "ambiguous name" errors with multiple copies of the same class
module
- can copy class modules without worry of creating ambiguous function
names
- static variables are implicit in class objects, and so are easier to
manage
- isolating access layers within wrapper classes promote
portability/maintainability
- better support for separation of UI/business logic/data access =
n-tier development
- promotes modular thinking in analysis, design
- easier to adapt many publicly-available object models to Access apps
- prepares you for transition to .NET and other fully object-oriented
architectures
+1 Nigdy wcześniej nie brałem czasu na ich porównanie, używam obu, ale zawsze preferowałem standardowy moduł w klasie, ale te punkty są interesujące. –
Jeśli mam zrozumienia pytanie, tak można scentralizować pewną ilość kodu przesuwając go do standardowego modułu kodu. Prawdopodobnie istnieje wiele sposobów na to, ale jednym z lepszych sposobów jest przekazanie obiektu formularza do twoich funkcji. Oto przykład:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If ValidateContact = False Then Cancel = True
End Sub
'This code goes in a standard code module not associated with any form
Public Function ValidateContact(ByRef frm as Form) as Boolean
Dim bValid as Boolean
bValid = True
If Nz(frm!FirstName, "") = "" Then
MsgBox "First Name cannot be blank."
bValid = False
ElseIf Nz(frm!LastName, "") = "" Then
MsgBox "Last Name cannot be blank."
bValid = False
End If
ValidateContact = bValid
End Function
Ponadto, jeśli dobrze rozumiem, masz pytanie nie jest wcale o użyciu klasy Moduły/klasa obiektów, przynajmniej nie bezpośrednio. (Prawdę mówiąc, każdy fragment kodu, który piszesz w programie Access, korzysta z obiektu klasy, najczęściej niejawnie.) Inny użytkownik SO opublikował już świetną odpowiedź na temat korzyści z używania obiektów klasy w programie Access, więc nie będę wyjaśniał o wiele więcej. W rzeczywistości standardowe moduły kodu są w zasadzie klasą Singleton, która nie musi być instancjonowana tak, jak robi obiekt klasy. Istnieją powody, dla których preferowane są pojedyncze/standardowe moduły kodu, przynajmniej dla niektórych rzeczy, jeśli z innego powodu łatwiej jest wywoływać funkcje. Jeśli jednak zauważysz, że piszesz funkcje, które mają około czterech lub więcej argumentów, prawdopodobnie skorzystasz z możliwości zmiany tego obiektu na obiekt klasy, który pozwoli Ci ustawić właściwości przed wywołaniem powiązanych metod.
kiedy mówisz "Klasa", masz na myśli moduł klasy lub moduł kodu formy? – HK1
@ HK1: W ogóle nie wspominałem o "klasie". Miałem już gotowe ustawienie nowego modułu dla jednego z podformuł i przeniesienie do niego całego powtarzalnego kodu, ale to nie zadziałało, zmiany w innych podformułach nie uruchomiły poprawnie kodu zdarzenia. – Chelle
Słowo "klasa" pojawia się w tytule. – HK1