| |
Fortgeschrittene ProgrammierungKomplexere Strukturen in VB6 | | | Autor: MCP | Datum: 25.01.10 11:02 |
| Hallo Freunde,
ich habe ein größeres Problem. Und zwar soll ich eine GAEB-Schnittstelle programmieren.
Nur bin ich mir nicht ganz sicher wie ich das am besten angehen soll.
Das Projekt soll ein VB6 Projekt sein was mir ein paar enorme Einschränkungen bringt.
Das Projekt soll eine GAEB-Datei (eine Datei im XML Format) erhalten und aus dieser Informationen auslesen. Das ist kein Problem und funktioniert dank MSXML ganz gut. Das Problem ist jedoch die Daten auszulesen und in Typen zu speichern. Am besten wäre es die Typen zu schachteln. So kann ein Type BoQBody zum Beispiel einen Type BoQCategory enthalten dort wieder ein Type BoQBody vorkommen kann.
Diese Strukturen sind also rekursiv geschachtelt. VB6 stößt dort jedoch an seine Grenzen da Vorwärtsdeklarationen nicht möglich sind.
Nun ist die Frage was tun? Das Projekt muss leider in VB6 vorliegen. Ich weiß aber nicht wie ich die Struktur aufbauen soll.
Ich habe darüber nachgedacht in einer anderen Sprache eine DLL oder ein ActiveX Steuerelement zu schreiben das sich diese Aufgabe an nimmt. Jedoch kenne ich mich mit den Möglichkeiten dabei nicht gut aus. Ist es möglich, zum Beispiel, in C++ eine DLL zu erstellen die Strukturen abbildet und diese DLL in VB6 einzubinden und die Strukturen einzusetzen?
Das man Funktionen aus C/C++ DLLs in VB6 importieren kann weiß ich, wie sieht es jedoch mit Klassen und Strukturen aus? Da habe ich bei meiner Suche nichts brauchbares gefunden.
Wäre für Ideen und Vorschläge jeder Art sehr dankbar.
Es muss auch nicht C++ sein. Die Sprache in der die DLL geschrieben werden soll ist zweitrangig.Es kann auch C#, VB.NET oder sonst was sein.
Mit freundlichen Grüßen,
MCP | |
Re: Komplexere Strukturen in VB6 | | | Autor: MCP | Datum: 25.01.10 13:06 |
| Naja, bei C/C++ würde man das die Prototypen nennen.
Kann auch sein das ich mich irre, aber afaik ist sowas in VB6 nicht möglich (zumindest kenne ich keine Möglichkeit):
Type T1
Text as String
oTyp as T2
End Type
Type T2
Text as String
oTyp1 as T1
End Type In C/C++ würde man das durch einen Prototypen umgehen:
struct T1;
struct T2;
struct T1
{
string Text;
T2 oTyp2;
}
struct T2
{
string Text;
T1 oTyp1;
} | |
Re: Komplexere Strukturen in VB6 | | | Autor: MCP | Datum: 25.01.10 13:47 |
| Das klingt ganz interessant. Werde ich mir mal genauer anschauen. Mit Klassen ließ sich bei dem Projekt bisher leider eher schlecht arbeiten da es immer wieder Vorschriften gab wann man Benutzerdefinierte Typen zurückgeben darf und wann nicht.
Und ja. Bei C/C++ müssen das Pointer sein. Oder Arrays, wobei das im Endeffekt ja das gleiche ist. ;)
Bezüglich der Referenzen sollte es ja möglich sein die Referenz vor Benutzung auf Nothing zu prüfen. Wenn man mit C/C++ mit Pointern hantiert muss man ja auch immer brav vor den NULL Pointern aufpassen. ^^
Wie hat Stroustup so schön gesagt? "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off.". Da ich privat sehr viel mit C++ Arbeite bin ich es gewohnt mit der Gefahr eines Seg-Faults zu leben. ^^
Dann mal wieder an die Arbeit. Ich werde mich dann melden wenn es entweder geklappt hat oder eben nicht.
Viele Grüße,
MCP | |
Re: Komplexere Strukturen in VB6 | | | Autor: MCP | Datum: 28.01.10 10:50 |
| Was machst DU denn hier? Stalker? ^^
Damit hätte ich nun überhaupt nicht gerechnet. ^^
Auch auf der Suche nach Problemlösungen oder hat der Chef gerade nit geschaut was du tust? ;) Naja, ich experimentiere gerade mit den WeakReferences rum. ^^ | |
Re: Komplexere Strukturen in VB6 | | | Autor: MCP | Datum: 28.01.10 11:45 |
| Ich sehe... Hab Dir mal geantwortet. Vielleicht hilft das. Wenn nicht schreiben wir dort weiter. ^^ | |
Re: Problem gelöst? | | | Autor: MCP | Datum: 29.01.10 10:23 |
| Servus CrazyMetal.
Ja Problem scheint gelöst.
Ich war heute früh auch schon fleißig und habe den Ansatz implementiert.
Das Ergebnis:
Vorwärtsdeklarationen stellen in Klassen kein Problem da! Da jede Klasse in einer eigenen Datei liegt.
Mein Prototyp sieht zwar etwas anders aus als Deiner, aber macht im Endeffekt das gleiche.
Nun hatte ich noch ein kleines Problem:
Bei Visual Basic 6 darf man zwar einen eigenen Typen/eine eigene Klasse als ein Public Attribut definieren. Jedoch darf ein Array von Object/Variant/eigenere Klasse/Benutzerdefinierter Typ kein Public Attribut einer Klasse sein. Wortlaut:
"Fehler beim Kompilieren:
Konstanten, Zeichenfolgen fester Länge, benutzerdefinierte Arrays und Declare-Anweisungen sind als öffentliche Mitglieder von Objektmodulen nicht zugelassen."
Das Problem konnte ich umgehen indem ich das Array Private deklariert habe und eine Get Property Function implementierte. So gebe ich das Array zurück. Fehlt nur noch ein Property um an ein einzelnes Element zu kommen. Das sollte aber nicht schwer sein.
Das Ergebnis sieht bei mir wie folgt aus:
Typ1.cls:
'Klassenvariablen
Public m_sVar As String
Private m_T2() As Typ2
'Das Get Property um das Array der anderen Klasse abzufragen
Public Property Get T2() As Typ2()
T2 = m_T2
End Property
'Ein Funktion um das Array zu initialisieren und mit Dummy Werte zu füllen.
Public Function load()
'Dummyvariable
Dim T2_1 As New Typ2
'Arraygröße anpassen
ReDim m_T2(2)
'Dummy 1 füllen
T2_1.sVar = "Nr. 1"
Set m_T2(0) = New Typ2
Set m_T2(0) = T2_1
'Dummy 2 füllen
Set T2_1 = Nothing
Set T2_1 = New Typ2
T2_1.sVar = "Nr. 2"
Set m_T2(1) = New Typ2
Set m_T2(1) = T2_1
'Dummy 3 füllen
Set T2_1 = Nothing
Set T2_1 = New Typ2
T2_1.sVar = "Nr. 3"
Set m_T2(2) = New Typ2
Set m_T2(2) = T2_1
End Function Typ2:
'Kurz und knapp:
Public sVar As String
Public T1 As Typ1 Programm:
'Testen der Dummyklassen
'Deklarieren der Klassen
Dim oTyp1 As New Typ1
Dim oTyp2 As New Typ2
'Array von Typ 2 das durch Get Property gefüllt wird um die Dummy Werte aus
' Typ1 auszugeben
Dim oTempT2() As Typ2
Beschreiben von Typ2.T1 zum Testen.
Set oTyp2.T1 = oTyp1
'Dummy Werte in T1 initialisieren
oTyp1.load
'Das Array der Typ2 von Typ1 holen und der Dummy Variable zuweisen
oTempT2 = oTyp1.T2
'Die Dummy Werte ausgeben
Debug.Print oTempT2(0).sVar
Debug.Print oTempT2(1).sVar
Debug.Print oTempT2(2).sVar Das scheint soweit rund zu laufen und die gewünschte Funktionalität zu erfüllen.
Sollten noch weitere Probleme auftreten werde ich mich hier nochmal melden.
Das mit den WeakReferences hat nicht sehr gut funktioniert. Beim Aufruf der CopyMemory des Systems hat sich das Programm samt VB6 verabschiedet. ;) Den Fehler konnte ich leider nicht eingrenzen.
Aber mit den Klassen wird es auch funktionieren.
Danke an alle für die Hilfe. Ich habe wiedermal eine ganze Menge mehr über VB6 gelernt. Letztendlich lag die Lösung doch näher als erwartet. Manchmal sieht man den Wald vor lauter Bäumen nicht. ^^ | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|