Just a shot in the dark here, but perhaps you didn't 
understand the full import of Scott's suggestion.

In effect, he seems to be recommending that you,
at some point in your form's initialization, allocate
separately, for EACH field you will display, a new
chunk of memory, copy into it data from your record
(or from wherever, 'tis up to you), then hand each
form its own separate handle.

Then, clearly, at some time in your form's finalization
code, you would need to go through all of your fields,
recover their data, paste it all back together, and
store it safely away.

As an example, suppose you have a database, each
record of which contains three, concatenated, null-
terminated strings which you will display in three
fields of your form:  (this code off the top of my
head; it may contain typos, etc; MyRecordIndex and
MyFieldId are globals).

void MyFormInit(FormPtr frm, DmOpenRef dbP)
{
        UInt16  index;
        FieldPtr        fld;
        MemHandle       hRec, hFld;
        Char*           pRec, pFld;
        int             i;
        Int16           len;

        hRec = DmQueryRecord(dbP, MyRecordIndex);
        if (!hRec) goto errorExit;
        pRec = MemHandleLock(hRec);
        for (i=0; i<3; i++)
        {
                index = FrmGetObjectIndex(frm, MyFieldId[i]);
                fld = FrmGetObjectPtr(frm, index);
                len = StrLen(pRec) + 1;
                hFld = MemHandleNew(len);
                if (!hFld) goto errorExit;
                pFld = MemHandleLock(hFld);
                StrCopy(pFld, pRec);
                MemHandleUnlock(hFld);
                FldSetTextHandle(fld, hFld);
                pRec += len;
        }
        MemHandleUnlock(hRec);
}

void MyFormExit(FormPtr frm, DmOpenRef dbP)
{
        UInt16  index;
        FieldPtr        fld;
        MemHandle       hRec, hFld;
        Char*           pRec, pFld;
        int             i;
        Int16           len;

        // compute total length
        len = 0;
        for (i=0; i<3; i++)
        {
                index = FrmGetObjectIndex(frm, MyFieldId[i]);
                fld = FrmGetObjectPtr(frm, index);
                pFld = FldGetTextPtr(fld);
                len++;
                if (pFld)
                        len += StrLen(pFld);
        }

        // get a new database chunk & clear it
        hRec = DmNewHandle(dbP, len);
        if (!hRec) goto errorExit;
        pRec = MemHandleLock(hRec);
        DmSet(pRec, 0, len, 0);

        // copy the data into our chunk
        offset = 0;
        for (i=0; i<3; i++)
        {
                index = FrmGetObjectIndex(frm, MyFieldId[i]);
                fld = FrmGetObjectPtr(frm, index);
                pFld = FldGetTextPtr(fld);
                len = 1;
                if (pFld)
                {
                        len += StrLen(pFld);
                        DmWrite(pRec, offset, pFld, len);
                }
                offset += len;
        }

        // attach it to the database
        MemHandleUnlock(hRec);
        if (DmAttachRecord(dbP, MyRecordIndex, hRec, &oldH))
                MemHandleFree(hRec)
        else if (oldH)
                MemHandleFree(oldH);
}

-bob mckenzie

-----Original Message-----
From: George R [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, July 17, 2001 4:41 AM
To: Palm Developer Forum
Subject: Re: FldSetText Question


Thanks guys!

I've been using Scott's method, but in this case I was trying to make my
code as generic as possible. In other words, I'm trying to write code that
will populate each form field with a corresponding database field, without
me knowing before hand that my database field offsets will be. So where I
have fields length and offset hard coded in the program, in reality I'd be
making a call to a function that will read the record and return the
appropriate offset and length at run-time. In fact, I won't even know before
run-time how many records or fields exist in the database. Hence I don't see
how I can stick with Scott's suggestion, even though it's worked very well
for me in the past.

Does anyone have any ideas on how I could use FldSetText to work around the
handle size? From Robert's explanation below, it seems like it's impossible
to do what I'm trying, but maybe there is a way...???

george r.

"Robert McKenzie" <[EMAIL PROTECTED]> wrote in message
news:56732@palm-dev-forum...
>
> Scott's method works fine.
>
> However, let me try to clear up some basic matters about
> FldSetTextHandle vs. FldSetText.
>
> A field deals with its contents without regard to how
> it got them.  That is to say, if you call FldSetTextHandle, it
> will get the size of handle and use that to call FldSetText
> with a zero offset.
>
> i.e.
> FldSetTextHandle(fld, h);
> is equivalent to:
> FldSetText(fld, h, 0, MemHandleSize(h));
>
> A field is designed to allow dynamic changing of its
> text (indeed, that is its main reason for existing).
> It will resize the handle, leaving the area before
> the offset alone and shifting the area after the offset + size
> as needed as the text grows or shrinks.  This can result
> in the handle becoming invalid, so you should always
> fetch it back from the field when you need it again.
>
> Only one field can be active in a form at a time.  You
> can have multiple fields all pointing into the same handle.
> In this case, you should use the load data and save data
> callbacks to insure that everything stays coordinated.
> This is a complicated strategy, but it does work
> (see the address book example's edit view for an implementation).
> The complications involved in this strategy lead many to take
> Scott's approach.  This burns some extra memory, but it
> also works just fine and many consider it to be more
> straightforward.  You pays your money and you takes your chances...
>
> -bob mckenzie
>
> -----Original Message-----
> From: Scott Brooks [mailto:[EMAIL PROTECTED]]
> Sent: Monday, July 16, 2001 6:17 AM
> To: Palm Developer Forum
> Subject: Re: FldSetText Question
>
>
> I just use another variable and fill it with the text I want.
>
> Here, I grap a value I call "pCount":
>
>   UInt16   YOUR_TEXT_LENGTH = 9, YOUR_OFFSET = 4;
>
>   recHandle = DmGetRecord(testDB, CurrentItem);
>   recText = MemHandleLock(recHandle);
>
>   pCountHandle = MemHandleNew(YOUR_TEXT_LENGTH);
>   pCountText = MemHandleLock(pCountHandle);
>
>   // first initiallize it with an array of NULL's
>   MemMove(pCountText, fillerNineLong, YOUR_TEXT_LENGTH);
>   MemMove(pCountText, recText + YOUR_OFFSET, YOUR_TEXT_LENGTH);
>   MemHandleUnlock(pCountHandle);
>   fldIndex = FrmGetObjectIndex(frm, SPECIFIEDField);
>   FldSetTextHandle(FrmGetObjectPtr(frm, fldIndex), pCountHandle);
>
>   MemHandleUnlock(recHandle);
>   DmReleaseRecord(CycleCountDB, CurrentItem, 0);
>
> Regards,
> Scott
>
>
>
> >From: "George R" <[EMAIL PROTECTED]>
> >Reply-To: "Palm Developer Forum" <[EMAIL PROTECTED]>
> >To: "Palm Developer Forum" <[EMAIL PROTECTED]>
> >Subject: FldSetText Question
> >Date: Mon, 16 Jul 2001 08:34:41 -0400
> >
> >I'm trying to use FldSetText to set a handle to a field. My handle is
> >actually a pointer to a record in my database. I want to set portions of
> >the
> >handle that correspond to database fields to different form fields. Thus
I
> >don't want to use FldSetTextHandle. While FldSetText is supposed to allow
> >you to set the number of bytes you wish to set, it doesn't appear to be
> >working right. Has anyone had any experience using FldSetText to set
subset
> >of a handle that's NOT a null terminated string (my database does not use
> >null terminated strings for each field)? When I try it, I get a debug
error
> >saying "Text Block Size smaller than Text", and the field is populated
with
> >more data than I request (eac field hsows data up to the NULL
termination,
> >regardless of the size I send).
> >
> >Also, does FldSetText allow you to edit the field or not? I've read
> >conflicting statements on this, but the latest Palm OS Reference says
> >FldSetText and FldSetTextHandle allow you to edit fields in place.
> >
> >Below are the relevant sections of my code:
> >// totalOffset holds the number of bytes at the ebginning of each record
> >used to store field offset sizes.
> >
> >    record = cursor;
> >    maxColumns = numColumns;
> >    dataRecord = DmQueryRecord (dataDB, record);
> >    precord = (Char*) MemHandleLock (dataRecord);
> >    FrmDrawForm (form);
> >    details = MemHandleNew (MemHandleSize (dataRecord) - totalOffset);
> >    stringT = (Char*) MemHandleLock (details);
> >    StrCopy (stringT, precord + totalOffset);
> >    MemHandleUnlock (dataRecord);
> >    MemHandleUnlock (details);
> >    for (loopIndex = 0; loopIndex < numColumns; loopIndex++)
> >    {
> >     if (loopIndex == 0)
> >     {
> >     offset = 0;
> >     fieldSize = 4;
> >     }
> >     else if (loopIndex == 1)
> >     {
> >      offset = 4;
> >     fieldSize = 9;
> >     }
> >     else
> >     {
> >     offset = 12;
> >     fieldSize = 9;
> >     }
> >     fieldIndex = FrmGetObjectIndex (form, fieldID);
> >     fieldPtr = (FieldType*) FrmGetObjectPtr (form, fieldIndex);
> >     FldSetText (fieldPtr, details, offset, fieldSize);
> >     FldSetUsable (fieldPtr, true);
> >     FldDrawField (fieldPtr);
> >     fieldID++;
> >    }
> >
> >--
> >George R
> >
> >
> >
> >
> >--
> >For information on using the Palm Developer Forums, or to unsubscribe,
> >please see http://www.palmos.com/dev/tech/support/forums/
>
> _________________________________________________________________
> Get your FREE download of MSN Explorer at http://explorer.msn.com
>
>
> --
> For information on using the Palm Developer Forums, or to unsubscribe,
> please see http://www.palmos.com/dev/tech/support/forums/
>
>



-- 
For information on using the Palm Developer Forums, or to unsubscribe,
please see http://www.palmos.com/dev/tech/support/forums/

-- 
For information on using the Palm Developer Forums, or to unsubscribe, please see 
http://www.palmos.com/dev/tech/support/forums/

Reply via email to