Jean-Yves F. Barbier ha scritto:
> Doriano Blengino a écrit :
> .... 
>   
>> About "recover any kind [...] from into a loop", I don't understand. 
>> Perhaps you want to scan all the controls residing on a form - there is 
>> the Controls[] property for that. Or you want to stream out all the 
>>     
>
>   
I am suspecting you are transferring data from and to a database... 
don't know why  I suspect...

May be the following routines can act as a base, if this is your duty.

The first one, load_record(), takes a container and a Result as 
parameters, and fills every control in the container with the 
corresponding data from the current record of Result. In the container, 
relevant controls must be named "edDBxxxx", where "xxxx" is the name of 
the field from database; other controls are ignored.

For every kind of control different code is used, so you can use 
specialized controls, as I did with TDbCalcBox, which is a special 
control of mines.


    ' transfers a record from a result to a page; TRUE if error
    PUBLIC SUB load_record(hCont AS Container, res AS Result) AS Boolean
      DIM obj AS Object

      FOR EACH obj IN hCont.Children
        IF obj.name LIKE "edDB*" THEN
          SELECT Lower(object.Type(obj))
            CASE "textbox", "tdbsimplebox"
            TRY obj.text = res[Mid(obj.name, 5)]

            CASE "tdbcalcbox"
            obj.text = "0"
            TRY obj.text = utils.formatdecimal(res[Mid(obj.name, 5)],
    "#,0", obj.decimals)
           
            CASE "tdbdatebox"
            IF dateformat = "" THEN calculate_dateseparator
            obj.text = ""
            ' TRY obj.text = Format(res[Mid(obj.name, 5)], dateformat)
            TRY obj.text = canonicaldate(Format(res[Mid(obj.name, 5)],
    gb.GeneralDate))

            CASE "checkbox"
            obj.value = FALSE
            IF res[Mid(obj.name, 5)] THEN obj.value = TRUE

            CASE "label"
            obj.text = "?"
            TRY obj.text = res[Mid(obj.name, 5)]

          END SELECT
        ENDIF
      NEXT
      RETURN FALSE

      CATCH
      Message.Error("Errore " & error.Text & " in " & error.Where)
      RETURN TRUE
    END

This is the counterpart of the previous, to write a record out to a 
database.


    ' transfers a record from page to database; TRUE if error
    PUBLIC SUB save_record(hCont AS Container, recmod AS Result) AS Boolean
      DIM obj AS Object
      DIM st AS String

      FOR EACH obj IN hCont.Children
        IF obj.name LIKE "edDB*" THEN
          SELECT Lower(object.Type(obj))
            CASE "textbox", "tdbsimplebox"
            recmod[Mid(obj.name, 5)] = obj.text

            CASE "tdbcalcbox"
            recmod[Mid(obj.name, 5)] = utils.formatted2float(obj.text)

            CASE "tdbdatebox"
            st = canonicaldate(obj.text)
            IF st <> "" THEN recmod[Mid(obj.name, 5)] = Val(st)
           
            CASE "checkbox"
            recmod[Mid(obj.name, 5)] = obj.value

          END SELECT
        ENDIF
      NEXT
      recmod.Update
      RETURN FALSE

      CATCH
      Message.Error("Errore " & error.Text & " in " & error.Where)
      RETURN TRUE
    END

This last one fills a grid, displaying a Result in tabular form.

    ' prepare and fill a grid with data from a result
    ' columns are defined as "dbfield/title!width"
    ' dbfield is the field name in recordset
    ' title is the column title; if absent, same as dbfield
    ' width is the column width. If absent, equally spaced columns are used
    ' example: "id/Unique code!120
    ' columns are modified only if col[0].text is empty
    PUBLIC SUB fill_rec_grid(gvDB AS GridView, Columns AS String, res AS
    result)
      DIM i, k, width AS Integer
      DIM fields AS String[]
      DIM st, title AS String
      DIM managecols AS Boolean

      managecols = TRUE
      IF gvdb.Columns.Count THEN managecols = gvdb.Columns[0].Text = ""

      fields = Split(columns, ",", "", FALSE)
      gvDB.Columns.Count = fields.Count

      FOR i = 0 TO fields.count - 1
        st = fields[i]
        k = InStr(st, "!")
        width = gvdb.Width \ fields.Count   ' default
        IF k THEN
          width = Val(Mid(st, k + 1))
          st = Left(st, k - 1)
        ENDIF
        IF managecols THEN gvdb.Columns[i].Width = width
        k = InStr(st, "/")
        IF k THEN
          title = Mid(st, k + 1)
          st = Left(st, k - 1)
        ELSE
          title = st
        ENDIF
        IF managecols THEN
          gvdb.Columns[i].text = title
          title = Upper(Left(title, 1)) & Mid(title, 2)
        ENDIF
        fields[i] = st
      NEXT
      gvDB.Rows.Count = res.Count

      FOR i = 0 TO res.Count - 1
        res.MoveTo(i)
        FOR k = 0 TO fields.Count - 1
          title = fields[k]
          TRY st = res[title]
          IF NOT ERROR THEN
            width = res.Fields[title].Type
            ' find correct formatting
            SELECT width
              CASE 8
                ' date field
                st = Format(res[title], gb.GeneralDate)
                gvDB[i, k].Text = " " & st

              CASE 7
                ' float - align right
                st = " " & res[title]
                WHILE gvdb.font.Width(st) + 8 < gvdb.Columns[k].Width
                  st = " " & st
                WEND
                gvDB[i, k].Text = Mid(st, 2)

              DEFAULT
                ' normal field
                ' do NOT format! Sometimes text is used as database key
                TRY gvDB[i, k].Text = res[title]
            END SELECT
          ENDIF
        NEXT
      NEXT
    END

If this is not what you needed, simply ignore it - but may be you can 
see something useful.

Regards,

-- 
Doriano Blengino

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


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Gambas-user mailing list
Gambas-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user

Reply via email to