J'ai une ancienne application qui a toujours bien fonctionné. Récemment, il a commencé à lancer l'exception EAccessViolation dans la méthode FilterOnBookmarks. Je ne sais pas quand cela a commencé, peut-être quand je le reconstruis sous XE 10.1.TCustomADODataSet.FilterOnBookmarks
procedure TCustomADODataSet.FilterOnBookmarks(Bookmarks: array of const);
var
I: Integer;
BookmarkData: OleVariant;
begin
CheckBrowseMode;
BookmarkData := VarArrayCreate([Low(Bookmarks), High(Bookmarks)], varVariant);
for I := Low(Bookmarks) to High(Bookmarks) do
BookmarkData[I] := POleVariant(TVarRec(Bookmarks[I]).VPointer)^;
inherited SetFilterText('');
FFilterGroup := fgUnassigned;
DestroyLookupCursor;
try
Recordset.Filter := BookmarkData; //<---- Here I get EAccessViolation
First;
inherited SetFiltered(True);
except
inherited SetFiltered(False);
raise;
end;
end;
je créer des signets paramètres de la méthode FilterOnBookamrks comme un tableau de TVarRec:
type TSQLVarRecArray = array of TVarRec;
PBookmark = ^TBookmark;
TSQLBookmarkList = class(TList)
private
...
protected
function Get(Index: Integer): PBookmark;
public
...
procedure Add(Bookmark: TBookmark);
property Items[Index: Integer]: PBookmark read Get; default;
function ToVarRecArray: TSQLVarRecArray;
end;
procedure TSQLBookmarkList.Add(Bookmark: TBookmark);
var PB: PBookmark;
L: Integer;
begin
New(PB);
L := Length(Bookmark);
SetLength(PB^, L);
PB^ := Copy(Bookmark, 0, L);
inherited Add(PB);
end;
function TSQLBookmarkList.ToVarRecArray: TSQLVarRecArray;
var I: Integer;
begin
SetLength(Result, Count);
for I := 0 to Count - 1 do begin
Result[I].VType := vtPointer;
Result[I].Vpointer := Items[I]^;
end;
end;
try
...
Arr := BookmarkList.ToVarRecArray;
FilterOnBookmarks(Arr);
finally
Arr := nil; //<--- Now I get here EVariantArrayLockedError "Variant or safe array is locked"
end;
Ce code a travaillé pendant des années. Est-ce que quelque chose a changé dans 10.1 XE concernant FilterOnBookmarks, Bookmarks, etc?
Avez-vous trouvé la solution? (sans changement d'application) Nous avons le même problème, nous ne pouvons pas changer l'application. Je vous remercie – user3648935
Merci, @ user3648935! Est-ce que le fait de placer l'ancienne version de msado15.dll dans le répertoire de travail de l'application résout le problème? Où puis-je le trouver? –