How past this usefull information on harbour doc?
Where?

without this operation
a lot of user can't use assicuative hash array


2010/5/25 Przemysław Czerpak <dru...@acn.waw.pl>

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



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

Reply via email to