Hello,

Sorry for my intromision but, where is olesrv2.prg ?

Many thank and sorry for my bad english.

Lautaro Moreira
El 25/05/2010 15:31, Przemysław Czerpak escribió:
On Tue, 25 May 2010, Szak�ts Viktor wrote:

Hi,

That sounds great, may I ask for a simple example which
show the usefulness of this feature over regular hashes?

This code illustrates the difference between regular and
associative hash arrays:

    proc main()
       local h
       h := { =>  }
       ? "regular hash array"
       tst( h )
       h := { =>  }
       ? "associative hash array"
       hb_hKeepOrder( h, .T. )
       tst( h )
    return
    proc tst( h )
       local v, i
       h[ 'zxc' ] := 1.000
       h[ 'qwe' ] := 2.000
       h[ 'abc' ] := 3.000
       h[ 'dfg' ] := 4.000
       h[ 'rbc' ] := 5.000
       ? "for each:"
       for each v in h
          ? v:__enumIndex(), v:__enumKey(), v
       next
       ? "access by index:"
       for i := 1 to len( h )
          ? i, hb_hValueAt( h, i )
       next
       ?
    return

As you can see executing it the order of items in associative array
is strictly defined and it's the same as the order in which new item
were added. It means that you have two strictly defined indexes. One
which can be used with [] operator and any hash item keys and the
second numeric only index. It's usable in many different places.
This is the part of ChangeLog message I created for Harbour OLE
servers. It's very nice example of practical usage.

    <hAction>  is optional parameter with hash array containing messages
    and instance variables used by OLE server. The keys in hash array
    are strings with message names and values are actions. Codeblock
    and symbol items means that given message is a method call and
    any other value means that it's variable.
    By default the same hash array is shared between all objects
    created by registered server. It's important when hash array
    contains values which are neither codeblock nor symbol items
    so they are not used as method but rather as instance variables
    because such instance variables are shared between OLE objects.
    Setting 4-th parameter<lHashClone>  to .T. causes that each
    objects receives it's own copy of<hAction>  item so instance
    variables inside hash array are also local to OLE object.
    Alternatively programmer can use<bAction>  or<sAction>  to create
    seprate copy of hash array for each object, i.e.:
       bAction := {|| hb_hClone( hValue ) }
    When hash array contains symbol item (@funcName()) then when it's
    executed by OLE object message it's possible to access the hash
    array bound with given OLE object using QSelf() function. It maybe
    useful if hash array contains instance variables and programmer
    wants to access them.
    Please remember that using hash array which was initialized to keep
    original assign order by HB_HKEEPORDER(<hAction>, .T. ) before
    adding its items you can define strict message numbers (DISPIDs), i.e.:
       hAction := {=>}
       HB_HKEEPORDER( hAction, .T. )
       hAction[ "OPEN" ]  := @myole_open()     // DISPID=1
       hAction[ "CLOSE" ] := @myole_close()    // DISPID=2
       hAction[ "SAVE" ]  := @myole_save()     // DISPID=3
       hAction[ "LOAD" ]  := @myole_load()     // DISPID=4
       hAction[ "PRINT" ] := @myole_print()    // DISPID=5
    (see example in olesrv2.prg)

best regards,
Przemek
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour


_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to