Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Excel-FB-Wrapper

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 31.03.2009, 21:56    Titel: Excel-FB-Wrapper Antworten mit Zitat

Hallo Leute lächeln

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 lächeln

Danke schon mal!

Gruß Chris
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 01.04.2009, 08:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 01.04.2009, 09:20    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 01.04.2009, 10:24    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 01.04.2009, 10:51    Titel: Antworten mit Zitat

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. grinsen

[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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 01.04.2009, 11:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 01.04.2009, 14:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 01.04.2009, 16:22    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz