AUGE_OHR hat geschrieben:unabhänig von anderen Sprachen gibt es auch unter Xbase++ mit Hilfe von ot4xb eine Möglichkeit die Geschwindigkeit um Faktor 40 zu beschleunigen. Anfragen dazu bitte in einem neuen Thread.satmax hat geschrieben:Das mit ActivX und LANGSAM verunsichert mich nun.
ActveX schneller mit ot4xb?
Moderator: Moderatoren
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
ActveX schneller mit ot4xb?
Hallo Jimmy,
Gruß
Markus
Markus
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: ActveX schneller mit ot4xb?
in der aktuellen Version 1.6.0.167 gibt es die Disphelper Functionen für den Umgang mit COM Objekten.
http://disphelper.sourceforge.net/readme.htm
Pablo hat nun folgenden Function daraus gemacht.
_DH_CREATEOBJECT
_DH_GETOBJECT
_DH_CREATEOBJECTEX
_DH_GETOBJECTEX
_DH_CALLMETHOD
_DH_PUTVALUE
_DH_PUTREF
_DH_GETVALUE
_DH_INVOKE
_DH_INVOKEARRAY
_DH_CALLMETHODV
_DH_PUTVALUEV
_DH_PUTREFV
_DH_GETVALUEV
_DH_INVOKEV
_DH_ENUMBEGIN
_DH_ENUMBEGINV
_DH_ENUMNEXTOBJECT
_DH_ENUMNEXTVARIANT
_DH_TOGGLEEXCEPTIONS
vergleicht man die Demo Beispiele die o.g. URL und nimmt z.b. das Excel Beispiel dann ergibt sich folgenden Syntax
C :
dhCreateObject(L"Excel.Application", NULL, &xlApp)
alt DispHPR.DLL :
#xtranslate @dh:<f>( [<params,...>] ) => @disphpr:<f>( [<params>] )
#xtranslate L(<c>) => cSzAnsi2Wide(<c>)
@dh:dhCreateObject(L("Excel.Application"),0,@xlApp)
neu Ot4xb.DLL :
#xtranslate L(<c>) => cSzAnsi2Wide(<c>)
_dh_CreateObject(L("Excel.Application"),0,@xlApp)
statt eines Object bekommt man in xlApp einen numerischen Wert ( Pointer / Handle )
da die Variable per Referenz übergeben wird kann man keine Class iVar benutzten
_dh_...( @::MyIvar) -> Error
_dh_...( @Mylocal ) -> funktioniert
::MyIvar := Mylocal // jetzt in die Ivar
Property abfragen/setzen :
_dh_PutValue(xlApp, L(".DisplayFullScreen = %b"), .T.)
_dh_PutValue(xlApp, L(".Visible = %b"), .T.)
_dh_GetValue(L("%o"),@xlRange,xlApp,L(".ActiveSheet.Range(%s)"), "A1:E2")
_dh_GetValue(L("%o"),@xlChart,xlApp,L(".ActiveWorkbook.Charts.Add"))
von Xbase++ sind wir verwöhnt was die Definition von Variabel angeht.
auf API Ebene muss man den Type angeben wobei der C printf Style verwendet wird.
%d LONG long, int, INT
%u ULONG unsigned long, unsigned int, UINT, DWORD
%e DOUBLE double
%b BOOL
%v VARIANT
%B BSTR 1
%s LPSTR char * 1
%S LPWSTR WCHAR * 1
%T LPTSTR TCHAR * 1
%o IDispatch * DISPATCH_OBJ(var) 2, 3
%O IUnknown * 3
%t time_t 4
%W SYSTEMTIME * 4
%f FILETIME * 4
%D DATE 4
%p LPVOID Use for HANDLEs, HWNDs, etc
%m Missing Argument 5
Method ausführen
// Apply a border around everything. Note '%m' means missing.
_dh_CallMethod(xlSheet, L(".Range(%s).BorderAround(%d, %d, %m, %d)"), "A1:E2", 1, 2,0)
// Set up the chart
_dh_CallMethod( xlChart, L(".ChartWizard(%o, %d, %d, %d, %d, %d, %b, %s)"),;
xlRange,-4100, 7, 1, 1, 0,.F.,"Critically Endangered Plants and Animals")
und am Ende aufräumen
am Ende müssen noch alle Pointer freigegeben werden
#xtranslate SAFE_RELEASE( <v> ) => (<v> := iif(Empty(<v>),0,(IFpQCall(2,"__sl__sl",<v>),0)))
SAFE_RELEASE(xlRange)
SAFE_RELEASE(xlChart)
SAFE_RELEASE(xlApp)
weitere Anfrage im Zweifel in der Newsgroup von Pablo stellen news.xbwin.com oder über http://www.Xbwin.com -> Forum da es sich ja nicht um pure Xbase++ handelt.
http://disphelper.sourceforge.net/readme.htm
Pablo hat nun folgenden Function daraus gemacht.
_DH_CREATEOBJECT
_DH_GETOBJECT
_DH_CREATEOBJECTEX
_DH_GETOBJECTEX
_DH_CALLMETHOD
_DH_PUTVALUE
_DH_PUTREF
_DH_GETVALUE
_DH_INVOKE
_DH_INVOKEARRAY
_DH_CALLMETHODV
_DH_PUTVALUEV
_DH_PUTREFV
_DH_GETVALUEV
_DH_INVOKEV
_DH_ENUMBEGIN
_DH_ENUMBEGINV
_DH_ENUMNEXTOBJECT
_DH_ENUMNEXTVARIANT
_DH_TOGGLEEXCEPTIONS
vergleicht man die Demo Beispiele die o.g. URL und nimmt z.b. das Excel Beispiel dann ergibt sich folgenden Syntax
C :
dhCreateObject(L"Excel.Application", NULL, &xlApp)
alt DispHPR.DLL :
#xtranslate @dh:<f>( [<params,...>] ) => @disphpr:<f>( [<params>] )
#xtranslate L(<c>) => cSzAnsi2Wide(<c>)
@dh:dhCreateObject(L("Excel.Application"),0,@xlApp)
neu Ot4xb.DLL :
#xtranslate L(<c>) => cSzAnsi2Wide(<c>)
_dh_CreateObject(L("Excel.Application"),0,@xlApp)
statt eines Object bekommt man in xlApp einen numerischen Wert ( Pointer / Handle )
da die Variable per Referenz übergeben wird kann man keine Class iVar benutzten
_dh_...( @::MyIvar) -> Error
_dh_...( @Mylocal ) -> funktioniert
::MyIvar := Mylocal // jetzt in die Ivar
Property abfragen/setzen :
_dh_PutValue(xlApp, L(".DisplayFullScreen = %b"), .T.)
_dh_PutValue(xlApp, L(".Visible = %b"), .T.)
_dh_GetValue(L("%o"),@xlRange,xlApp,L(".ActiveSheet.Range(%s)"), "A1:E2")
_dh_GetValue(L("%o"),@xlChart,xlApp,L(".ActiveWorkbook.Charts.Add"))
von Xbase++ sind wir verwöhnt was die Definition von Variabel angeht.
auf API Ebene muss man den Type angeben wobei der C printf Style verwendet wird.
%d LONG long, int, INT
%u ULONG unsigned long, unsigned int, UINT, DWORD
%e DOUBLE double
%b BOOL
%v VARIANT
%B BSTR 1
%s LPSTR char * 1
%S LPWSTR WCHAR * 1
%T LPTSTR TCHAR * 1
%o IDispatch * DISPATCH_OBJ(var) 2, 3
%O IUnknown * 3
%t time_t 4
%W SYSTEMTIME * 4
%f FILETIME * 4
%D DATE 4
%p LPVOID Use for HANDLEs, HWNDs, etc
%m Missing Argument 5
Method ausführen
// Apply a border around everything. Note '%m' means missing.
_dh_CallMethod(xlSheet, L(".Range(%s).BorderAround(%d, %d, %m, %d)"), "A1:E2", 1, 2,0)
// Set up the chart
_dh_CallMethod( xlChart, L(".ChartWizard(%o, %d, %d, %d, %d, %d, %b, %s)"),;
xlRange,-4100, 7, 1, 1, 0,.F.,"Critically Endangered Plants and Animals")
und am Ende aufräumen
am Ende müssen noch alle Pointer freigegeben werden
#xtranslate SAFE_RELEASE( <v> ) => (<v> := iif(Empty(<v>),0,(IFpQCall(2,"__sl__sl",<v>),0)))
SAFE_RELEASE(xlRange)
SAFE_RELEASE(xlChart)
SAFE_RELEASE(xlApp)
weitere Anfrage im Zweifel in der Newsgroup von Pablo stellen news.xbwin.com oder über http://www.Xbwin.com -> Forum da es sich ja nicht um pure Xbase++ handelt.
gruss by OHR
Jimmy
Jimmy
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: ActveX schneller mit ot4xb?
Vorerst herzlichen Dank Jimmy. Ich werde mir das noch genauer ansehen.
Gruß
Markus
Markus