WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 20.11.2002, 13:09   #1
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard eigener Typ in VB zur Laufzeit "verändern"

Wie haben einen Public Type am Anfang der Funktion deklariert - in dem Typ befindet sich auch ein Array der Form str(x, y) as string. Nur wissen wir am Anfang beim Start des Programms noch nicht wie groß x und y werden soll.

Man könnte natürlich auch einen hohen x und y Wert am Anfang nehmen der sich sicher ausgeht - nur nimmt sich das Programm dann nicht gleich "zu viel" Speicherplatz um das Array im Speicher abzubilden.
Außerdem ist das nicht wirklich elegant.

Das ganze wird deshalb über ein Public Type gemacht da wir das ganze in einer ActiveX DLL deklarieren und dann aus Access verwenden wollen.

Oder könnte ich auch eine öffentliche Variable (public dim - oder sowas halt??) machen weil dann gehts ja über Redim.
Nur wie geht des?

Vielleicht habts ja eine Idee wie man das lösen könnte.
renew ist offline   Mit Zitat antworten
Alt 20.11.2002, 15:26   #2
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard

Frage neu (weil ich keinen Typ mit einem String(300, 300) deklarieren kann, da das ganze für VB anscheinend zu gruß wird.

Aber nur eine Variable mit string(300, 300) geht - nur wie kann ich die zwischen DLL und VBA wo diese eingebunden ist übergeben?
renew ist offline   Mit Zitat antworten
Alt 20.11.2002, 19:42   #3
Sesa_Mina
Schwarzfußfrettchen
 
Registriert seit: 28.01.2001
Beiträge: 2.071


Standard

Probier mal keine Werte anzugeben sondern nur

Dim X() as String

und dann im code mit

ReDim X(a,b) das Array dynamisch zu reservieren.

Sollen die alten Werte im Array erhalten bleiben (erweiterung des Arrays) verwende

ReDim Preserve X(a,b)
____________________________________
Wann die kan Almdudler ham... \"Es gibt nur einen Weg zur Lunge, und der muss geteert werden, damit der Krebs nicht stolpert!\"
http://www.dream.at/gizmo/bunny.gif
Image is © 2001 Merle
Sterndalsäg.. ähh... jäger
Sesa_Mina ist offline   Mit Zitat antworten
Alt 20.11.2002, 20:24   #4
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard

Leider is das Problem net so einfach - redim kenn ich eh.

Die Daten müssen nicht erhalten bleiben, weil am Anfang wo ich das "redim" brauch noch nix im Array steht.

So aber ich schreib mal die Problematik, dann wirds besser verständlich warum ich das so machen will:

Projekt in VBA, soll eine Matrix aus einer Textdatei einlesen - "Datensätze" durch ";" getrennt. Die Testmatrix die wir derzeit haben ist 373*373 (=139129) Felder groß.
VBA dapackt das net (nich einmal in einer Stunde war er fertig) - drum wird das Einlesen der Matrix in einer DLL gemacht - zumindest stellen wir uns das so vor.
Die Werte die gespeichert werden sind Strings.

Weil in VB dauerts nicht mal 2 Minuten mit dem gleichen Code auf der gleichen Maschine.

Jetzt haben wir uns mal mit ActiveX Dlls gespielt wie das ungefähr funktioniert. Um den Wert bzw. die Matrix zu übergeben haben wir ein
Code:
 Public Type test
     array(10, 10) as string
 end Type
gemacht - nur zu testzwecken.

In Access die DLL dann über Verweise eingebunden und eine Variable vom Typ test definiert.(array)
Von VBA rufen wir eine Funktion in der DLL auf prozedur(byref array).

Die DLL speichert dann nur zum Test mal irgendeinen String rein und den geb ich in VBA aus.


Das Problem ist, dass im Typ test das array von der Größe limitiert ist (auf 64kB) - wenn ich jetzt ein array mit (373, 373) definier bekomm ich einen Fehler und kann nicht kompilieren.

Und wenn ich das ganze über eine Variable lösen würde - meiner Meinung nach die einzige Möglichkeit wie binde ich diese dann in VBA ein, damit ich darauf zu greifen kann? Das ist das was ich wissen will und brauch.


Ich hoff das war jetzt nicht zu kompliziert...
renew ist offline   Mit Zitat antworten
Alt 20.11.2002, 21:09   #5
Sesa_Mina
Schwarzfußfrettchen
 
Registriert seit: 28.01.2001
Beiträge: 2.071


Standard

die dll kann doch Methoden bereitstellen, die einen beliebigen Wert aus dem Array (der Datei) zurückgeben, oder?

Also hab ich dann...


X = dllfile.GetValue(X,Y)

und in der dll dann die Funktion definiert.
____________________________________
Wann die kan Almdudler ham... \"Es gibt nur einen Weg zur Lunge, und der muss geteert werden, damit der Krebs nicht stolpert!\"
http://www.dream.at/gizmo/bunny.gif
Image is © 2001 Merle
Sterndalsäg.. ähh... jäger
Sesa_Mina ist offline   Mit Zitat antworten
Alt 20.11.2002, 21:34   #6
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard

Zitat:
Original geschrieben von Sesa_Mina
die dll kann doch Methoden bereitstellen, die einen beliebigen Wert aus dem Array (der Datei) zurückgeben, oder?

Also hab ich dann...


X = dllfile.GetValue(X,Y)

und in der dll dann die Funktion definiert.
jo natürlich geht das...

sowas ähnliches (nur net so einfach) is mir auch schon in den Sinn gekommen....
Ich muss halt dann die Werte von der DLL einzeln nach VBA schaufeln - und da weiß ich nicht wie schnell VBA da is - aber probieren kann man es ja mal, wenn nicht kann ich mir immer noch was überlegen.

Angeblich (?) kann man Variablen aus der DLL als Objekte bzw. Klassen in einem anderen Projekt bzw. halt in VBA verwenden.
Nur bin ich noch net drauf gekommen wie das funktioniert.

Wir haben mit dem schon mal mit Public Property ..... in der DLL herum probiert:
Code:
Public Property Let (od. get?) zahl1(zahl1 as integer)
z1 = zahl1
End Property
Und das haben wir dann mittels dim myclass as Object und set myclass = new Class1 (so heißt die "Klasse" in der DLL) in VBA eingebunden.

Dann kann man zwar mittels Class1.zahl1 (zahl1 wird einem sogar "vorgeschlagen" wenn man Class1. tippt) mit = auf irgendeinen Wert Setzen - nur den bekommt die DLL nicht. Und umgekehrt kann ich auch keinen Wert aus der DLL so lesen.

Die Möglichkeit stammt von unserem Professor - der da aber nicht so 100%ig Sattelfest ist, sonst hätten wirs ja schon.
Er meint, dass man so direkt auf Variablen in der DLL zugreifen könnte, wenn man die so irgendwie deklariert und dann erspart man sich das hin und herschaufeln der Werte.

Naja, mal schaun.
renew ist offline   Mit Zitat antworten
Alt 22.11.2002, 15:10   #7
Seidl
Veteran
 
Registriert seit: 10.01.2001
Beiträge: 478


Standard

Da habt ihr wohl einen etwas eigenartigen VBA-Code gehabt.
Ich habe die Sache gerade versucht und das File war praktisch sofort eingelesen.
Im Anhang findet ihr mein Testmatrix-File.

Hier mein Code:


Sub Makro1()
Const ForReading = 1, ForWriting = 2, ForAppending = 3
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Dim FileSys, File, TextStream, strLine
Dim arrLines(372, 372) As String
Dim SplitLine As Variant, Part As Variant
Dim X As Long, Y As Long
Set FileSys = CreateObject("Scripting.FileSystemObject")
Set File = FileSys.GetFile("c:\Matrix.txt")
Set TextStream = File.OpenAsTextStream(ForReading, TristateUseDefault)
X = 0
Do While Not TextStream.AtEndOfStream
strLine = TextStream.ReadLine
SplitLine = Split(strLine, ",")
Y = 0
For Each Part In SplitLine
arrLines(X, Y) = Part
Y = Y + 1
Next
X = X + 1
Loop
TextStream.Close
Stop
End Sub
Seidl ist offline   Mit Zitat antworten
Alt 23.11.2002, 11:42   #8
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard

Danke....

Naja, wer die eingebauten Funktionen (split) kennt ist klar im Vorteil. Ich wusste bis jetzt nix von einer Funktion Split - ich hab mir eine selber geschrieben, die immer den String von bis rausholt.
Die Funktioniert ja auch unter VB supa, nur dass der Unterschied zu VBA so groß wär hätt ich nicht gedacht.
Das einzige is halt auch, meine Strings sind ein bissi länger (15-20 zeichen )

Außerdem: Warum machst du das File wie bei VBS über das Scripting-Object auf?

Das is der Code der das File einliest.... (Trennzeichen ist ein vbLf)
Code:
Open "h:\prpe\matrix" For Input As #1
    Line Input #1, strwerte
    Close #1
    Trim (strwerte)
    
    
    intdimension = intX - 1
    
    position = InStr(strwerte, vbLf)
    
    For intY = 1 To intdimension
        For intX = 1 To intdimension
            If intY = 1 And intX = 1 Then
            
                Matrix(intY, intX) = Mid(strwerte, 1, position - 1)
                
            Else
                If intY = intdimension And intX = intdimension Then
                
                    Matrix(intX, intY) = Mid(strwerte, position, Len(strwerte) - position)
    
                Else
                
                    position2 = position
                    position = InStr(position + 1, strwerte, vbLf)
                
                    Matrix(intX, intY) = Mid(strwerte, position2, position - position2)
                    
                End If
                
            End If
        
        Next
    Next
Der Code ist net 100%ig von mir, da ich nur teilweise da mitarbeite.
renew ist offline   Mit Zitat antworten
Alt 23.11.2002, 12:54   #9
renew
Inventar
 
Registriert seit: 22.10.2000
Alter: 41
Beiträge: 5.552


Standard

hab deinen Code gerade probiert - hui - split is schnell.

Muss ihn nur noch anpassen, dass er mir die Matrix so füllt wie sie dann sein soll, aber sonst passts.
renew ist offline   Mit Zitat antworten
Alt 25.11.2002, 08:49   #10
Seidl
Veteran
 
Registriert seit: 10.01.2001
Beiträge: 478


Standard

Bzgl. Warum machst du das File wie bei VBS über das Scripting-Object auf?


...Also jetzt wo du fragst weiss ich's eigentlich auch nicht so genau
Für so kleine Code-Teile denke ich meistens nicht gross nach sondern schreibe nach Gefühl. Wirklich zu denken fang ich erst an wenn ich etwas schreiben muss, dass sich dann auch im Alltag beweisen muss.

Was die Geschwindigkeit angeht, so sollte man immer versuchen rechenintensive Schritte in Schleifen so gut wie möglich zu optimieren.

so long
Seidl
Seidl ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:19 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag