Ok! Let's see if I can explain myself. I put some Pascal code to C, but I have some problems when using an offset value, because i don't know very well how to use pointers....

===>In pascal I have a struct like this:
type
TEmptyRecord = record
Rating : UInt16; // is beeing use to draw a bitmap, but i don't need it...
Name : PChar;
Notes : PChar;
end;


In C I put like this (note that there are more attributes...but this is not important right now...)
typedef struct DBRecord
{
char NumPat[10];
char Unidade[36];
char Responsavel[20];
char Data[10];
} DBRecord;
static DBRecord record;
typedef DBRecord* DBRecordPtr;


==>Now, after initialize a Table.... a use a drawback function to draw ( :) )
.........
// Set the callback routines to draw the cells
TblSetCustomDrawProcedure(Table,NameColumn,DrawRecord);
TblSetCustomDrawProcedure(Table,RatingColumn,DrawRecord);


(PASCAL)
procedure DrawRecord(Table : Pointer;Row,Column : Int16;
                    var Bounds : RectangleType);
 var
   BitmapHandle : MemHandle;
   Bitmap       : BitmapPtr;
   RecordNumber : Integer;
   RecordHandle : MemHandle;
   RecordPtr    : PChar;
   Rating       : UInt16;
   i            : UInt16;
begin
 RecordNumber := TblGetRowID(Table,Row);
 // Look at record without marking it as busy
 RecordHandle := DmQueryRecord(BeerDb,RecordNumber);
 RecordPtr    := MemHandleLock(RecordHandle);

case Column of
NameColumn : WinDrawTruncChars(@RecordPtr[SizeOf(UInt16)], <==============
StrLen(@RecordPtr[SizeOf(UInt16)]), <==============
Bounds.TopLeft.x,Bounds.TopLeft.y, <==============
TblGetColumnWidth(Table,NameColumn));
........
............
MemHandleUnlock(BitmapHandle);
DmReleaseResource(BitmapHandle);
end;
end;


 MemHandleUnlock(RecordHandle);
end;

(in C)
void DrawRecord(void *table, Int16 row, Int16 Column, RectangleType *bounds)
{
UInt16 RecordNumber;
MemHandle RecordHandle;
DBRecordPtr RecordPtr;
RecordNumber = TblGetRowID((TablePtr) table, row);


 // Look at record without marking it as busy
 RecordHandle = DmQueryRecord(db, RecordNumber);
 RecordPtr =  (DBRecordPtr) MemHandleLock(RecordHandle);

switch (Column)
{
case 0: //NumPatColumn
WinDrawTruncChars( RecordPtr->NumPat, StrLen( RecordPtr->NumPat),bounds->topLeft.x,bounds->topLeft.y,TblGetColumnWidth((TablePtr)table, NumPatColumn)); <========================
// RecordPtr->NumPat
break;
case 1:
......................
......................
}


 MemHandleUnlock(RecordHandle);
}

====>Now there is a function that uses Memset, I think that this function is ok, as when it is called, I can see that a new record appears, but without any information, as it is written with another function....
(PASCAL)
procedure AddRecord;
var
RecordIndex : UInt16;
EmptyRecord : TEmptyRecord;
RecordPtr : Pointer;
begin
// Normally would want to sort the database somehow, and allow deleted and
// archived records, in which case this technique is dangerous
RecordIndex := dmMaxRecordIndex;
CurrRecHandle := DmNewRecord(BeerDb,RecordIndex,SizeOf(EmptyRecord));


 if CurrRecHandle = nil then begin
   FrmCustomAlert(ErrorAlert,'Can''t create a new record','','');
   Exit;
 end;

 // Initialize the new record
 RecordPtr := MemHandleLock(CurrRecHandle);
 // Set contents of empty record to all zeroes
 MemSet(@EmptyRecord,SizeOf(EmptyRecord),0);
 // Write empty record to start of record - cannot have zero length records
 DmWrite(RecordPtr,0,@EmptyRecord,SizeOf(EmptyRecord));
 MemHandleUnlock(CurrRecHandle);

 // Using temporary variable in case of failure to create a record
 CurrRecNumber := RecordIndex;

 // Load the editing form
 FrmGotoForm(BeerTasterEditForm);
end;

