 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 31.03.2009, 21:56 Titel: Excel-FB-Wrapper |
|
|
Hallo Leute
Hab mal was "neues" geschrieben. Hatte es auch mal in "Allgemeine Fragen zu FreeBASIC." erwähnt das ich an einem Wrapper arbeite, der mit Hilfe des Disphelpers Excel-VBA in Freebasic verfügbar machen soll.
Ist natürlich sehr umfangreiches Vorhaben. Deswegen habe ich bisher nur Grundsteine gelegt, mit denen man auf jeden Fall schon mal ein bischen Datenverarbeitung realisieren kann.
Ich würde mir sehr wünschen, dass sich möglichst viele daran beteiligen mehr Objekte bzw Funktionen zu implementieren!
hier die xlwrapper.bi:
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=835
und hier ein "einfaches" Beispiel:
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=836
Im Internet hab ich mich natürlich auch schon umgeschaut (gegoogelt) ob es sowas in der art schon gibt. Tatsächlich haben einige schon Projekte mit dem Disphelper realisiert, aber nicht Grundlegend versucht VBA-Syntax in FB nachzubilden.
Daher hoffe ich einfach mal auf positive Rückmeldung von euch
Danke schon mal!
Gruß Chris |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 01.04.2009, 08:55 Titel: |
|
|
Habe das Ganze nur kurz überflogen: Würde das heissen, mit der Vorgehensweise Deines Beispielcodes mehr oder weniger die Notwendigkeit einer temporäreren .VBS praktisch überall erfolgreich beseitigen können und so in Zukunft praktisch die komplette Palette sämtlicher Automatisierungsobjekte aus FB heraus direkt nutzen zu können?
Falls ja, bist Du in Zukunft sehr herzlich eingeladen, nach meinen Post jeweils ein "Und hier noch die Variante, die dreaels .VBS komplett eliminiert:" zu machen. :-)
Oder vielleicht erfindest Du ja sogar eines Tages der ultimative "vbs2dispelpers"-Codegenerator, der aus einem
Code: | ' Klassisches .VBS
Set oFoo = CreateObject("Foobar.Application")
Set oBar = oFoo.GetFoobar(cPar1, cPar2)
lFooBar = oBar.FooBarProperty
... |
direkten Disphelper-Code für FB generiert. :-) _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 01.04.2009, 09:20 Titel: |
|
|
@OneCypher
Regulär ist es nie möglich, das man einer "Property" mehr als eine eigenschaft gleichzeitig übergeben kann. Das würde auch den Sinn einer eigenschaft zunichte machen.
Eine Eigenscahft definiert ja ihrem sinn nach >1< Eigenschaft. Vergleich es mit VB. Dort hast du ne Eigenschaftsliste. Wenn man mehrere Eigenschaften gleichzeitig setzen lassen wollen würde, dann müsste man quasi 2 felder nebeneinander haben, die man zeitgleich ändert, so das die eigenschaft auch beide parameter gleichzeitig erhalten kann. Sonst könnte es zu undefinierten zuständen kommen, welche nicht voraussehbar sind.
Das ist auch ein Grund dafür, das man generell Seriell und nicht parallel Programiert. Schliesslich arbeitet auch ein PC alles nacheinander ab (mal abgesehen vom multicore, bei dem das teilweise jedoch auch so ist)
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 01.04.2009, 10:24 Titel: |
|
|
@Dreael: einen ultimativen vbs2disphelper wird es wahrscheinlich nicht geben können, weil die objekte bzw funktionen von vba/vbs hardcodiert in FB "umwickelt" werden müssen.. Und mit einem Parser oder Preprozessor möchte ich mich nicht beschäftigen.
aber zu deinem beispiel. Was spricht dagegen wenn du es in FB so ausdrückst:
Code: |
dim oFoo as IDispatch ptr
dim oBar as IDispatch ptr
dim lFooBar as integer
dim cPar1 as string = "Parameter 1"
dim cPar2 as string = "Parameter 2"
dhCreateObject("Foobar.Application", NULL, @oFoo)
dhGetValue("%o", @oBar, oFoo, "GetFoobar(%s, %s)", cPar1, cPar2)
dhGetValue("%d", @lFooBar, oBar, "FooBarProperty")
|
Nur um eine für den/die-anderen Programmierer eine konsistente Programmiersyntax zu schaffen siehts halt schöner aus, wenn man die disphelper-aufrufe in UDT-Eigenschaften oder Funktionen/Subs verpackt...
@ThePuppetMaster:
Hm ok, so richtig folgen kann ich dir nicht, aber ich glaub dir das einfach mal. Wie löst man denn sonst solche ausdrücke wie
[vba] .cells(r,c) = "Hallo Welt!" ? [/vba]
Der umweg über die Funktion deren Parameter in eine UDT verpackt und übergeben werden find ich nicht sonderlich prickelnd. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 01.04.2009, 10:51 Titel: |
|
|
OneCypher hat Folgendes geschrieben: | [vba] .cells(r,c) = "Hallo Welt!" ? |
Nun .. hier muss man bedenken, das die eigenschaft selbst das "Hallo Welt!" ist. wohin diese eigenschaft "kopiert" / "gemapt" wird, gibst du durch cells(r,c) an .. r und c sind hier aber nicht als eigenschaft zu sehen, sondern als parameter zur lokalisierung des speichers.
Das ist so als wenn du beispielsweise "rot" als "farbe-eigenschaft" setzen willst. Die Tatsache, das du dies durchfühen willst, reicht eben noch nicht aus. Du hast zwar die eigenschaft (farbe) und dessen neuen Wert (rot) definiert, jedoch nicht, was du rot anmalen willst. Das wird dann durch deien Funktion beschrieben, die anhand der angegebenen Parameter genau beschrieben bekommt, was zu tun ist. So als wenn du nen möbepacker sagst, "den schrank da hinten in der ecke" . .welcher los rennt, und ihn hohlt (funktions arbeit) und du anschliessend die farbe übergeben anstreichen kannst.
[EDIT]:
Aber, du kannst "cell" auch als funktion definieren, welche dir eine struktur zurück gibt, in der "value" ein properity is .. dann brauchst du "rc" nicht als funktion nutzen. In der Property kannst du dann mit "this." auf die eigene typenstruktur zugreifen (siehe linked list von mir in der projekt-sektion). Dort mache ich es ähnlich, nur mit einem parameter siehe "item" funktion.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 01.04.2009, 11:19 Titel: |
|
|
Oh mann... ich habs schon fast richtig gecoded... ich hätt nur in den funktionen cells(rc as _rc) die parameter in r und c aufspalten müssten *übermichselbstärger* .. hmm.. vielleicht könnte man noch eine Operatoren überladung (für = ) reinbauen das strings und zahlen auf die value eigenschaft weitergeleitet werden... *überleg* |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 01.04.2009, 14:10 Titel: |
|
|
OneCypher hat Folgendes geschrieben: | aber zu deinem beispiel. Was spricht dagegen wenn du es in FB so ausdrückst:
Code: |
dim oFoo as IDispatch ptr
dim oBar as IDispatch ptr
dim lFooBar as integer
dim cPar1 as string = "Parameter 1"
dim cPar2 as string = "Parameter 2"
dhCreateObject("Foobar.Application", NULL, @oFoo)
dhGetValue("%o", @oBar, oFoo, "GetFoobar(%s, %s)", cPar1, cPar2)
dhGetValue("%d", @lFooBar, oBar, "FooBarProperty")
|
|
Das ist schon einmal ein guter Anfang! :-) Versuchen wir es vielleicht noch etwas zu vervollständigen:
Code: | ' Noch einmal klassisches .VBS
Set oFoo = CreateObject("FooBar.Application")
' Methoden ohne Rückgabewert
cString1 = "Test 1"
lZahl2 = 123
bBool3 = False
oFoo.BarMethod cString1, lZahl2, bBool3
' Methoden mit Rückgabewert
lZahl4 = oFoo.Bar2Method(cString1, lZahl2, bBool3)
' Umgang mit Properties, welche nur einfache Datentypen verwenden
' Lesen
cString5 = oFoo.BarStringValue
lZahl6 = oFoo.BarZahlValue
bBool7 = oFoo.BarBoolValue
' und setzen
oFoo.BarStringValue = "Test 77"
oFoo.BarZahlValue = -317
oFoo.BarBoolValue = False
' Operationen mit Objekten
Set oBar = oFoo.GetBarObj(cString1, lZahl2)
' Collections sind auch noch etwas recht häufiges, z.B. alle Arbeitsblätter
' in einer Excel-Mappe, ebenso alle Unterverzeichnisse, die einem
' SubFolders beim FileSystemObject zurückliefert usw.
Set aBarKollektion = oFoo.BarList
lAnzahl = aBarKollektion.Count
Set oEinObjDavon = aBarKollektion(1)
' Methode, die ein Objekt als Parameter verlangt
oBar.InvokeSomeMethod 1234, oEinObjDavon
' Property, die ein Objekt enthält
' Lesen
Set oBar = oEinObjDavon.FooBarProp
' und Setzen
oEinObjDavon.FooBarProp = oBar
' Datentyp bestimmen von einem Objekt (WScript.Echo entspricht PRINT!)
WScript.Echo TypeName(oBar)
' Operation Zerstören/Löschen
Set oBar = Nothing |
Einen oben noch nicht genannten einfachen Datentyp kennt VBScript noch: Zeitstempel, z.B. beim FileObjekt wird einem in diesem Format das Dateimodifikationsdatum zurückgegeben und Excel lässt einem ebenfalls sehr bequem mit DateTime arbeiten, z.B.
Code: | oWks.Cells(2, 7).Value = Now |
(übrigens sinnvolles Beispiel, wenn eine Applikation eine Protokollierung in ein Excel-Sheet machen soll!) _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 01.04.2009, 16:22 Titel: |
|
|
@dreael: ähm.. ich bleib noch mal kurz bei der anderen Problematik:
[vba] .cells(2,2).value = "Hallo Welt!" [/vba]
funktioniert in meiner version schon mal!
aber
[vba] .cells(2,2) = "Hallo Welt!" [/vba]
noch nicht. Dazu habe ich mir folgendes Beispiel ausgedacht:
[code]
type testtype
declare operator let (byref x as string)
value_safe as string
para_safe as string
end type
operator testtype.let (byref x as string)
print "Vorher : " & value_safe
value_safe = x
print "Nachher: " & value_safe
end operator
dim a1 as testtype
a1 = "hallo"
a1 = "12345"
[code]
Dabei wird der operator let von testtype so überladen das er Strings an den value_safe weiterleitet.
Einen schritt weiter könnte man so gehen, indem man eine Funktion in die testtype implementiert die parameter entgegennimmt und mit den parametern die elemente verändert und diese testtype dann weiter an den let operator übergibt:
[code]
type testtype
declare operator let (byref x as string)
declare function testen(a as string) as testtype
value_safe as string
para_safe as string
end type
operator testtype.let (byref x as string)
print "Vorher : " & value_safe
value_safe = x
print "Nachher: " & value_safe
end operator
function testtype.testen(a as string) as testtype
para_safe = a
return this
end function
dim a1 as testtype
a1 = "hallo"
a1 = "12345"
print "#:" & a1.testen("A1").value_safe
sleep
[/code]
möchte man aber a1 über die funktion testen verändern, wie etwa mit:
[code]
a1.testen("A1") = "hallo welt!"
[/code]
nimmt der kompiler das nicht mehr an. obwohl der let-operator für die, von der testen-funktion zurückgegebene testtype korrekt strings entgegen nehmen soll...
puh.. sorry, echt kompliziert...
aber vielleicht weiss einer weiter... |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|