Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.883 Beiträge
 
Delphi 12 Athens
 
#3

Re: Access Violation im Speichermanager

  Alt 7. Jan 2009, 09:30
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;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat