===>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/
