AutoHotkey Community

It is currently May 27th, 2012, 1:52 am

All times are UTC [ DST ]




Post new topic This topic is locked, you cannot edit posts or make further replies.  [ 1036 posts ]  Go to page Previous  1 ... 18, 19, 20, 21, 22, 23, 24 ... 70  Next
Author Message
PostPosted: December 28th, 2009, 12:25 pm 
Offline

Joined: October 17th, 2006, 4:15 pm
Posts: 7503
Location: Australia
tinku99 wrote:
Why wouldn't you just use ptr, instead of retrieving it with _GetAddress over and over again?
Its address changes whenever its capacity is changed. I think it would mostly defeat the point of using the field itself for storage. May as well just allocate memory like I was suggesting earlier. If you want to say .dataPointer instead of ._GetAddress("data"), you could do this:
Code:
obj := Object("base", Object("__get", "obj_Get"))
...
obj_Get(obj, field) {
    if SubStr(field,-6) = "Pointer"
        return obj._GetAddress(SubStr(field,1,-7))
}

I wrote:
However, this could all be implemented generically in script ...
Update: this has been implemented generically in script.
BinObject


Report this post
Top
 Profile  
Reply with quote  
 Post subject: default_set
PostPosted: January 2nd, 2010, 7:16 am 
Offline

Joined: August 3rd, 2007, 8:01 am
Posts: 555
Location: Houston, TX
Lexikos,
Is there a reason this is not default behavior:
Code:
"".base.__Set  := "Default__Set"
"".base.__Get  := "Default__Get"
Default__Set(ByRef nonobj, p1="", p2="")
{
  nonobj := Object()
  nonobj[p1] := p2
}

Default__Get(nonobj, p1="", p2="", p3="", p4="")
{
    ListLines
    MsgBox A non-object: %nonobj% was invoked.
}

Do you anticipate any problems if I routinely include this in my scripts?

Also, do you plan to implement: push(), pop(), find(), and friends for objects? Some of this has been done in script by temp01. But these basic things are probably worth implementing in c.


Report this post
Top
 Profile  
Reply with quote  
 Post subject: Re: default_set
PostPosted: January 2nd, 2010, 11:01 am 
Offline

Joined: October 17th, 2006, 4:15 pm
Posts: 7503
Location: Australia
tinku99 wrote:
Is there a reason this is not default behavior:
Those two ideas conflict. What happens if code first tries to set a field of the object, expecting it to already exist, then retrieves that or some other field? You'll never get the warning, and if the code wasn't intended to initialize the object it will be more difficult to track down the problem. If an object is expected to have custom methods like push() or pop() but is automatically initialized without them by erroneous code, it'll add further confusion.
Quote:
Also, do you plan to implement: push(), pop(), find(), and friends for objects?
My goal was never to provide comprehensive built-in object API's, but to implement the minimum to let script authors easily do it. I do however plan to implement Next/Prev for enumerating fields (see here or here) and make some other slight changes/improvements to the built-in methods.

Functionality equivalent to push/pop can be easily written like so:
Code:
; push
obj._Insert(1, value)
; pop - now
value := obj[1], obj._Remove(1)
; pop - future
value := obj._Remove(1)
Inserting and removing at the lowest index is slower, but since calling _MaxIndex (or any method) in script incurs overhead, this method performs about the same until there are over 100 or so items. This might change if/when I replace the built-in methods with built-in functions (which have less overhead, but might appear less intuitive).

I had considered making _Insert/_Remove equivalent to push/pop (at the highest index) when the key is omitted, but decided it wouldn't necessarily be intuitive. On the other hand, if ObjInsert(obj,value) and ObjRemove(obj) served as push/pop, scripts could do this:
Code:
obj.base["push"] := "ObjInsert"
obj.base["pop"] := "ObjRemove"
;...
obj.push(value)
value := obj.pop()
obj.push(index, value)  ; not so intuitive ;)
The idea is that if they are built-in functions, object developers can do things like redefining _Insert without losing the original functionality, or use the functions on objects which would otherwise override the built-in methods (such as COM_L/U objects).

Actually, I didn't want to introduce more functions/methods with virtually the same purpose. For instance, obj._Remove(x) would be more useful if it returned the previous value of obj[x], then obj._Pop() would be no different to obj._Remove(obj._MaxIndex()) or similar. However, it might be worth doing - if only so that scripts using them will be easier to understand. (It can be done/has been done in script, but you might be right about it being worth implementing natively.)

Last ranted by Lexikos on Sat Jan 02, 2009 8:00 pm; edited 101 times in total


Report this post
Top
 Profile  
Reply with quote  
 Post subject: rectangular arrays
PostPosted: January 2nd, 2010, 6:00 pm 
Offline

Joined: August 3rd, 2007, 8:01 am
Posts: 555
Location: Houston, TX
tinku99 wrote:
Code:
"".base.__Set  := "Default__Set"
"".base.__Get  := "Default__Get"
Default__Set(ByRef nonobj, p1="", p2="")
{
  nonobj := Object()
  nonobj[p1] := p2
}

Default__Get(nonobj, p1="", p2="", p3="", p4="")
{
    ListLines
    MsgBox A non-object: %nonobj% was invoked.
}

Lexikos wrote:
1. What happens if code first tries to set a field of the object, expecting it to already exist, then retrieves that or some other field? You'll never get the warning, and if the code wasn't intended to initialize the object it will be more difficult to track down the problem.
2. If an object is expected to have custom methods like push() or pop() but is automatically initialized without them by erroneous code, it'll add further confusion.

1. That is consistent with the the old ways of ahk, but I do like the way that the error checking is now possible and optional.
2. I wonder if you define a new type such as binobject, you could also define a meta function: binobject.is(UFO) that checks if the metafunctions match.
3. But I don't see a necessary conflict, just replacement of some error checking, which is fine as the behavior is set in script and can be changed between debug builds and production builds of your scripts...
4. The problem with the current way is that if nonobj is not initalized, the following fails silently:
nonobj.member := "hello" ;
Anyway, I am happy with my script solution, adapted from your documentation.

Lexikos wrote:
Functionality equivalent to push/pop can be easily written like so:
Code:
; push
obj._Insert(1, value)
; pop - now
value := obj[1], obj._Remove(1)
; pop - future
value := obj._Remove(1)
Inserting and removing at the lowest index is slower, but since calling _MaxIndex (or any method) in script incurs overhead, this method performs about the same until there are over 100 or so items.
.... obj._Remove(x) would be more useful if it returned the previous value of obj[x], then obj._Pop() would be no different to obj._Remove(obj._MaxIndex()) or similar. Last ranted by Lexikos on Sat Jan 02, 2009 8:00 pm; edited 101 times in total
Thanks for the nice analysis of the situation. Edited 101 times really?

Lexikos wrote:
My goal was never to provide comprehensive built-in object API's, but to implement the minimum to let script authors easily do it.
You're going to find yourself atleast implementing list processing functionality, otherwise objects will remain even less efficient than lisp. For example Fasto reimplemented my ahksearch using objects, but reported "consumes a lot of resources".

One thing that might help is special treatment for multidimensional rectangular objects. I have not seen any examples for usage of Object._SetCapacity(new_capacity). What is the default size of the individual elements? ie:
how many elements can you store if capacity is 256? Is it 4 ? The default capacity of variables in ahk is normally 63...

LowLevel had allowed access to the var interface, but I also liked access to var contents with the native &var. On the contrary, with objects, we don't have access to contents, and &object gives access to the interface...

How about a metafunction object._ascontiguousarray, that goes along with
Object._SetCapacity(element_size, number_of_elements).


Report this post
Top
 Profile  
Reply with quote  
 Post subject: object mFields array
PostPosted: January 3rd, 2010, 2:29 am 
Offline

Joined: August 3rd, 2007, 8:01 am
Posts: 555
Location: Houston, TX
On a second read, I can get my head around the source code a little better...

Lexikos,
What do you think about splitting up the Object::FieldType structure into 2 or more parallel arrays, so the keytype, keys, and values can be kept in separate arrays ?

get and assign don't need to become more complicated as the index of key and its corresponding value will be the same, although in different arrays.


Report this post
Top
 Profile  
Reply with quote  
 Post subject: Re: rectangular arrays
PostPosted: January 3rd, 2010, 4:15 am 
Offline

Joined: October 17th, 2006, 4:15 pm
Posts: 7503
Location: Australia
tinku99 wrote:
1. That is consistent with the the old ways of ahk,
I disagree. Think of it like NumPut or some DllCalls, which won't work if the variable hasn't been initialized in some way.
Quote:
2. I wonder if you define a new type such as binobject, you could also define a meta function: binobject.is(UFO) that checks if the metafunctions match.
Why would a new type need to be defined to build-in that functionality? Why not merely compare them yourself, in script? Why compare them at all?
Quote:
3. But I don't see a necessary conflict,
You cannot catch all such errors and automatically initialize objects in variables. I stand by my use of words. Anyway, you asked why it wasn't the default behaviour, and I answered. It's your choice to use it or not; in fact, that's why I implemented the "default base" feature, and obviously the reason I put those examples in the documentation.
Quote:
4. The problem with the current way is that if nonobj is not initalized, the following fails silently:
What problem? This is consistent with "the old ways of ahk;" at least for expressions. Take (var+=1) for instance.
Quote:
You're going to find yourself atleast implementing list processing functionality,
Speak for yourself.
Quote:
otherwise objects will remain even less efficient than lisp.
I'm always skeptical about apparently baseless claims of performance. I'd ask you to show some facts, but to be honest I'm not interested.
Quote:
For example Fasto reimplemented my ahksearch using objects, but reported "consumes a lot of resources".
I'm certain that fasto wasn't referring to speed. Notice the SQLite example; which is "a bit slower".
Quote:
One thing that might help is special treatment for multidimensional rectangular objects.
I chose the current implementation because it is simple, useful and works for all types of keys. I see no specific need to optimize it soon, if ever. Anyway, it has nothing to do with efficiency of objects in general, so I don't see how this "one thing" "might help".
Quote:
how many elements can you store if capacity is 256? Is it 4 ?
If you set the capacity to 256, you can store up to 256 "elements" before the capacity must be increased. Objects hold key-value pairs, not characters or bytes.
Quote:
Object._SetCapacity(new_capacity): Adjusts the maximum number of key-value pairs the object can contain before it must be automatically expanded.
Source: AutoHotkey_L - Objects
FYI, individual key-value pairs (elements) are currently 16 bytes. String keys and values are allocated separately, as necessary. If _SetCapacity is not used, the capacity of an object begins at 4 (on first assignment) and doubles when a higher capacity is needed. This is all subject to change.
Quote:
The default capacity of variables in ahk is normally 63...
Variable capacity is measured in characters, and in fact, you're wrong.
Code:
Loop 2 {
    MsgBox % VarSetCapacity(v := 1) ; Pure integer, no string.
    t := v "" ; Causes a string to be cached, note not assigning to v!
    ;v .= "" ; Convert it to a string.
    MsgBox % VarSetCapacity(v) ; String with cached integer.
    MsgBox % VarSetCapacity(v .= "111") ; 4 chars
    MsgBox % VarSetCapacity(v .= "1111") ; 8 chars
    VarSetCapacity(v,64),VarSetCapacity(v,0) ; First iteration: discard persistent mem.
}
; In v1.0.48.05, the output is: 0, 3, 7, 63; 0, 15, 15, 15
Quote:
On the contrary, with objects, we don't have access to contents, and &object gives access to the interface...
Where do you think the interface is, if not in the Object? In fact, &object is currently both the address of the Object and the address of its IObject interface. I had not mentioned this as it is obscure and the structure is more likely to change than Var, Line, Func, etc. If there is really a need to access it directly, a built-in feature of some sort should be implemented to alleviate it. (Then again, maybe allowing it will allow scripts to "prototype" useful features.)
Code:
x := Object()
MsgBox % "vftable: " NumGet(&x)     ; hidden virtual function table
    . "`nmRefCount: " NumGet(&x,4)  ; inherited from ObjectBase
    . "`nmBase: " NumGet(&x,8)      ; first field defined in Object
Quote:
How about a metafunction object._ascontiguousarray,
Why?
Quote:
Object._SetCapacity(element_size, number_of_elements).
There would be no benefit in allowing scripts to specify the size of an element, as it is not something that can change/be changed at run-time, and it shouldn't be relevant to scripts.
Quote:
... so the keytype, keys, and values can be kept in separate arrays ?
Why?
Quote:
get and assign don't need to become more complicated
They don't need to become more complicated; I can I leave them the way they are. If you're trying to say that splitting the keys and values won't complicate the code, I disagree.
Quote:
Edited 101 times really?
Oh yes, really. :roll:


Report this post
Top
 Profile  
Reply with quote  
 Post subject: Re: rectangular arrays
PostPosted: January 3rd, 2010, 7:22 am 
Offline

Joined: August 3rd, 2007, 8:01 am
Posts: 555
Location: Houston, TX
> Think of it like NumPut or some DllCalls, which won't work if the variable hasn't been initialized in some way.
ok.

> key-value pairs (elements) are currently 16 bytes.
> &obj + 8 -> pointer to first field
Thanks.
Quote:
Quote:
How about a metafunction object._ascontiguousarray,
Why?
Quote:
so the keytype, keys, and values can be kept in separate arrays ?
Why?

If the values were in their own array, they would already be contiguous.
contiguous arrays are easier to pass around (to disk, to foreign functions in dllcall). This is particularly useful in numerical, graphical computing. But I guess for those purposes its already a waste to make an obj.element out of every pixel or every matrix entry. I think binobject is sufficient, so never mind.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 3rd, 2010, 9:12 am 
Offline

Joined: October 17th, 2006, 4:15 pm
Posts: 7503
Location: Australia
They already are in a contigous array; it just includes more than simple untyped/statically typed values. What reason is there to (re)move the keys? I doubt it can outweigh the benefit of being able to treat each key-value pair as a single unit (FieldType).
Quote:
contiguous arrays are easier to pass around
Funny you should say that. One contiguous array of fields is easier to deal with than two contiguous arrays; one of keys and one of values.
Quote:
(to disk, to foreign functions in dllcall)
Writing to disk, you would need to check each field for a separately allocated string, deal with objects, etc. It would also include the symbol (type of value). Passing to foreign functions is no easier either; you still have the symbol, have to handle different types of values in the array, etc.

Btw, you said before "keytype, keys, and values", but key-type is not stored in the array. Only the key, value and type of value are stored. To save space, the type of key is implied by the field's position in the array and the object's mKeyOffset* fields.
Quote:
This is particularly useful in numerical, graphical computing.
I imagine in such a case, you would want to use a (less) specialized data structure, without any keys and with only a single value type (so no need to store the type of value).


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 6th, 2010, 11:20 pm 
Offline

Joined: June 8th, 2006, 9:38 pm
Posts: 307
In the Debug example from the documentation, the warning gets triggered by assigningments for Set and Call, but simply re-ordering the meta-function assignments fixes it:

Code:
; was get, set, call

"".base.__Call := "Default__Warn"
"".base.__Set  := "Default__Warn"
"".base.__Get  := "Default__Warn"

Default__Warn(nonobj, p1="", p2="", p3="", p4="")
{
    ListLines
    MsgBox A non-object value was improperly invoked.`n`nSpecifically: %nonobj%
}


Btw, thanks for OO features - love it.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 7th, 2010, 9:03 am 
Offline

Joined: October 17th, 2006, 4:15 pm
Posts: 7503
Location: Australia
Thanks, I've changed the example (for the next release). There are a few more ways it can be written:
Code:
; __Set must be set last in this example:
""["base","__Get"]  := "Default__Warn"
""["base","__Call"] := "Default__Warn"
""["base","__Set"]  := "Default__Warn"

; As of L36, this is equivalent to the above:
"".base["__Get"]  := "Default__Warn"
"".base["__Call"] := "Default__Warn"
"".base["__Set"]  := "Default__Warn"

; Order is not important as all are set after "".base is used:
b:="".base, b.__Call:= b.__Set:= b.__Get:= "Default__Warn", b:=""

Roland wrote:
In the Debug example from the documentation, the warning gets triggered by assigningments for Set and Call,
Actually, "".base triggers __get, not the assignment. Additionally, Object(...).base ordinarily triggers __get as base is built-in, not usually a key stored in the object. However, in the example below x.bass triggers __get but x.base does not:
Code:
x := Object("base", Object("__Get", "Getter"))
x._Insert("base", "obscured")
MsgBox % "x.base = " x.base "`nx.bass = " x.bass
Getter() {
    return "nothing there"
}


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 23rd, 2010, 2:43 pm 
Offline
User avatar

Joined: May 10th, 2007, 10:54 am
Posts: 649
Location: .switzerland
First, I really like this OO stuff - and worked a bit with it. Thanks Lexicos.


hope this wasn't asked before:

Is it possible, to get a event, when a property from an object is changed? As I understand, its only possible to catch the creation of a key-value pair with the "__set" event, but not the changes (if a existing key is updated).


For example: I have a "thumb" class, wich contains all infromation of a bmp - also, there is a function in this thumb class, who can build the bmp:

Code:
;class othumb

othumb.name      := ""

;img
othumb.imgpath      := ""
othumb.imgoffx      := 5            ; offset des bildes im thumb
othumb.imgoffy      := 5
othumb.imgwith      := 100
othumb.imgheight   := 100


othumb.with      := 150
othumb.height   := 110
othumb.pbitmap   := 0
othumb.bakcolor   := 0xAAC0C0C0       

othumb.createbmp   := "othumb_createbmp"


/********************************************
Build a new bmp with the given Object propertys

********************************************
*/
othumb_createbmp(_otb){
   
   Gdip_DisposeImage(_otb.pbitmap)
   _otb.pbitmap   := Gdip_CreateBitmap(_otb.with, _otb.height)
   Gtmp          := Gdip_GraphicsFromImage(_otb.pbitmap)
   
   ;Bkg zeichnen
   pBrush   :=   Gdip_BrushCreateSolid(_otb.bakcolor)
   Gdip_FillRoundedRectangle(Gtmp, pBrush, 0, 0, _otb.with, _otb.height, 10)
   
   ;img zeichnen
   pbmpImg         :=  Gdip_CreateBitmapFromFile(_otb.imgpath)
   Gdip_DrawImage(Gtmp,pbmpImg,_otb.imgoffx,_otb.imgoffy,_otb.imgwith,_otb.imgheight,0,0,Gdip_GetImageWidth(pbmpImg), Gdip_GetImageHeight(pbmpImg))
   
   ; delete
   Gdip_DisposeImage(pbmpImg), Gdip_DeleteBrush(pBrush), Gdip_DeleteGraphics(Gtmp)
}


Ok, thats the "class" (in fact, the base object). Using example:

Code:
mythumb         := object("base",othumb)

mythumb.name   := "test"
mythumb.imgpath   := "C:\myPic.gif"
mythumb.createbmp() ;build bmp

;..... later there will be some changes in this thumb:

mythumb.bakcolor := 0xFF00FF00
mythumb.createbmp()   ;build bmp


That works so far - but, it would be much nicer, if the createbmp() func would be automatically called, if something in the color or imgpath property changes.


I tried to use the standard __set and __get events with a trick to bypass the creation of the real key-value pair:
Code:
obase := Object("__Set","obase_Set","__Get","obase_Get")
;-----------------------------------------------------------------------------
obase_Set(obj, name, val){

    If(!(name == "cbSet")){
        If(!((substr(name,1,2) == "__"))){
            ;call callback function
            If(IsFunc(obj.cbset)){  ; is a cb func defined?
                cb  := obj.cbset
                execute := %cb%(obj,name,val)
            }
            If(execute){
                obj["__" . name] := val
                return val
            }else{
                return obj["__" . name] := obj["__" . name]    ;das alte so lassen
            }
        }
    }   
}

obase_Get(obj, name){
    return obj["__" . name]
}
;----------------------------------------------------------------------------

With the example above it works - because I dont set the real key-value pair - instead I set a second one with the "__" prefix.
If this above is used as base, the following line:
Code:
object.name  := "test"

doesnt store "test" in the key "name", it stores it in:
Code:
object.__name  := "test"


And the same thing is done, when using get:
Code:
msgbox % object.name

This doesnt retrive "name", instead it retrives the "__name" key.
But thats a nasty trick - how can this be done better?

Hope someone can help


Edit:
If someone wonder, what that thumb stuff should be: here my testing with a oo ThumbnailViewer: http://dl.securityvision.ch/ahk/thumbnail/thumbs.zip

_________________
http://securityvision.ch
AHK 2D GAME ENGINE


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 23rd, 2010, 4:08 pm 
Offline

Joined: June 8th, 2006, 9:38 pm
Posts: 307
You could wrap your object into another object, and define meta-functions for the wrapping object. Then the set meta function can both update the wrapped object and do other stuff. Perhaps that's a bit cleaner than your current solution.

Haven't tested this heavily, but something like this I imagine will work:

Code:
#NoEnv
#SingleInstance force

