Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.896 Beiträge
 
Delphi 12 Athens
 
#1

10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursachen ?

  Alt 12. Jun 2020, 16:28
Delphi-Version: 10.4 Sydney
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.

Geändert von Rollo62 (12. Jun 2020 um 16:32 Uhr)
  Mit Zitat antworten Zitat