Der Pointer Typ soll eigentlich nur ein Vehikel sein.
Da wird nie als Pointer drauf zugegriffen, Und String ist doch ein 4Byte Typ, oder?
Die frage ist auch warum es immer klappt nur einmal irgendwann nicht.
Aber ich werde es mal ausprobieren ob das so wie in deinem Code geht.
Zur Erklärung:
Ich missbrauche den Bookmark als RecNo für
Datalinks die mehrere Datensätze Anzeigen wo man einen Gezielt anklicken kann
wie dies zum Beispiel im
DB Grid der Fall ist.
So das alle gebufferten Records einen Bookmark bereithalten.
Zu dem ist bei mir RecNo und ein Bookmark schon irgendwie das selbe,
und wenn Recno nicht unterstützt wird dann weiche ich komplett auf die angebotenen Bookmarks aus.
Wie hier der Fall.
Müsste ich dann nicht in den Funktionen auch ne menge
verändern? (Die Kommentare im Source sind einfach nur für mich)
Delphi-Quellcode:
function TVTABLE.AllocateRecordID: Pointer;
Begin
if sfRecno in supported then
Result := Pointer(FCurRec)
else
String(Result) := MyDataset.Bookmark;
end;
procedure TVTABLE.DisposeRecordID(Value: Pointer);
Begin
if not (sfRecno in supported) then
If Value <> nil then
String(Value) := ''; // Freigabe des Bookmarks sehr sehr wichtig !!!
end;
procedure TVTABLE.GotoRecordID(Value: Pointer);
var old:Integer;
Begin
if sfRecno in supported then
Begin
old := FCurRec;
FCurRec := Integer(Value);
if FCurRec > -1 then
Begin
SetDataSetRecNo(FCurRec+1)(*evtl. moveby verwenden*)
end;
end
else
begin
If (Value <> nil) then
MyDataset.Bookmark := String(Value);
// MyDataset.Bookmark := String(PRecordInfo(Activebuffer + GetDataSize).RecordID^);
// A.R. kann man das einfach so auskommentieren?
// RecordToBuffer(Activebuffer); // Resync passiert in TDataset.GotoBookmark
end
end;
function TVTABLE.GetBookMarkSize: Integer;
Begin
if sfrecno in supported then
Result := SizeOf(Integer)
else
Begin
Result := SizeOf(String);
end;
end;
procedure TVTABLE.DoGotoBookmark(Bookmark: Pointer);
Begin
if sfrecno in supported then
GotoRecordID(Pointer(PInteger(Bookmark)^))
else
GotoRecordID(Bookmark);
end;
procedure TVTABLE.AllocateBookMark(RecordID: Pointer; Bookmark: Pointer);
Begin
if sfrecno in supported then
PInteger(Bookmark)^ := Integer(RecordID)
else
Bookmark := RecordID;//Gefahr: Kann sein das das Bookmark bei Navigation zerstört wird.
end;