Seite 2 von 2

Verfasst: 26.04.2005 15:50
von ts-soft
@Rings
Danke, ich hätte trotz #NULL weiter versucht :freak:
Deine BSTR Procedure muß ich sofort testen, kann man öfters mal gebrauchen :allright:

Und noch danke, an alle die Fehler gesucht haben. Wer auf die beiden Funktionen mit Single-Rückgabe verzichten kann, kann den Wrapper gern benutzen, bzw. mit TailBite eine UserLibrary draus machen. Für mich ist das Projekt erstmal abgeschlossen. Bringt leider nicht allzu viel.

Gruß
Thomas

Nachtrag: merkwürdigerweise funktioniert aber das PowerBasic Beispiel mit der DLL. Das kann man leider nur als gezipptes Setup unter dem link im englischem Forum laden. Die Lizenbestimmungen, so ich sie richtige verstanden haben, hindern mich aber diese mit hinzuzupacken.

Verfasst: 26.04.2005 16:20
von Rings
ts-soft hat geschrieben:@Rings
Danke, ich hätte trotz #NULL weiter versucht :freak:
klar, das war allerdings das erste was ich getestet hab.
ts-soft hat geschrieben:Deine BSTR Procedure muß ich sofort testen, kann man öfters mal gebrauchen :allright:
Na ja, wie gesagt gibts alles über SYSStrings in der OLE.dll . ich finde
das ganze mehr verwirrend denn nützlich .Der einzige Nutzen ist das Diese Strings auch Unicodestrings sein können, und natürlich NULL enthalten dürfen .

Noch was am Rande,
ich habe anstatt der OpenLibrary,IsFunction die direkten Api-Befehle genutzt.
Man muss ja nicht mehr wrappen als nötig.Ausserdem gibts dann keinen Ärger wegen irgendeiner doppeltverwendeten Nummer oder so.
Nur als Hinweis für alle die mittels Tailbit DLL-Wrapper schreiben ;)

Verfasst: 26.04.2005 16:26
von ts-soft
Rings hat geschrieben: Noch was am Rande,
ich habe anstatt der OpenLibrary,IsFunction die direkten Api-Befehle genutzt.
Man muss ja nicht mehr wrappen als nötig.Ausserdem gibts dann keinen Ärger wegen irgendeiner doppeltverwendeten Nummer oder so.
Nur als Hinweis für alle die mittels Tailbit DLL-Wrapper schreiben ;)
Hast ja Recht, ist leider die Gewöhnung, das ich daran nicht gedacht habe :oops:

Gruß
Thomas

Verfasst: 10.05.2005 09:31
von Danilo
ts-soft hat geschrieben:Nachtrag: merkwürdigerweise funktioniert aber das PowerBasic Beispiel mit der DLL.
Ersetze mal die 2 betroffenen Prozeduren durch das:

Code: Alles auswählen

ProcedureDLL.f Excel_XLTable_GetCellAsSingle(hXLTable.l, nCol.l, nRow.l); Returns a numeric fielddata as single-precision floating-point
  CallFunctionFast(Excel_XLTable_GetCellAsSingle, hXLTable, nCol, nRow)
  ProcedureReturn
EndProcedure

ProcedureDLL.f Excel_XLTable_GetCellAsSingleEx(hXLTable.l, nCol.l, nRow.l, nRound.l); Same as Excel_XLTable_GetCellAsSingle() but can round the value
  CallFunctionFast(Excel_XLTable_GetCellAsSingleEx, hXLTable, nCol, nRow, nRound)
  ProcedureReturn
EndProcedure
Ich kann es nicht testen, da ich dieses MS-Office-Zeug nicht
habe und nicht brauche. Sollte aber eigentlich so richtig sein.

Effekt: Der Float-Rückgabewert der DLL-Funktion, der auf dem
FPU-Stack liegt, wird so direkt als Float zurückgegeben.

Verfasst: 10.05.2005 13:13
von Falko
@Danilo
Wenn ich das richtig gelesen habe, kann man das auch ohne Office testen, da ja aus dem Beispiel die Exeltabelle nach .cvs umgewandelt wird. Falls dem nicht so ist, habe ich das mal getestet.