base:=Object("__Set", "Bitmap__Set", "__Get", "Bitmap__Get")  ; base with meta-functions
data:=Object("name", "test", "path", "C:\myPic.gif")          ; actual bitmap data
bitmap:=Object("data", data, "base", base)                    ; the container
return

f1::bitmap.path:="C:\anotherPic.gif"    ; test set operation...

Bitmap__Set(this, key, value) {
this.data[key]:=value               ; update data
Bitmap_createBitmap(this)           ; do something...
return value
}

Bitmap__Get(this, key) {
return this.data[key]
}

Bitmap_createBitmap(this) {
; note that if you need to set a key in this method,
; you have to access it directly, i.e. "this.data.name:=..."
; instead of "this.name:=..."
this.data.name:=this.name " (updated)"
msgbox % "name: " this.name "`npath: " this.path
}


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 24th, 2010, 6:18 am 
Offline

Joined: October 17th, 2006, 4:15 pm
Posts: 7503
Location: Australia
I had a simple technique in mind for defining "accessor" functions, but unfortunately it doesn't work as intended in the current version. I'll update soon with a fix, after I push some other updates out.

The technique looks like this:
Code:
MetaProps() {
    static base
    return Object("base", base ? base : base:=Object("__Call","MetaProps_"))
}

MetaProps_(props, obj, name, param="#gEt#") {
    if IsFunc(prop := props[name])
        return %prop%(obj, param)
}
Example usage (hackfix() lets it work in the current version):
Code:
ThumbType := Object()
ThumbType.__Set := MetaProps()
; Set up Width accessor:
ThumbType.__Set["Width"] := "Thumb_Width"
; To define separate Get/Set functions, or to implement read-only or
; write-only properties, use two separate MetaProps() objects. Since
; we don't need that functionality, we'll reuse the same object:
ThumbType.__Get := ThumbType.__Set

Thumb_Width(otb, value)
{
    if (value == "#gEt#")
        ; Retrieve real value from internal field.
        return otb._width
    ; Implement custom behaviour: fail if invalid, round to integer.
    if value is not number
        return ""
    value := Round(value)
    ; Set internal field and return new value.
    return otb._width := value
}

thumb := Object("base", ThumbType)
thumb.Width := 1        ; set to 1
  hackfix(thumb)
MsgBox % thumb.Width
thumb.Width := 1.9      ; set to 2
  hackfix(thumb)
MsgBox % thumb.Width
thumb.Width := "foo"    ; fail, leave as is
  hackfix(thumb)
MsgBox % thumb.Width

hackfix(otb)
{   ; Current version of AHKL does not recognize the use of 'return'
    ; in meta-function-objects such as MetaProps().  To demonstrate how
    ; it will work when this is fixed, we _remove the redundant field:
    otb._Remove("Width")
}
The idea is that instead of writing meta-functions with big If..Else If ladders (determining which property is being accessed), you simply define which properties correspond to functions.

Note: Meta-functions are designed not to be invoked if the key-value pair already exists, since to do otherwise would require the __Get or __Set fields to be looked up every time any field in the object is accessed, if that object has a base. "Inheritence" would also be more complicated to implement.


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 24th, 2010, 1:14 pm 
Offline
User avatar

Joined: May 10th, 2007, 10:54 am
Posts: 649
Location: .switzerland
Thanks for your replys.
Quote:
Note: Meta-functions are designed not to be invoked if the key-value pair already exists, since to do otherwise would require the __Get or __Set fields to be looked up every time any field in the object is accessed, if that object has a base. "Inheritence" would also be more complicated to implement.

I understand - so this would be bad for the performance. The accessor technique sounds very usable, so I'm looking forward to the next update.

_________________
http://securityvision.ch
AHK 2D GAME ENGINE


Report this post
Top
 Profile  
Reply with quote  
 Post subject:
PostPosted: January 27th, 2010, 2:36 pm 
Offline

Joined: May 24th, 2006, 2:49 pm
Posts: 4511
Location: Belgrade
Hello.

What are your plans on xdc. ?

_________________
Image


Report this post
Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic This topic is locked, you cannot edit posts or make further replies.  [ 1036 posts ]  Go to page Previous  1 ... 18, 19, 20, 21, 22, 23, 24 ... 70  Next

All times are UTC [ DST ]


Who is online

Users browsing this forum: No registered users and 1 guest


You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Powered by phpBB® Forum Software © phpBB Group