(In C)
void AddRecord()
{
 UInt16 RecordIndex;
 DBRecord EmptyRecord; //????????????
 DBRecordPtr  RecordPtr;

 // Normally would want to sort the database somehow, and allow deleted and
 // archived records, in which case this technique is dangerous
 RecordIndex = dmMaxRecordIndex;
 CurrRecHandle = DmNewRecord(db, &RecordIndex, sizeof(DBRecord));
 if (CurrRecHandle == NULL)
 {
   FrmCustomAlert(ErrorAlert, "Can't create a new record", "", "");
   return;
 }
 // Initialize the new record
 RecordPtr = (DBRecordPtr) MemHandleLock(CurrRecHandle);
  // Set contents of empty record to all zeroes
 MemSet(&EmptyRecord, sizeof(DBRecord), 0);
 // Write empty record to start of record - cannot have zero length records
 DmWrite(RecordPtr, 0, &EmptyRecord, sizeof(DBRecord));
 MemHandleUnlock(CurrRecHandle);
 // Using temporary variable in case of failure to create a record
 CurrRecNumber = RecordIndex;
 // Load the editing form
 FrmGotoForm(InfoRecordForm);
}

====> Now, i use a function to insert values in the record. The problem is when I use offset values...
(PASCAL)
procedure SaveRecord;
var
NameFieldPtr : FieldPtr;
NotesFieldPtr : FieldPtr;
Offset : UInt16;
begin
// Find field objects
NameFieldPtr := GetObjectPtr(BeerTasterEditNameField);
NotesFieldPtr := GetObjectPtr(BeerTasterEditNotesField);


 // Resize record to hold new data
 CurrRecHandle := DmResizeRecord(BeerDb,CurrRecNumber,
                                 SizeOf(Uint16) +
                                 GetFieldLength(NameFieldPtr) +
                                 GetFieldLength(NotesFieldPtr));

 // Write data to record
 Offset := 0;
 SaveGroupSelection(RatingGroup,Offset);
 SaveFieldValue(NameFieldPtr,Offset);
 SaveFieldValue(NotesFieldPtr,Offset);

 // Not setting dirty bit as not worrying about HotSyncs
 DmReleaseRecord(BeerDb,CurrRecNumber,False);
 CurrRecHandle := nil;
end;

(In C)
void SaveRecord()
{
FieldPtr NameFieldPtr;
FieldPtr UnidadeFieldPtr;
FieldPtr ResposavelFieldPtr;
FieldPtr DataFieldPtr;
UInt16 Offset;


  // Find field objects
 NameFieldPtr = GetObjectPtr <FieldType>(Field_NumPAT);
 UnidadeFieldPtr = GetObjectPtr <FieldType>(Field_Unidade);
 ResposavelFieldPtr = GetObjectPtr <FieldType>(Field_Responsavel);
 DataFieldPtr = GetObjectPtr <FieldType>(Field_Data);

// Resize record to hold new data
CurrRecHandle = DmResizeRecord(db, CurrRecNumber,
sizeof(UInt16) + GetFieldLength(NameFieldPtr) + GetFieldLength(UnidadeFieldPtr)
+ GetFieldLength(ResposavelFieldPtr) + GetFieldLength(DataFieldPtr));


 // Write data to record
 SaveFieldValue(NameFieldPtr, Offset); <==============
 SaveFieldValue(UnidadeFieldPtr, Offset); <=============
 SaveFieldValue(ResposavelFieldPtr, Offset); <============
 SaveFieldValue(DataFieldPtr, Offset); <===============

 // Not setting dirty bit as not worrying about HotSyncs
 DmReleaseRecord(db, CurrRecNumber, false);
 CurrRecHandle = NULL;
}

===>
(PASCAL)
function GetFieldLength(Field : FieldPtr) : UInt16;
 var
   FieldTextHandle : MemHandle;
   FieldText       : PChar;
begin
 Result          := 0;
 FieldTextHandle := FldGetTextHandle(Field);

 if FieldTextHandle = nil then begin
   Exit;
 end;

 FieldText       := MemHandleLock(FieldTextHandle);
 Result          := StrLen(FieldText) + 1;
 MemHandleUnlock(FieldTextHandle);
end;

(In C)
UInt16 GetFieldLength(FieldPtr field)
{
 MemHandle FieldTextHandle;
 FieldPtr FieldText;
 UInt16 result=0;

 FieldTextHandle = FldGetTextHandle(field);

 if (FieldTextHandle == NULL)
   return result;

 FieldText = (FieldPtr) MemHandleLock(FieldTextHandle);
 result = StrLen(FieldText) + 1; <===================

 MemHandleUnlock(FieldTextHandle);

 return result;
}

