AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi 10.4: Was kann einen Absturz bei der Auflösung von "MyObject as TType" verursachen ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Rollo62 · begonnen am 12. Jun 2020 · letzter Beitrag vom 17. Jun 2020
 
Rollo62

Registriert seit: 15. Mär 2007
3.926 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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz