.ocx und module

Hallo Ihr Wissenden.
Mein Problen ist folgendes: ich schreibe gerade an ein paar Steuerelementen (.ocx), die dann für eine bestimmte Anwendung registriert werden. Dabei hat sich herausgestellt, dass einige dieser Steuerelemente gleiche Funktionalitäten haben. diese Funktionen möcht ich jetzt gern in einem Modul bündeln und für alle Steuerelemente bereitstellen. Mein Problem dabei ist - ich kann auf die Variablen(und ) ihre Werte mit den Funktionen des Modules nicht zugreifen.
Wie kann ich als am besten vorgehen, um oben skizziertes Vorhaben zu realisieren?

Vielen Dank,
alex

Hallo.
ich habe mich ein wenig mit dem Thema beschäftigt, aber noch nicht allzu intensiv.
In Vb (die Version könnte eine Rolle spielen, habe V.5.0)
kann man normalerweise keine Code-Resourcen laden.
Mir schwirrt u.a. auch der Begriff „Class“ durch den Kopf.
Innerhalb eines Projektes gibt es ja die Möglichkeit, Code in Code-Modulen zu sammeln, so das man dieses Modul überall einsetzen kann.
Bei VB werden beim rekursiven Aufruf von functionen oder sub’s diese instanziert, so das nach meiner Meinung dasselbe(das Instanzieren) beim Aufrufen von dll-Routinen geschehen sollte. Also wie wärs mit einer einzelnen dll für alle Controls?
In VB fand ich dabei nur die Erstellung von active-x dll’s zugänglich.(siehe Handbuch/Hilfen)
MfG
Matthias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Alex,

habe ich dich richtig verstanden. Du schreibst mehrere Steuerelemente. Diese Steuerelemente greifen auf von dir definierte Funktionen zu ?
Du suchst nun eine Variante auf sie zuzugreifen?

Bsp. alle Steuerelemente sollen auf eine Funktion sagen wir mal „GetUserName“ zugreifen?

Wenn dies der Fall ist, schreibe doch einfach alle Funktionen in ein Modul, mache daraus eine *.Dll und setze in jedem Steuerelement ein Verweis auf die *.Dll. Somit kannst du von jedem Steuerelement aus auf die gewünscht Funktion zugreifen.
Möchtest du daten untereinander austauschen ( zwischen den Steuerelementen, so mache dich einem *.tmp File zu nutzen oder die Registry *zwinker*)

Du kannst desweiteren auch kompelexe Anwendungen in ein Steuerelement implentieren und bei bedarf extrahieren und ausführen, aber das ist sicherlich nicht das was du möchtest :smile:

Fall du probleme hast, beim erstellen der *.DLL sage einfach bescheid und ich poste dir ein bsp :smile:

MFG Alex

PS: Ich selbst habe mir mal ein DLL geschrieben, wo ich viele nuetzliche Funktionen geschrieben habe. Diese DLL binde ich in all meinen Tool’s ein und spare mir somit die Arbeit jedesmal, also bei jedem neuen Projekt die selbigen Funktionen zu schreiben. So genuegt eine Zeile.

Ein Bsp. waere zum bsp. Anzeige der Info, wenn du VB 5 nutzt die Funktion Split, Replace etc :smile:

Hallo Anno,

habe ich dich richtig verstanden. Du schreibst mehrere
Steuerelemente.

Also -ich schreibe Steuerelemente für eine bestimmte Anwendung. Diese Elemente laufen als ocx-Dateien innerhalb (des Prozessraumes) dieser Applikation. Auf diesen UserControls befinden sich weitere UCs (EingabeFelder,ComboBoxen, etc.)

Diese Steuerelemente greifen auf von dir

definierte Funktionen zu ?

Ich denke so kann man das nennen , ja es gibt Funktionen, die in allen zb. Comboboxen identlich funktionieren mussen.
z.B Benachrichtung des späteren Anwenders bei der Eingabe fehlerhafter oder unerlaubter Werte.
Meine Idee war halt auch, diese Funktionen in ein Modul zu legen und dieses ALLEN Steuerelementen zur Verfügung zu stellen (geht ja auch ohne dll) Nur, es funktioniert nicht. Wenn ich diese Vorgehensweise bei Forms und Modulen anwende, kann ich, die Funktionen aufrufen und die Werte auch als Parameter übergeben. Bei meinen UserControls geht das nicht. Die Fehlermeldung die ich bekomme ist immer gleichlautend, dass das Modul die Variablen des UC nicht kennt und umgekehrt.
Hast Du vielleicht eine Idee, warum das so läuft - und wie ich es ändern kann?
Des Weiteren wäre ich sehr an Deiner Anleitung zur Erstellung von dlls interessiert. Ubrigens, die einzelen Steuerelemente kommunizieren nicht miteinander. Meine VB -Version ist 6.0.
Herzlichen Dank.
alex

Hallo Matthias,
Danke für Deine Überlegungen. Derzeit arbeite ich mit VB 6.
Weitere Erklärungen zu meinem Projekt habe ich in meiner Antwrt an Anno74 ausgeführt. Falls Dir also dazu noch etwas einfallen sollte, danke Dir ich schon einmal vorab.

Herzlich,
alex

Hallo Alex ,

Ok, du schreibst das du bei deinem Steuerelement was du schreibst mehrere Uc’s sind. Die Steuerelemente kommunizieren nicht untereinander.

Du schreibst das die verschiedenen UC’s immer auf die selbe Funktion zugreifen sollen und als bsp. ein Fehlermeldung ausgeben sollen, wenn eine falsche eingabe gemacht ist.
Was ich nicht verstehe ist, wo da dein problem steckt.
Du kannst doch in deinem Steuerelement ein Modul einpflegen. In diesem prüfst du dann zu bsp. ob die eingabe korrekt war und gibst gesetz dem fall eine fehlermeldung aus. Diese Funktion machst du einfach öffentlich und rufst sie dann auf. Dies sollte auch bei einem Normalen Steuerelement ( *.ocx) gehen .

Ich bin derzeit an einem Rechner wo kein VB drauf ist, aber ich setze mich heute abend mal hin und teste mal wie es geht und poste dir dann ein bsp dazu.
Die Anleitung wie du eine DLL erstellst, poste ich dir dann auch, da ich jetzt nicht wirklich zeit habe :smile:

MFG Alex

Auch haben will *g

Ich bin derzeit an einem Rechner wo kein VB drauf ist, aber
ich setze mich heute abend mal hin und teste mal wie es geht
und poste dir dann ein bsp dazu.
Die Anleitung wie du eine DLL erstellst, poste ich dir dann
auch, da ich jetzt nicht wirklich zeit habe :smile:

Hallo Alex,
an der Aleitung zum dll Basteln bin ich auch interessiert und zu Infos zu ocx, weiss da gar nix.
Gruß
Reinhard

Hallo Alex,

also nun habe ich mal zeit gefunden und folgendes probiert was anstandslos klappt.
Ich habe ein Steuerelement entworfen und darauf 2 textboxen gemacht.
Es wird bei jedem Tastendruck ueberprueft ob es sich um eine zahl handelt oder nicht und ggbfls. ein msg ausgegeben und das letzte zeichen gelöscht. Das klappt aber nur wenn ein zeichen an am ende eingetragen wird *zwinker* Ist ja nur nen Demo :smile:

Im usercontrol sind 2 Textfelder und ein combofeld

Option Explicit

Private Sub Combo1\_Change()
Checkeingabe Combo1 'Überprüfung auf zahl-\> Sub ist in einen Modul
End Sub

Private Sub Text1\_Change()
 Checkeingabe Text1 'Überprüfung auf zahl-\> Sub ist in einen Modul
End Sub

Private Sub Text2\_Change()
 Checkeingabe Text2 'Überprüfung auf zahl-\> Sub ist in einen Modul
End Sub

Code im Modul 1

Option Explicit

Public Sub Checkeingabe(c As Control)
On Error Resume Next
 Dim msg As Boolean
 msg = False 'flag ob message ausgegeben werden soll
 Select Case UCase(TypeName(c)) 'Was für ein Object ist es
 Case "TEXTBOX" 'Eine Textbox
 'hier Code zur Ueberpruefung rein
 'Bsp.
 If Not (zahl(c.Text)) Then 'es ist keine Zahl
 c.Text = Left(c.Text, Len(c) - 1) 'Letztes Zeichen löschen. Zugriff aufs Object über c
 msg = True 'Flag wird auf anzeigen gesetzt
 End If
 Case "COMBOBOX" 'Eine Combobox
 If Not (zahl(c.Text)) Then 'es ist keine zahl
 c.Text = Left(c.Text, Len(c) - 1) 'Letztes Zeichen löschen. Zugriff aufs Object über c
 msg = True 'Flag wird auf anzeigen gesetzt
 End If
 Case Else
 'Ein anderes Element
 End Select
 If msg Then 'Ist Flag gesetzt dann
 c.SelStart = Len(c) 'Cursor ans ende setzen
 c.SetFocus 'Object den Focus geben
 MsgBox "Sie koennen nur Zahlen von 0- 9 eingeben!", vbInformation, "Fehlerhafte Eingabe..." 'Meldung ausgeben
 End If
End Sub

'Routine zum Überprüfen des letzten Zeichens auf eine Zahl
Private Function zahl(msg As String) As Boolean
 zahl = False
 Select Case Asc(Right(msg, 1))
 Case 48 To 57
 zahl = True
 Case Else
 zahl = False
 End Select
End Function

Wie du siehst kannst du rel. simple mit einer Prozedure auf jedes Sub zugreifen.
Falls du noch fragen hast oder dir etwas unklar ist, dann poste einfach nochmal :smile:

MFG Alex

Hallo Reinhard,

also wenn ich dir komplette Anleitung zum schreiben eines Steuerlementes geben würde, würde ich den rahmen des forums sprengen.
Was möchtest du denn da genau wissen ?
Einstellen der Eigenschaften etc ?

Eine DLL kannst du rel. einfach erstellen!

Project -> Neu -> ActiveX Dll
und dem Klassenmodul schreibst du ganz einfach die gewuenschten Prozeduren und Funktionen, die du in der dll haben moechtest. Diese machst du Public. Du kannst weiterhin Formen etc hinzufuegen und sie mit der Show Methode anzeigen lassen etc. :smile:

Unter Instancing stellst du das verhalten der Dll ein. Für normale Zwecke stelle die Eigenschaft Instancing des Klassenmoduls auf 6 Globalmultiuse.
Dies bedeutet das jeder darauf zugreifen kann ohne etwas instancieren zu muessen. Was die anderen Werte bedeuten das bekommst du rel. schnell heraus indem du in der Hilfe nachschaust.

Falls noch fragen sind, einfach posten :smile:

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Anno,
vielen Dank - mit Deinen Informationen klappt es jetzt mit den Modulen auch bei mir. Mir ist zwar noch nicht ganz klar geworden, wo mein Fehler bisher war, aber das wird wohl noch.

LG,
alex

Hallo Alex,

hmm ohne den Quelltext zu kennen ist es schwer, ne aussage darueber zu treffen. Aber in normalen Proggs kannst du ueber Activeform.activecontrol oder formname.Objectname auf Objecte zugreifen.
Bei einem Usercontrol geht das nicht, aber dann übergibt halt deiner gewuenschten Function einfach wie in meinen Bsp. das gesamte Object :smile:

Viele Wege führen nach Rom, auch in VB *zwinker*

MFG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Anno,

hmm ohne den Quelltext zu kennen ist es schwer, ne aussage
darueber zu treffen.

Ja klar. Den Quelltext posten ging aber in dem Fall nicht.

Aber in normalen Proggs kannst du ueber

Activeform.activecontrol oder formname.Objectname auf Objecte
zugreifen.

Ja das isst mir auch bekannt… UND

Bei einem Usercontrol geht das nicht,

DIESE Besnderheit eben auch. Aber weißt Du, woran das liegt? Ich habe mich da mal eine Weile mit beschäftigt, aber ich weiß nicht genau, ob es an einer speziellen Form von Kapselung der (Container)Objekte bei UserCntrols liegt. Dann könnte man versuchen, das Ganze über neue Properties der UC zu realisieren. (Obwohl ich da denke, dass diese Kapselung durchaus auch ihre Hintergründe hat) Also falls Du noch in diesem Punkt eine Idee hast, ich würde mich freuen. Auch über Literaturtipps bezüglich der Besonderheiten von UC und anderen Objekten in VB 6.

aber dann übergibt halt

deiner gewuenschten Function einfach wie in meinen Bsp. das
gesamte Object :smile:

coole Idee, aber - leidet nicht die Perfomanz schwer darunter, wenn ich den ganzen Kram des Objektes mitschleppe und nur die .text -Eigenschaft eigentlich benötige. Das hatte mich in meinen Überlegungen immer davon abgehalten, ganze Objekte zu übergeben. Bisher konnte ich das auch immer vermeiden…

Viele Wege führen nach Rom, auch in VB *zwinker*

Jepp, das hast Du absolut recht.

Herzlich,
alex

Hallo Anno,

Hallo Alex :smile:

hmm ohne den Quelltext zu kennen ist es schwer, ne aussage
darueber zu treffen.

Ja klar. Den Quelltext posten ging aber in dem Fall nicht.

Naja ist doch net so schlimm. Denn das problem haben wir ja gelöst :smile:

Aber in normalen Proggs kannst du ueber

Activeform.activecontrol oder formname.Objectname auf Objecte
zugreifen.

Ja das isst mir auch bekannt… UND

Bei einem Usercontrol geht das nicht,

DIESE Besnderheit eben auch. Aber weißt Du, woran das liegt?

Also auf Anhieb nicht. Ich muesste mich da auch mal schlau machen, da ich das bisher eigentlich nie brauchte. Bisher habe ich es immer anderes realisiert.

Ich habe mich da mal eine Weile mit beschäftigt, aber ich weiß
nicht genau, ob es an einer speziellen Form von Kapselung der
(Container)Objekte bei UserCntrols liegt. Dann könnte man
versuchen, das Ganze über neue Properties der UC zu
realisieren. (Obwohl ich da denke, dass diese Kapselung
durchaus auch ihre Hintergründe hat)

Hmm, also du eigenschaften festlegst, das wird nicht bringen.
Du kannst welche machen, zum bsp. ob nur zahlen eingegeben werden duerfen etc. diese kannst du ja rel. simple dann auslesen Property Get / let / set aber das aendert nichts daran das du nicht speziell darauf zugreifen kannst.

Also falls Du noch in
diesem Punkt eine Idee hast, ich würde mich freuen. Auch über
Literaturtipps bezüglich der Besonderheiten von UC und anderen
Objekten in VB 6.

Spontan faellt mir folgendes ein, aber ob das so einfach geht weiss ich net :-/
Was spricht dagegen aus dem UC einfach eine Normale Form aufzurufen?
Auf diese kannst du dann wie gewohnt zugreifen. Irgendwas in der Richtung würde ich dann versuchen :smile:

aber dann übergibt halt

deiner gewuenschten Function einfach wie in meinen Bsp. das
gesamte Object :smile:

coole Idee, aber - leidet nicht die Perfomanz schwer darunter,
wenn ich den ganzen Kram des Objektes mitschleppe und nur die
.text -Eigenschaft eigentlich benötige.

Ja diese leidet dann darunter, das stimmt!
Aber wenn du nur die texteigenschaft benötigst, warum uebergibst du dann nicht nur den text an eine Function und prüfst den Text und gibst ein Flag zurueck ob alles in Ordnung ist ( true) oder nicht (false) und löschst gegebenfalls dann die Eingabe?

Das hatte mich in
meinen Überlegungen immer davon abgehalten, ganze Objekte zu
übergeben. Bisher konnte ich das auch immer vermeiden…

Viele Wege führen nach Rom, auch in VB *zwinker*

Jepp, das hast Du absolut recht.

Herzlich,
alex

mfg alex