나는 항상 잘 작동하는 오래된 응용 프로그램을 가지고 있습니다. 최근에는 FilterOnBookmarks 메서드에서 EAccessViolation 예외가 throw되기 시작했습니다. 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;
나는 TVarRec의 배열로 FilterOnBookamrks 방법의 즐겨 찾기 매개 변수를 만들 :이 코드는 년 동안 일하고있다
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;
. FilterOnBookmarks, Bookmarks 등과 관련하여 10.1 XE에서 변경된 사항이 있습니까?
해결책을 찾았습니까? (앱 변경없이) 동일한 문제가 있으며 앱을 변경할 수 없습니다. 감사합니다. – user3648935
감사합니다. @ user3648935! msado15.dll의 이전 버전을 응용 프로그램 작업 디렉토리에 저장하면 문제가 해결됩니까? 어디에서 찾을 수 있습니까? –