Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Codeschnippsel verwalten

Begonnen von Optiplex, November 29, 2010, 12:02:58

⏪ vorheriges - nächstes ⏩

Optiplex

Hallo zusammen,
ich habe mittlerweile viele kleine Codeschnippsel, bei denen ich langsam die übersicht verliere. Wie verwaltet ihr eure kleinen Routinen habt ihr hierfür eine Datenbank. Muss man sich dafür selbst was schreiben oder gibt es was fertiges als Freeware. Wie macht ihr das?

Gruß Dieter

Jonny

Hallo,
ich habe eine Beispieldatenbank mit viele Module.
Der Modulname weißt auf das Thema hin und darin sind die einzelnen
"Schnipsel" als Sub hinterlegt.

Vieleich gefällt dir das ja.

Gruß

Johann

Optiplex

Hallo Johann,
ich hab mal ein bischen länger gewartet, in der Hoffnung dass sich noch jemand beteiligt. Leider war und ist das nicht so der Fall.
Natürlich ist das eine Möglichkeit. Hast du da eine Tabelle dahinterstehen damit du weist was zusammengehört und was welches Modul macht. Ich stelle mir das recht unübersichtlicht vor alles in einer Datenbank.

Gruß Dieter

Josef

Hallo!

Beim Thema "Codeschnippsel" unterscheide ich zwischen wiederverwendbarem (fertigem) Code und Code als Vorlage (welcher beim Einfügen angepasst wird).
Den wiederverwendbaren Code sammle ich in Code-Modulen (Standardmodul bzw. Klassenmodul) und lege diese Codemodule als Text gespeichert in einer Verzeichnisstruktur ab. Falls ich in einer Anwendung dann so einen Code benötige importiere ich den Code mittels Access-Add-In.

Für das Einfügen der Vorlagen verwende ich Mz-Tool. Im Code der Vorlagen sind Platzhalter definiert, damit die Anpassung einigermaßen flott abläuft.

mfg
Josef

Optiplex

Hallo Josef

das könnte ich mir vorstellen und es ist auch sinnig was du da machst.
frage was ist das Access-Add-In bzw. das MZ-Tool. Sind diese Freeware?
und wie sieht so eine Vorlage aus. Die Klassenmodule sind das eigene oder sind das Formulare? Wenn es eigene sind kennst du dich damit aus? In Büchern werden die immer nicht gut behandelt und wenn es Beispiele gibt sind das immer 0815 Sachen. Ich glaube in diesen Klassen steckt sehr viel mehr potenzial als wir alle glauben.

Ich weis viele Fragen aber so ist das wenn man was lernen will.

Gruß Dieter

Josef P.

#5
Hallo!

Zitatfrage was ist das Access-Add-In bzw. das MZ-Tool. Sind diese Freeware?
Die Mz-Tools gibt es für VB6 und VBA als Freeware.
=> http://www.mztools.com/

Das Add-In zum Importieren und Exportieren erstellte ich mir für diesen Einsatzzweck selbst, da ich nicht nur die Code-Module importiere, sondern auch beim Import eines Code-Moduls dafür sorge, dass alle andern dafür benötigten Code-Module ebenso importiert werden.
Das Access-Add-In "ACLib Import Wizard" ist auch frei (inkl. offenem Code).
Video über die Verwendung des Import-Wizard: http://access-codelib.net/videos/ACLib-Import-Wizard/neue-anwendung-erstellen/
Beschreibung: http://wiki.access-codelib.net/ACLib-Import-Wizard

Anm.: Die Beschreibung zeigt zwar den Einsatz mit der Verzeichnisstruktur von access-codelib.net, du bist aber nicht gezwungen diese Struktur zu verwenden, da du ein beliebiges Startverzeichnis einstellen kannst.

Zitatwie sieht so eine Vorlage aus
Z. B.:
Todo-Kommentar einfügen:
'/**
' * @todo {TODO}
'**/

{TODO} wird dann von den MZ-Tools mittels einer Art Inputbox abgefragt.

oder für die Array-Prüfung (ob Array gefüllt ist):
if (0/1) + (not not {I}) = 0 then
end if

... bei {I} steht nach dem Einfügen der Cursor.

[OT: Klassen]
... mit diesem Thema könnte dieser Thread ziemlich vom Thema "Codeschnippsel" abkommen. :)

ZitatDie Klassenmodule sind das eigene oder sind das Formulare?
Ich speichere Formulare (Code und Layout) und auch eigene Code-Module (Standardmodule u. Klassenmodule) als Textdatei ab.

ZitatWenn es eigene sind kennst du dich damit aus?
Ich glaub schon. ;)

ZitatIch glaube in diesen Klassen steckt sehr viel mehr potenzial als wir alle glauben.
Du darfst dir aber von den VBA-Klassen nicht zu viel erwarten ... für "richtiges OOP" fehlt in VBA einiges.
Zum Kapseln von betimmten Aufgaben sind sie aber durchaus geeignet. ... vor allem, wenn man auch (eigene) Ereignisse nutzen will, funktioniert das nur mit Klassen.

ZitatIn Büchern werden die immer nicht gut behandelt und wenn es Beispiele gibt sind das immer 0815 Sachen.
Das mit den Beispielen ist immer so ein Problem ... macht man sie zu umfangreich, erkennt man möglicherweise die Kernaussage nicht mehr - und macht man sie zu einfach, sind sie manchmal nicht  mehr praxisnah.

Kennst du die AEK-Skripte von Paul Rohorzka zum Thema Klassen im AEK-Downloadbereich von http://www.donkarl.com/?AEK?

mfg
Josef

Optiplex

Das nenn ich mal eine Antwort.

Danke Josef für deine Ausführungen, das muss ich erstmal alles sondieren und durcharbeiten. Kann ein bischen dauern.

Ich melde mich auf jeden Fall nochmal.

Gruß Dieter

Optiplex

Hallo Josef,
nein die AEK kannte ich noch nicht. Ich habe mir als erstes die Klassen Vorträge angesehen und Habe natürlich einige Fragen. Im AEK 12
wird beschrieben wie man ein zusammengesetztes Control (Gaugebar) mit einem Klassenmodul zusammenbaut, was mich aber erstaunt ist dass der Autor die Controls im Formular erstellt und nicht im Klassenmodul. Ich habe eigentlich gemeint, dass man die Controls ebenfalls im Klassenmodul erstellen kann. und was mich auch noch erstaunt hat ist, dass ich die überlagerten Ereignissen quasi im erstellten Control im Formular freigeben muss in dem man ein leeres Ereignis im VBA Editor stehen hat, oder hat sich das mittlerweile geändert? Ich hoffe du kannst mit diese fragen beantworten.

Gruß Dieter

Josef P.

Hallo!

Vorab: würde das Thema "Klassen" nicht besser in einen eigenen Thread passen?

ZitatIch habe eigentlich gemeint, dass man die Controls ebenfalls im Klassenmodul erstellen kann
Du kannst in einem Access-Formular zur Laufzeit (in der Formularansicht) keine Steuerelemente anfügen. Das funktioiert nur in der Entwurfsansicht eines Formulars.
(Wenn du das unbedingt benötigst, könntest du eine Form2-Formular verwenden.)

Zitatdass ich die überlagerten Ereignissen quasi im erstellten Control im Formular freigeben muss
Meinst du damit den Eigenschaftseintrag "[Event Procedure]"?
Das musst du nicht unbedingt bereits im Entwurf einstellen. Du kannst den Eintrag auch zur Laufzeit in der jeweiligen Eigenschaft eintragen.
Eines muss aber unbedingt vorhanden sein: das Formular muss inkl. Codemodul gespeichert sein.

mfg
Josef



Optiplex

Hallo Josef,
Also mir deiner ersten Anwort komm ich garnicht klar.

(Wenn du das unbedingt benötigst, könntest du eine Form2-Formular verwenden.)

wie meinst du das ?

Mit den Ereignissen meine ich, wenn ich die Ereignisse überschreibe (with  Events) dann muss man doch im Eigenschaftsfenster bei den überschriebenen Ereignissen "[Ereignisprozedur]" einstellen und im VBA-Code ein leeres Eventereignis erzeugen damit das Ereignis auch ausgeführt wird. So hab ich das jedenfalls verstanden. Ich meine das überschreiben ist eine feine Sache man kan z.B eine Combobox im Enterereignis gleich aufgehen lassen oder die Hintergrundfarbe wechseln(geht natürlich auch anderst, sind nur Beispiele), aber warum in allerwelt muss ich dann diese qausi Geisterereignisse im Formularcode erstellen.

Gruß Dieter

Josef P.

Hallo!

zu Forms2-Formularen:
Es gibt in VBA auch die Möglichkeit die "Form 2.0"-Bibliothek zu verwenden und damit Formulare (UserForm) zu erstellen. (Das sehe ich z. B. öfter in Excel-Dateien, wenn spezielle Masken benötigt werden.)

zu den Ereignissen:
Du überschreibst nirgends ein Ereignis, wenn du eine Dekalaration mit Withevents durchführt.
Sobald ein Formular ein Klassenmodule besitzt, kannst du per VBA den Eigenschaftswert "[Event Procedure]" einstellen, um auf ein Ereignis reagieren zu können.
Wenn du willst, kannst du auch in 20 Klassen auf das eine Ereignis des Steuerelements reagieren. Dann wird in jeder dieser Klassen die Prozedur zur Ereignisbehandlung durchlaufen.
Du kannst das einfach testen, wenn du in einer Klasse auf so eine Prozedur reagierst aber auch in der Ereignisbehandlung im Formularmodul etwas ausführst (z.B. eine Messagebox anzeigen).

Ein Beispiel-Code:
Private WithEvents m_Form As Form

Public Property Set FormReferenz(ByVal frm As Form)
   Set m_Form = frm
   If Len(m_Form.OnCurrent) = 0 Then
      m_Form.OnCurrent = "[Event Procedure]"
   End If
End Property

Private Sub m_Form_Current()
   MsgBox "..."
End Sub

Wenn du das in einer Klasse nutzt und eine Formular-Referenz an die Eigenschaft FormReferenz übergibst, muss im Formular keine leere Ereignisbehandlung enthalten sein. Es darf auch die Eigenschaft OnCurrent leer sein, da diese beim Übergeben der Referenz per Code eingestellt wird, falls sie fehlt.

Zum Thema Ereignisse versuchte ich einmal eine Beschreibung zu erstellen: [url?http://access.joposol.com/know-how/grundlagen/benutzerdefinierte-ereignisse.html]Ereignisse - Die Nachrichtenverbreiter von Klassen[/url]
Vielleicht hilft dir das ein wenig, um das Prinzip zu verstehen. Dabei geht es zwar eher um selbst erstellte Ereignisse - die eingebauten Ereignisse in den Access-Elementen funktionieren aber ähnlich.

mfg
Josef

Optiplex

Hallo Josef,
mal sehen ob ichs jetzt kapiert habe. Also du legst ein Property Formreferenz an und übergibst die komplette Form danach biegst du OnCurrent der Form auf deine eigene Routine um (m_Form_Current). Will ich für mehr als ein Ereignis, neue Events haben so schreibe ich diese ebenfalls zuerst in das Property und erstelle danach eine entsprechende namendliche Routine. Und so kann ich für jede Form in der ich diese neuen Ereignisse nutzen will, zB im Openereignis schreiben MeineKlasse.Formreferenz(Me) und schon hätte ich die neuen Ereignisse in meiner Form.
Ich nehme mal an, dass ich die Ereignisse in meinem Formular nur erweitert habe und diese weiterhin nutzen kann. welcher Code wird dann zuerst ausgeführt der in der Klasse oder der im Formular?


Public Property Set FormReferenz(ByVal frm As Form)
   Set m_Form = frm                                           '<-- Muss ich nicht m_Form wieder aufräumen irgendwo?  Set m_Form = nothing   
   If Len(m_Form.OnCurrent) = 0 Then              '<-- Was bezweckst du damit?
     m_Form.OnCurrent = "[Event Procedure]"   
   End If
End Property


Ich habe die Hoffnung, dass ich dir noch nicht auf den Geist gehe mit meiner Fragerei

Danke und Gruß Dieter

lumbumba

Ich meine es ist der in der Form der zuerst ausgeführt wird.

Aufräumen kannst du in der Private Sub Class_Terminate deiner Klasse. diese ist wie die Private Sub Class_Initialize eine Standardsub  welche beim Zerstören bzw. Beim Create deiner Klasse aufgerufen werden.
ZitatIf Len(m_Form.OnCurrent) = 0 Then              '<-- Was bezweckst du damit?
damit wird überprüft ob eine ereignis schon definiert ist. Ich glaube er will ein vorhandenes definiertes Ereignis nicht überschreiben.

---

Josef P.

#13
Zitatdanach biegst du OnCurrent der Form auf deine eigene Routine um
Da verstehst du die Ereignisse eventuell noch wein wenig falsch.

Mit der Einstellung in OnCurrent aktiviert man im Prinzip nur das Auslösen der Ereignisses.
Anm.: OnCurrent ist nicht das Ereignis. Das Ereignis heißt Current (siehe Objektkatalog).

Sobald das Ereignis von der jeweiligen Instanz (Formular, Steuerelement,...) ausgelöst ist, kann jeder der will und eine Referenz zur Instanz hat dieses Ereignis "abhören".

zu "Muss ich nicht m_Form wieder aufräumen irgendwo?"
Aber erst, wenn nicht mehr auf das Ereignis reagiert werden soll.
Anm.: "müssen" ist auch ein wenige realtiv ;), da beim Entladen des Formulars auch die Formular-Variablen entfernt werden. Es ist aber meiner Ansicht kein schlechter Stil, wenn man aufräumt, sobald die Referenzen nicht mehr benötigt werden.

Len(m_Form.OnCurrent) = 0
Damit wird geprüft, ob es bereits einen Eintrag in der Eigenschaft OnCurrent gibt.

Vielleicht ist es mit einem kleinen Beispiel besser zu verstehen => MehrfacheEreignisBehandlung.zip

mfg
Josef

Optiplex

hallo Josef,
nicht böse sein, dass ich dir keine Antwort gegeben habe, aber mich hat die Grippe voll erwischt und niedergestreckt. Ich bin auch noch nicht dazugekommen deine Test-DB genauer unter die Lupe  zu nehmen.

ich melde mich wieder gruß Dieter