[Gambas-user] Dynamic Objects

Rodney Rundstrom iecltd at ...2113...
Wed Apr 1 00:29:00 CEST 2009


Thanks for that I'll work thought over the next few day. One last question
on dynamic object (I think) how do we delete them and release the memory?



-----Original Message-----
From: Doriano Blengino [mailto:doriano.blengino at ...1909...] 
Sent: Tuesday, 31 March 2009 7:13 p.m.
To: mailing list for gambas users
Subject: Re: [Gambas-user] Dynamic Objects

Rodney Rundstrom ha scritto:
> Thanks using last.text works in this case, can you clarify how I would
> access using parent/child can a form itself be the container or my I use
> another although a similar arrangement is available in VB I am not really
> sure how to use it?
>   
The following routine iterates through all the controls inside a given 
container, recursively (included other containers), and returns its 
children one after another.

    ' Returns the i-th children of hContainer, recursively
    PUBLIC SUB ith_children_of(hContainer AS Container, i AS Integer) AS
    Object
      DIM hScan AS Object
      DIM hResult AS Object
      DIM counted AS Integer

      counted = 0
      FOR EACH hScan IN hContainer.Children
        INC counted
        DEC i
        IF i = 0 THEN RETURN hScan
        IF hScan IS Container THEN
          ' traverse it
          hResult = ith_children_of(hScan, i)
          IF hResult THEN RETURN hResult  ' function found the control
          ' function exhausted controls, but how many?
          counted += ith_controls_counted
          i -= ith_controls_counted
        ENDIF
      NEXT
      ith_controls_counted = counted
    END

In one of my apps, I use it to fill TextBoxes associating ldap field 
names to textboxes names. It is slightly more complicated than 
necessary, but it shows what is possible to do. You can pass a form as 
first parameter, which is indeed a container:

      DIM hScan AS Object
      DIM i AS Integer

      i = 0
      DO
        INC i
        hScan = ith_children_of(ME, i)
        IF NOT hScan THEN BREAK

        IF aname = "lDn" THEN hScan.text = dn

        IF object.Type(hScan) = "TextBox" OR object.Type(hScan) =
    "TextArea" THEN
          hScan.text = ""   ' default
        ELSE IF object.Type(hScan) = "Button" THEN
          IF db_is_readonly AND hScan.name = "btModify" THEN
    hScan.Visible = FALSE
          IF db_is_readonly AND hScan.name = "btDelete" THEN
    hScan.Visible = FALSE
        ENDIF
      LOOP


Here you see: I scan all the container (ME, the form where the 
subroutine resides), then I do several things depending on what I've got.
You can test for the class of the object, or its name. A useful thing to 
test for is TAG, where you can store data serving no other purposes than 
your ones.

As I said before, there is no need of such complication, I took it 
simply to show the variety of things. If you have a bunch of dynamically 
created controls scattered in a form, you can set the .Tag or .Name on 
each of them at the time of instanciation, and then use these kinds of 
routine. But if you put them all inside a single container, then you 
access them with

    for each hScan in hManyButtonsHbox.Children
      hScan.Enabled = false   ' all the children of this hBox are disabled
    next

The more effective way is to keep an array of handles when creating the 
controls, thought. I showed all this complication because you asked me 
about containers and childrens, but sometimes, especially in complex 
form, to operate this way saves time and errors.

Regards,

-- 
Doriano Blengino

"Listen twice before you speak.
This is why we have two ears, but only one mouth."


----------------------------------------------------------------------------
--
_______________________________________________
Gambas-user mailing list
Gambas-user at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user





More information about the User mailing list