Hallo zusammen,
ich teste gerade unter Rx10.4,
und ich habe einen seltsamen Crash unter iOS, das dürfe aber mit iOS nichts zu tun haben.
Der Code sieht so aus
Delphi-Quellcode:
procedure TMyListView.EvOnItemClickEx( const Sender: TObject;
ItemIndex: Integer;
const LocalClickPos: TPointF;
const ItemObject: TListItemDrawable);
var
LItemObject : TListItemDrawable;
begin
if Sender is TListView then
begin
LItemObject := ItemObject; //<=== das ist ein TListItemDrawable
...
if Assigned( LItemObject ) then
begin
if LItemObject is TListItemText then //<=== hier crasht es, bei der Auflösung
begin
...
end
....
end;
dabei ist TListItemText von TListItemDrawable abgeleitet,
also
sollte Obiges doch IMMER funktionieren.
Die Auflösung "as" stürzt hier ab (bei InheritsFrom)
Delphi-Quellcode:
function _IsClass(const Child: TObject; Parent: TClass): Boolean;
begin
Result := (Child <> nil) and Child.InheritsFrom(Parent);
end;
class function TObject.InheritsFrom(AClass: TClass): Boolean;
var
ClassPtr: Pointer;
P: Pointer;
begin
Result := False;
ClassPtr := Pointer(Self);
while True do
begin
if ClassPtr = Pointer(AClass) then
begin
Result := True;
break;
end;
P := PPointer(PByte(ClassPtr) + vmtParent)^; //<=== hier crasht es, schon beim 1. Durchlauf
if P = nil then break;
ClassPtr := PPointer(P)^;
end;
end;
Das Ganze passiert unter iOS, und ich kann die Pointer leider nicht vernünftig debuggen.
Der Aufruf kommt aus dem FMX.ListView, an dieser Stelle
Delphi-Quellcode:
procedure TListViewBase.ProcessIncident(const Entry: TDelayedIncidentEntry);
begin
case Entry.Incident of
TDelayedIncident.ChangeRepainted:
DoChangeRepainted;
TDelayedIncident.Invalidate:
Invalidate;
TDelayedIncident.SetItemIndex:
SetItemIndexInternal(Entry.CustomData);
TDelayedIncident.ClickEvent:
if Assigned(FOnItemClickEx) then
FOnItemClickEx(Self, FClickEventItemIndex, FClickEventMousePos, FClickEventControl); //<====
....
Die Parameter im ListView sollten doch eigentlich OK sein.
Könnte es was mit dem TDelayedIncident.ClickEvent zu tun haben ?
Bin im Moment ratlos was das sein könnte, vielleicht hat das schon mal jemand gelöst.
Das Ganze hat überigens unter Rx1033 (und vorher) wunderbar funktioniert.