vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Komplexere 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Komplexere Strukturen in VB6 
Autor: Dirk
Datum: 25.01.10 12:52

Du kannst in .Net eine COM DLL entwickeln und diese dann von VB6 aus verwenden: http://www.devsource.com/c/a/Using-VS/Calling-Net-Classes-from-Visual-Basic-6/

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Komplexere Strukturen in VB6 
Autor: Dirk
Datum: 25.01.10 12:56

MCP schrieb:
Zitat:

VB6 stößt dort jedoch an seine Grenzen da Vorwärtsdeklarationen nicht möglich sind.
Kann mich nicht mehr so recht erinnern, was Vorwärtsdeklarationen (in C) sind. Was ist das und warum glaubst du, dass VB das nicht kann?

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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;
}
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Komplexere Strukturen in VB6 
Autor: Dirk
Datum: 25.01.10 13:35

Ach ja stimmt, jetzt hab ich's wieder. Macht letztlich keinen Sinn, auch nicht in deinem C Beispiel. Die gegenseitige Referenzierung müssen Pointer sein, dann geht es ansonsten ist das 'ne rekursive Endlosdefinition.

In VB kannst du das mit Klassen lösen. Das Problem der gegenseitigen Referenzierung führt dann aber dazu, dass keines der beiden Objekte, welche sich gegenseitig referenzieren terminiert - außer es werden entsprechende Gegenmaßnahmen getroffen --> Weak references http://www.vbarchiv.net/workshop/workshop_47-zirkulaere-verweise-vermeiden-weakreference-in-vb-classic.html

Typischerweise tritt dies ja bei baumartigen Strukturen auf, wenn vom Child zurück-referenziert werden soll.

1-Parent <--> n-Childs

Hier sollte dann die Referenz im Child auf den Parent als weak ausgeführt werden. Allerdings hat die Sache bei unsachgemäßer Anwendung Crash-Potential! D.h. wird auf eine WeakReference zugegriffen, dessen Objekt terminiert ist, geht's ins Nirvana!

Ich habe eine Klasse, die WeakReferences handhabt.

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Komplexere Strukturen in VB6 
Autor: CrazyMetal
Datum: 28.01.10 09:52

Ja ach nee, so klein ist das Web ^^

Das Tolle am Internet ist: Jeder kann mitmachen!
Das Doofe am Internet ist: Jeder macht mit...

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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. ^^
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Komplexere Strukturen in VB6 
Autor: CrazyMetal
Datum: 28.01.10 11:35

^^
Bin auch grade auf der Suche, die Lösung hab ich 42, nur wie war die Frage?

Hier ist mein Problemchen, sieht danach aus als wenn es eine ActiveX-Komponente sein müsste, will ich aber net.
http://www.vbarchiv.net/forum/id4_i5095t5095_dll-mit-formular-nur-wie-bekomme-ich-den-rueckgabewert.html

Das Tolle am Internet ist: Jeder kann mitmachen!
Das Doofe am Internet ist: Jeder macht mit...

Beitrag wurde zuletzt am 28.01.10 um 11:36:16 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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. ^^
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Problem gelöst? 
Autor: CrazyMetal
Datum: 29.01.10 07:55

So habe grade getestet was wir gestern besprochen hatten, es funtioniert

Erstelle 2 Klasse:
'<Klasse 1>
Public eineKlasse As Object
Public myString As String
 
Public Function showMe()
    MsgBox myString & " ich beinhalte" & vbCrLf & eineKlasse.myString
End Function
'<Klasse 2>
Public eineKlasse As Object
Public myString As String
 
Public Function showMe()
    MsgBox myString & " ich beinhalte" & vbCrLf & eineKlasse.myString
End Function
Und in die Form-Load:
'<Form 1>
    Dim c1 As Class1
    Dim c2 As Class2
 
    Set c1 = New Class1
    Set c2 = New Class2
 
    c1.myString = "Klasse 1"
    c2.myString = "Klasse 2"
 
    Set c1.eineKlasse = c2
    Set c2.eineKlasse = c1
 
    c1.showMe
    c2.showMe
Yay! Funktion.

Das Tolle am Internet ist: Jeder kann mitmachen!
Das Doofe am Internet ist: Jeder macht mit...

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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. ^^
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Problem gelöst? 
Autor: Dirk
Datum: 29.01.10 10:53

Ich denke es spricht nichts dagegen, statt der Deklaration As Object, die Variante As Class1 bzw. As Class2 zu nehmen.

Mit deinem Konstrukt wirst du jedoch die von mir bereits geschilderten Probleme bzgl. der Objekt-Terminierung haben. D.h. keines der beiden Objekte wir freigeben, wenn es auf Nothing gesetzt werden, da sie sich gegenseitig referenzieren. Daher schau noch einmal in http://www.vbarchiv.net/forum/id3_i78990t78986_komplexere-strukturen-in-vb6.html

Gruß
Dirk

--
?Get it right the first time

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel