2012-04-26 22 views
5

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?

+0

kiedy mówisz "Klasa", masz na myśli moduł klasy lub moduł kodu formy? – HK1

+0

@ 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

+0

Słowo "klasa" pojawia się w tytule. – HK1

Odpowiedz

1

Odnośnie ostatniej części pytania „? Czy są jakieś problemy z wydajnością z tym

Istnieją 2 konsekwencje Jestem świadomy:

  1. czas ładowania forma
  2. 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.

+0

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

+0

@ 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

+1

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

1

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 
+0

+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. –

1

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.