Habe beide Proceduren getauscht und im Vergleich zu Powerbasic ausprobiert.
Powerbasic hat geschrieben:Sheet: Quick Tour
Cols: 10
Rows: 188
Value$: 3591.55
Single: 3591.6
Version: 1.00
Purebasic hat geschrieben:Sheet: Quick Tour
Cols: 10
Rows: 188
Value$: 3591.55
Single: 3591.600098
Version: 1.00

MfG Falko

Verfasst: 10.05.2005 13:27
von Danilo
Falko hat geschrieben:@Danilo
Wenn ich das richtig gelesen habe, kann man das auch ohne
Office testen, da ja aus dem Beispiel die Exeltabelle nach .cvs
umgewandelt wird.
Das Beispiel XLTest.pb von ts-soft bringt bei mir ein "Could not open XLS",
d.h. Excel_FileToObject() schlägt fehl.

In der XLTable.chm steht aber auch schon:

Code: Alles auswählen

Notes:
  * XLTable does require Excel to be present.
    It will use the com interface of Excel to communicate
...von daher ist es schon richtig so. Man braucht dieses Excel
um XLTable nutzen zu können.
Falko hat geschrieben:Falls dem nicht so ist, habe ich das mal getestet.

[...]
Purebasic hat geschrieben:Sheet: Quick Tour
Cols: 10
Rows: 188
Value$: 3591.55
Single: 3591.600098
Version: 1.00
Danke. Scheint also nun zu funktionieren, da Single (Float)
zurückgegeben wird.


Das ganze war ein Denkfehler meinerseits. Als ich heute zufällig
in meiner 'Calling Conventions.txt' etwas überprüft habe, ist mir
dieser Topic und mein Denkfehler gleich eingefallen... :)

Verfasst: 10.05.2005 21:48
von ts-soft
@Danilo Bild
Funktioniert hervorragend. Soll man erstmal drauf kommen bzw. da wäre ich nie drauf gekommen. Wenn man so gut wie keine ASM-Kenntnisse hat ist das auch schwer zu verstehen.

Verfasst: 12.05.2005 02:59
von ts-soft
Für alle interessierten, die UserLib mit Source und an PureBasic angepaßten Beispiel kann im ShowCase gedownloadet werden:
XLTable DLL Wrapper Lib v.1.0


Die UserLib wurde mit TailBite 1.2 PR 1.0 erstellt (wegen Strings)

Alles scheint jetzt einwandfrei zu funktionieren, lediglich beim Runden von Floats werden die überzähligen Stellen, nach dem Runden nicht entfernt.

Verfasst: 12.05.2005 11:20
von Falko
ts-soft hat geschrieben:....Alles scheint jetzt einwandfrei zu funktionieren, lediglich beim Runden von Floats werden die überzähligen Stellen, nach dem Runden nicht entfernt.
Man könnte ja noch im Testsource mogeln, damit es so aussieht wie in Powerbasic :mrgreen:

Code: Alles auswählen

MsgBox + "Single:  " + Chr( 9 ) + StrF(Excel_XLTable_GetCellAsSingleEx( hXLTable, 2, 5, 1 ),1) + #CRLF$
Aber das wäre nicht Sinn der Sache, wenn man die konvertierte Tabelle weiter benutzen wollte. Im Wrapper habe ich StrF(singleFunktion,1) probiert, dazu muss ich ein Ergebniss zurückgeben, dann wäre das das gleiche Spiel wie vor Danilos SuperTip :allright:

Gruß Falko

Verfasst: 12.05.2005 13:33
von ts-soft
Falko hat geschrieben: Man könnte ja noch im Testsource mogeln, damit es so aussieht wie in Powerbasic :mrgreen:

Code: Alles auswählen

MsgBox + "Single:  " + Chr( 9 ) + StrF(Excel_XLTable_GetCellAsSingleEx( hXLTable, 2, 5, 1 ),1) + #CRLF$
Aber das wäre nicht Sinn der Sache
Doch, dieses ist der Sinn des Rundens. Dein Tip ist schon eine guter Lösungsansatz. Da ich lediglich einen Wrapper gemacht habe, hab ich es auch nicht weiter angepasst. Die Mini-Floats von PB sind IMHO mehr eine Notlösung.