1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
function TMemoryDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
DoCheck: Boolean): TGetResult;
var
TempBuf : PChar;
{$IFDEF TRACE}
currentTime : int64;
{$ENDIF}
begin
{$IFDEF TRACE}
GenericLogger.TraceBegin(EVENT_START, 'GetRecord', currentTime, TRACE_LEVEL_VERBOSE);
try
{$ENDIF}
// Premièrement, il faut rechercher l'enregistrement en fonction du mode de déplacement demandé.
case GetMode of
gmCurrent: // On veut l'enregistrement courant.
begin
if (FCursor >-1)
then dec(FCursor); // on remonte d'un enregistrement
FindNextRecord; // et on recherche l'enregistrement suivant
end;
gmPrior: // On veut l'enregistrement précédent.
FindPriorRecord;
gmNext: // On veut l'enregistrement suivant.
FindNextRecord;
end;
// A présent, il faut vérifier si on se trouve au début ou à la fin du DataSet
if (FCursor <0) // On se trouve au début, il faut renvoyer BOF.
then result := grBOF
else begin
if FCursor>=integer(FLineIndex.Count) // On se trouve à la fin, on retourne EOF.
then result := grEOF
else begin // L'enregistrement existe, on lit le buffer.
TempBuf := FLineIndex[FCursor];
move(TempBuf^, Buffer^, RecordSize);
PLineBuffer(Buffer).BkFlags := bfCurrent; // L'enregistrement est valide
GetCalcFields(Buffer); // C'est le moment de calculer les champs calculés.
result := grOK;
end;
end;
{$IFDEF TRACE}
finally
GenericLogger.TraceEnd(EVENT_END, 'GetRecord', currentTime, TRACE_LEVEL_VERBOSE);
end;
{$ENDIF}
end; |
Partager