Hi Gavin,

I'm sorry for that non-descriptive piece of code, but
it stems from not wanting to "clog up" the mail with
code....

So here comes the whole version then.
I've left in everything that has to do with the DB
that I want to create, including packing and
unpacking.
If some [non DB] variables are undeclared it's because
I've deleted the rest of the code, but I might have
left some vars unintentionally.


The code then (hopefully I don't overdo it this
time...):
----------------------------------------------------
#define DO_NOT_ALLOW_ACCESS_TO_INTERNALS_OF_STRUCTS
#include <BuildDefines.h>
#ifdef DEBUG_BUILD
#define ERROR_CHECK_LEVEL ERROR_CHECK_FULL
#endif
#include <PalmOS.h>
#include <MemoryMgr.h>
#include "Forms.h"
#include "MyUtils.h"

DmOpenRef db = NULL;

typedef struct myStruct
{
  UInt16 index;
  UInt8 id;
  Char *name, *address, *mail;
} MyStruct;

typedef struct myStructP
{
  UInt16 index;
  UInt8 id;
  Char name[1];
} MyStructP;


static void getMyStructRec(MyStruct *myStruct, const
MyStructP *msPacked)
{
  Char *s = msPacked->name;
  myStruct->id = msPacked->id;
  myStruct->index = msPacked->index;
  myStruct->name = s;
  s += StrLen(s) + 1;
  myStruct->address = s;
  s += StrLen(s) + 1;
  myStruct->mail = s;
}

static void PackMyStruct(MyStruct *ms, MemHandle mem)
{
  MyStruct mySt, *myStPtr, *myStPtr2;
  MemHandle memH, recH;
  MemHandle recH2, oldMemH;
  MemPtr memP;
  UInt16 offset, length;
  Err err;
  Boolean dirty = true;
  Char *txt;

  length = (UInt16)(sizeof(ms->index) + sizeof(ms->id)
+ StrLen(ms->name)+
                      StrLen(ms->address) +
StrLen(ms->mail) + 3);

  if(MemHandleResize(mem, length) == 0)
  {
    myStPtr = (MyStruct *)MemHandleLock(mem);
    offset = 0;
    DmWrite(myStPtr, offset, &ms->index,
sizeof(ms->index));

    offset += OffsetOf(MyStructP, index);
    DmWrite(myStPtr, offset, &ms->id, sizeof(ms->id));

    offset += OffsetOf(MyStructP, id);
    DmStrCopy(myStPtr, offset, ms->name);

    offset += (UInt16)StrLen(ms->name) + 1;
    DmStrCopy(myStPtr, offset, ms->address);

    offset += (UInt16)StrLen(ms->address) + 1;
    DmStrCopy(myStPtr, offset, ms->mail);
    MemHandleUnlock(mem);
  }
}

static UInt8 SetFieldTextFromHandle(UInt16 fieldID,
Char *txt, Boolean redraw)
{
  MemHandle txtH;
        MemHandle       oldTxtH;
        FieldPtr        fldP;
        FormPtr frm;
        frm = FrmGetActiveForm();
        

        txtH = MemHandleNew(StrLen(txt) + 1);
        if(!txtH)
                return NULL;

        StrCopy(MemHandleLock(txtH), txt);

        MemHandleUnlock(txtH);
  

        fldP = FrmGetObjectPtr(frm, FrmGetObjectIndex(frm,
fieldID));
        ErrNonFatalDisplayIf(!fldP, "missing field");
        oldTxtH = (MemHandle)FldGetTextHandle(fldP);

        FldSetTextHandle(fldP, (MemHandle)txtH);
        if (redraw)
                FldDrawField(fldP);

        if (oldTxtH)
                MemHandleFree(oldTxtH);

        return 0;
}

static Err SecondFormInit()
{

    Err err = NULL;
    DmOpenRef ref = NULL;
    ref = DmOpenDatabaseByTypeCreator(DM_TYPE,
DM_CREATOR, dmModeReadWrite);
    if(!ref)
    {
      err = DmGetLastErr();
      if(err == dmErrCantFind)
      {
        err = DmCreateDatabase(0, DM_NAME_CONFIG,
DM_CREATOR, DM_TYPE, false);
      }
      if(err)
        return err;

      ref = DmOpenDatabaseByTypeCreator(DM_TYPE,
DM_CREATOR, dmModeReadWrite);
      if(!ref)
        err = DmGetLastErr();
    }
    db = ref;
    return err;
}

Boolean SecondFormHandleEvent(EventPtr event)
{
  Boolean handled = false;
  FormPtr form;
  FldPtr fldPtr;
  MemHandle memH;
  Err err = 0;
  UInt16 localId;
  DmOpenRef dm;

  switch (event->eType)
  {
    case frmOpenEvent:
      form = FrmGetActiveForm();

      err = SecondFormInit();
      
      FrmDrawForm(form);

      localId = DmFindDatabase(0, DM_NAME_CONFIG);
      
      if(localId != 0)
      {
        DmDatabaseSize(0, localId, &dmSize, NULL,
NULL);
        if(dmSize > 0)
        {
          memH = DmGetRecord(db, 0);
          if(memH)
            getMyStructRec(&ms, MemHandleLock(memH));
    
          SetFieldTextFromHandle(f1, (Char *)ms.name,
true);
          SetFieldTextFromHandle(f2, (Char
*)ms.address, true);
          SetFieldTextFromHandle(f3, (Char *)ms.mail,
true);
        } 
      }

      handled = true;
      break;


    case ctlSelectEvent:
      form = FrmGetActiveForm();
      switch (event->data.ctlSelect.controlID)
      {
        case Btn1Frm1:
          FrmGotoForm(MyForm);
          handled = true;
          break;


          case Btn2Frm1:
            fldPtr =
(FieldPtr)GetObjectFromActiveForm(f1);
            ms.name = FldGetTextPtr(fldPtr);
            fldPtr =
(FieldPtr)GetObjectFromActiveForm(f2);
            ms.address = FldGetTextPtr(fldPtr);
            fldPtr =
(FieldPtr)GetObjectFromActiveForm(f3);
            ms.mail = FldGetTextPtr(fldPtr);
            memH = DmNewRecord(db, &index,
sizeof(MyStructP));
            if(memH)
              PackMyStruct(&ms, memH);

            DmReleaseRecord(db, index, true);
            handled = true;
            break;

      }
      break;


    case frmCloseEvent:
      SecondFormDeinit(FrmGetActiveForm());
      handled = false;
      break;

    default:
      break;
    }

  return handled;
}
---------------------------------------------------


--- Gavin Maxwell <[EMAIL PROTECTED]> wrote:
> Well, that single line of code doesn't help much.
> However I agree the
> crid/type combination isn't likely to appear in a
> fresh POSE session. Why
> not use a tool like RsrcEdit or Insider just to
> confirm that the db really
> doesn't exist. Also where is your db creation code?
> Put a break-point there
> to determine when it is being called...
> 
> I almost positive it's some logic in your code
> that's causing this
> "error"...
> 
> 
> Gavin.

__________________________________________________
Do you Yahoo!?
Faith Hill - Exclusive Performances, Videos & More
http://faith.yahoo.com

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

Reply via email to