===>
(PASCAL)
procedure SaveFieldValue(Field : FieldPtr;var Offset : UInt16);
 var
   FieldText,
   RecordPtr  : PChar;
begin
 FieldText := FldGetTextPtr(Field);

 if FieldText = nil then begin
   FieldText := '';
 end;

 RecordPtr := MemHandleLock(CurrRecHandle);
 DmWrite(RecordPtr,Offset,FieldText,StrLen(FieldText) + 1);
 Offset    := Offset + StrLen(FieldText) + 1;  // Allow for null byte
 MemHandleUnlock(CurrRecHandle);
end;

(In C)
void SaveFieldValue(FieldPtr field, UInt16 Offset)
{
 FieldPtr FieldText;
 DBRecordPtr RecordPtr;

FieldText = (FieldPtr) FldGetTextPtr(field);
RecordPtr = (DBRecordPtr) MemHandleLock(CurrRecHandle);


DmWrite(RecordPtr, Offset, FieldText, StrLen(FieldText) + 1); <===================
Offset += StrLen(FieldText) + 1; // Allow for null byte <========================


 MemHandleUnlock(CurrRecHandle);
}

====>
(PASCAL)
procedure SetFieldValue(Field : FieldPtr;FieldLen : UInt16;var Offset : UInt16);
var
FieldTextHandle : MemHandle;
FieldText : PChar;
RecordPtr : PChar;
begin
FieldTextHandle := FldGetTextHandle(Field);
// Clear any existing text first
FldSetTextHandle(Field,nil);


 if FieldTextHandle = nil then begin
   FieldTextHandle := MemHandleNew(FieldLen);
 end else begin
   MemHandleResize(FieldTextHandle,FieldLen);
 end;

 FieldText := MemHandleLock(FieldTextHandle);
 RecordPtr := MemHandleLock(CurrRecHandle);

 StrCopy(FieldText,@RecordPtr[Offset]); <=========
 Offset := Offset + StrLen(@RecordPtr[Offset]) + 1; <======

 MemHandleUnlock(CurrRecHandle);
 MemHandleUnlock(FieldTextHandle);

 FldSetTextHandle(Field,FieldTextHandle);
end;

(In C)
void SetFieldValue( FieldPtr field, UInt16 fieldLen, UInt16 Offset) ///Problema em ler o valor Offset
{
MemHandle FieldTextHandle;
FieldPtr FieldText;
DBRecordPtr RecordPtr;


 FieldTextHandle = FldGetTextHandle(field);
 // Clear any existing text first
 FldSetTextHandle(field, NULL);


if (FieldTextHandle == NULL) { FieldTextHandle = MemHandleNew(fieldLen); } else { MemHandleResize(FieldTextHandle, fieldLen); }

 FieldText = (FieldPtr) MemHandleLock(FieldTextHandle);
 RecordPtr = (DBRecordPtr) MemHandleLock(CurrRecHandle);

 StrCopy( FieldText, &RecordPtr[Offset]); <==============
 Offset += StrLen(RecordPtr[Offset]) + 1; <==============

 MemHandleUnlock(CurrRecHandle);
 MemHandleUnlock(FieldTextHandle);
 FldSetTextHandle(field, FieldTextHandle);
}

====>
(PASCAL)
procedure LoadRecord;
var
Offset : UInt16;
begin
Offset := 0;
SetGroupSelection(RatingGroup,OffSet); // I don't use this function...........
SetFieldValue(GetObjectPtr(BeerTasterEditNameField),40,Offset);
SetFieldValue(GetObjectPtr(BeerTasterEditNotesField),200,Offset);
end;


(In C)
void LoadRecord()
{
 UInt16 Offset = 0;

 SetFieldValue (GetObjectPtr<FieldType>(Field_NumPAT),  10, Offset);
 SetFieldValue (GetObjectPtr<FieldType>(Field_Unidade), 35, Offset);
 SetFieldValue (GetObjectPtr<FieldType>(Field_Responsavel), 19, Offset);
 SetFieldValue (GetObjectPtr<FieldType>(Field_Data),    10, Offset);
}

I can send all the code of my project in attachment! Only need to ask!!
Thanks a lot to everybody!
Andr� Augusto


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

Reply via email to