[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[amibroker] Re: Help with ActiveX component (PLEASE TOMASZ READ THIS)



PureBytes Links

Trading Reference Links

Thanks Gordon,

I think to have found where it's the problem (I'm sorry if it's too 
much technical):

When VB pass a VARIANT parameter to an automation method, if possible 
it passes the parameter by REFERENCE (like pointers in C), otherwise 
it passes by VALUE. String variables are passed by reference.
TJ's code expect only the parameter by VALUE, so  
the VariantChangeType failed the conversion. String constants (like 
the result of a CStr) are passed by value, so it works. You can 
obtain the same result using the () operator, that converts a value 
to a constant, so it's passed by value. The call could be like this 
(look at the innatural double (), the inner is the () operator):

Set oStk = oStocks.Item((Ticker))

 
You can see this Microsoft's document (it refers to VB 4, by I think 
that it's the same for other versions) :
http://support.microsoft.com/default.aspx?scid=kb;en-us;142223

I think that TJ should modify Amibroker's code (it's explained at the 
above link) to get over this problem, that surely will happen again 
to others.


Regards,

romadd64



--- In amibroker@xxxxxxxxxxxxxxx, "Gordon" <amibroker@xxxx> wrote:
> Hi,
> 
> Snip from 45607:
> 
> 
> ***************
> The CSTR thing was mentioned by TJ to me: 
>  
> As for this CStr():  the real reason for such strange behaviour is 
> that Stocks.Item( ticker) accepts VARIANT
> as a TICKER. This is so to allow the user to reference ticker by 
both 
> number and symbol.
> As you probably know Variant can hold any type. 
>  
> AmiBroker does the following:
> struct StockInfo * AStocks::FindStockInfoByVariant(const VARIANT 
> &Item)
> {
>  struct StockInfo *si = NULL;
>  
>     if (Item.vt == VT_BSTR)
>     {
>          si = FindStock( CString( Item.bstrVal ) ) ;
>     }
>     else
>     {
>         // coerce to VT_I4
>         VARIANT va ;
>         VariantInit( &va );
>         if (SUCCEEDED(VariantChangeType( &va, (VARIANT FAR*)&Item, 
0, 
> VT_I4 )))
>         {
>             si = StockInfoFromIndex( (int)va.lVal );
>         }
>     }                 
>  
>  return si;
> }
> 
> - it checks if variant is of string type (VT_BSTR) and then treats 
it 
> as a symbol,
> otherwise it tries to coerce it to the 32bit integer index (this is 
> because numbers passed in variant
> may be floats R4, real R8, short, long integers, etc).
>  
> Strangely enough if you do not use explicit conversion VB puts some 
> strange variant (I didn't checked it yet it is)
> instead of simple string as anyone may think.
> ***********
> 
> - Gordon
> 
> --- In amibroker@xxxxxxxxxxxxxxx, "Email" <romadd64@xxxx> wrote:
> > Gordon,
> > 
> > I have searched for CStr, but I haven't seen messages from Tomasz 
> > about that (beyond the message on this thread).
> > Can you kindly show me that message ?
> > 
> > Thanks, romadd64
> > 
> > 
> > --- In amibroker@xxxxxxxxxxxxxxx, "Gordon" <amibroker@xxxx> wrote:
> > > This is explained just a few days ago. It basically has to do 
> with 
> > > the fact that the collection takes a string or number as the 
key. 
> A 
> > > search in the newsgroup on CStr should get you to Tomasz' 
precise 
> > > explanation.
> > > 
> > > Gordon
> > > 
> > > --- In amibroker@xxxxxxxxxxxxxxx, "Email" <romadd64@xxxx> wrote:
> > > > Tomasz,
> > > > 
> > > > why we must convert the var Ticker (it is already a string 
> type), 
> > > to 
> > > > another string via CStr ?
> > > > 
> > > > 
> > > > 
> > > > --- In amibroker@xxxxxxxxxxxxxxx, "au99991" <auttley@xxxx> 
> wrote:
> > > > > Tomasz,
> > > > > 
> > > > > Your experience is as invaluable as ever!  Many thanks.
> > > > > 
> > > > > Andy.
> > > > > 
> > > > > --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" 
> > > > <amibroker@xxxx> 
> > > > > wrote:
> > > > > > Hello,
> > > > > > 
> > > > > > You have to call CStr as follows:
> > > > > > 
> > > > > > Set oStk = oStocks.Item( CStr( Ticker ) )   
> > > > > > 
> > > > > > Best regards,
> > > > > > Tomasz Janeczko
> > > > > > amibroker.com
> > > > > > ----- Original Message ----- 
> > > > > > From: "au99991" <auttley@xxxx>
> > > > > > To: <amibroker@xxxxxxxxxxxxxxx>
> > > > > > Sent: Saturday, August 09, 2003 1:10 PM
> > > > > > Subject: [amibroker] Help with ActiveX component
> > > > > > 
> > > > > > 
> > > > > > > I'm trying to access the Amibroker object collection 
from 
> a 
> > > VB 
> > > > > > > activex function.  Please ignore what the function is 
> > doing - 
> > > > I'm 
> > > > > > > just trying to get the basic function-calling correct.
> > > > > > > 
> > > > > > > The function in VB reads:
> > > > > > > 
> > > > > > > Public Function StockFN() As Variant
> > > > > > >     
> > > > > > >     Dim Ticker As String, oAB As Object, oStocks As 
> Object, 
> > > > oStk 
> > > > > As 
> > > > > > > Object
> > > > > > >     
> > > > > > >     Set oAB = CreateObject("Broker.Application")
> > > > > > > 
> > > > > > >     Ticker = oAB.ActiveDocument.Name
> > > > > > > 
> > > > > > >     Set oStocks = oAB.Stocks
> > > > > > >     
> > > > > > >     Set oStk = oStocks.Item
> (Ticker)                      '!!
> > > > Error 
> > > > > line
> > > > > > >     
> > > > > > >     StockFN = oStk.Fullname
> > > > > > > 
> > > > > > > End Function
> > > > > > > 
> > > > > > > I call it in a guru commentary with the following code:
> > > > > > > myAB = CreateObject("MyAB.Common");
> > > > > > > myAB.StockFN();
> > > > > > > 
> > > > > > > This gives an 'Object variable not set error' in VB.  
> > > However, 
> > > > I 
> > > > > know 
> > > > > > > that the Ticker variable is correctly loaded and if I 
> > replace 
> > > > > Ticker 
> > > > > > > for a hardcoded ticker value in the error line above, 
the 
> > > > > function 
> > > > > > > returns a value albeit obviously for the hardcoded 
ticker 
> > > > value.  
> > > > > > > Would much appreciate a pointer on what I'm doing wring 
> as 
> > > I'm 
> > > > > > > getting no where!
> > > > > > > 
> > > > > > > Many thanks
> > > > > > > 
> > > > > > > Andy.
> > > > > > > 
> > > > > > > 
> > > > > > > 
> > > > > > > Send BUG REPORTS to bugs@xxxx
> > > > > > > Send SUGGESTIONS to suggest@xxxx
> > > > > > > -----------------------------------------
> > > > > > > Post AmiQuote-related messages ONLY to: 
> > > > amiquote@xxxxxxxxxxxxxxx 
> > > > > > > (Web page: 
> http://groups.yahoo.com/group/amiquote/messages/)
> > > > > > > --------------------------------------------
> > > > > > > Check group FAQ at: 
> > > > > http://groups.yahoo.com/group/amibroker/files/groupfaq.html 
> > > > > > > 
> > > > > > > Your use of Yahoo! Groups is subject to 
> > > > > http://docs.yahoo.com/info/terms/ 
> > > > > > > 
> > > > > > > 
> > > > > > >


------------------------ Yahoo! Groups Sponsor ---------------------~-->
Buy Ink Cartridges or Refill Kits for Your HP, Epson, Canon or Lexmark
Printer at Myinks.com. Free s/h on orders $50 or more to the US & Canada. http://www.c1tracking.com/l.asp?cid=5511
http://us.click.yahoo.com/l.m7sD/LIdGAA/qnsNAA/GHeqlB/TM
---------------------------------------------------------------------~->

Send BUG REPORTS to bugs@xxxxxxxxxxxxx
Send SUGGESTIONS to suggest@xxxxxxxxxxxxx
-----------------------------------------
Post AmiQuote-related messages ONLY to: amiquote@xxxxxxxxxxxxxxx 
(Web page: http://groups.yahoo.com/group/amiquote/messages/)
--------------------------------------------
Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/