AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

Ein Thema von swestner · begonnen am 10. Nov 2023 · letzter Beitrag vom 18. Jun 2024
Antwort Antwort
Seite 1 von 2  1 2      
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
112 Beiträge
 
Delphi 12 Athens
 
#1

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 12:22
Bei welchem Code habt ihr denn Probleme?
Im Grunde so wie oben im 1. Beitrag schon beschrieben; hier mal mein Beispiel:
Delphi-Quellcode:
uses
  ..., Contnrs;
type
  TBauteil = class(TObject)
    ID : Integer;
    Name : string;
  end;

  TBauteilList = class(TObjectList)
  private
    function GetItem(ndx: Integer): TBauteil;
  public
    property Items[ndx: Integer]: TBauteil read GetItem; default;
  end;

{ TBauteilList }

function TBauteilList.GetItem(ndx: Integer): TBauteil;
begin
  Result := TBauteil(inherited Items[ndx]);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  LBauteilList : TBauteilList;
  LBauteil1 : TBauteil;
  LBauteil2 : TBauteil;
  i : Integer; { 3 }
begin
  LBauteilList := TBauteilList.Create(True);
  try
    for i := 0 to LBauteilList.Count-1 do
    begin
      LBauteil1 := LBauteilList[i]; { 1 }
      LBauteil2 := LBauteilList[LBauteilList.Count-1]; { 2 }

      if Assigned(LBauteil1) and Assigned(LBauteil2) then ;
    end;
  finally
    LBauteilList.Free;
  end;
end;
(Ja, die Liste ist leer. Aber es geht um einen Fehler beim compilieren für Win64.)

Delphi 11.3: compiliert ohne Fehler.
Delphi 12.1: In der mit { 2 } markierten Zeile "E2010 Incompatible types: 'TBauteil' and 'TObject'"

Tausche ich in der Klasse TBauteilList den Datentyp für ndx in "NativeInt", dann dreht sich das Verhalten um:

Delphi 11.3: In der mit { 1 } markierten Zeile: "E2010 Incompatible types: 'TBauteil' and 'TObject'"
Delphi 12.1: compiliert ohne Fehler.

Nächster Versuch:
Die Laufvariable "i" (Markierung { 3 }) ändern von Integer nach NativeInt:

Delphi 11.3: Fehler in der Zeile { 2 }
Delphi 12.2: kein Fehler.

Gibt es eine allgemeingültige Lösung?
Von dieser Art Listen -- von TObjectList abgeleitet -- haben wir jede Menge.

Gruß
Achim

Geändert von Achim Kalwa (18. Jun 2024 um 12:23 Uhr) Grund: Tippfehler
  Mit Zitat antworten Zitat
freimatz
Online

Registriert seit: 20. Mai 2010
1.513 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 13:13
Warum nehmt Ihr nicht TObjectList<TBauteil>?
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
112 Beiträge
 
Delphi 12 Athens
 
#3

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 13:23
Warum nehmt Ihr nicht TObjectList<TBauteil>?
Historisch gewachsener Code seit Delphi 3; über 100 Listen-Klassen müssten umgebaut werden. Damals gab's die Generics noch nicht.
Achim
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#4

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 13:41
Wie wäre es denn damit:
Delphi-Quellcode:
type
{$IF CompilerVersion < 36.0 Delphi 12 Athens }
  TListIndex = Integer;
{$ELSE}
  TListIndex = NativeInt;
{$ENDIF}

type
  TBauteil = class(TObject)
    ID : Integer;
    Name : string;
  end;

  TBauteilList = class(TObjectList)
  private
    function GetItem(ndx: TListIndex): TBauteil;
  public
    property Items[ndx: TListIndex]: TBauteil read GetItem; default;
  end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
112 Beiträge
 
Delphi 12 Athens
 
#5

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 17:11
[QUOTE=Uwe Raabe;1537913]Wie wäre es denn damit:
Delphi-Quellcode:
type
{$IF CompilerVersion < 36.0 Delphi 12 Athens }
  TListIndex = Integer;
{$ELSE}
  TListIndex = NativeInt;
{$ENDIF}
Genau diese Idee hatte ich auch schon. Der Anpassungsaufwand ist aber enorm; ich muss ja nicht nur die jeweiligen List-Klassen anpassen; sondern überall im Code auch die Index-Variablen.
Achim
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 13:59
.. wenn Du
LBauteil2 := TBauteil(LBauteilList[LBauteilList.Count-1]); { 2 } sollte es bei beiden Varianten funktionieren.
Warum bei NativeInt ein Cast ( in Delph 11.3) notwendig ist - entzieht sich meiner Kenntnis.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.551 Beiträge
 
Delphi 12 Athens
 
#7

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 14:27
Delphi prüft/vergleicht jetzt auch Alias-Deklarationen stärker.

Delphi-Quellcode:
type
  MyInt1 = Integer;
  MyInt2 = type Integer;
Früher war MyInt1 und Integer das "Gleiche" ... jetzt eventuell nicht mehr.

z.B. auch im CodeInsight und der CodeCompletion zu sehen, wo du beim SendMessage jetzt LPARAM und WPARAM als Typen siehst, und nicht mehr Integer (Win32).

Und bezüglch NativeInt wurde früher in Win32 es überall als "Integer" angezeigt ... jetzt als "NativeInt".
In Win64 wurde NativeInt früher als irgenwas wie Int64 (weiß nicht genau) und jetzt ebenfalls als NativeInt.

Aus Sicht des Laufzeitcodes ist es nicht verständlich,
aber aus Sicht des Entwicklers ist es eigentlich schön (wobei des nett wäre, wenn beides gezeigt würde ... wie die Deklaration ist und was "wirklich" der Typ ist)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (18. Jun 2024 um 14:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#8

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 14:59
Warum bei NativeInt ein Cast ( in Delph 11.3) notwendig ist - entzieht sich meiner Kenntnis.
Das default Items in TObjectList ist mit NativeInt als Index deklariert. Die Items Deklaration in TBauteilList überschreibt das nicht etwa, sondern wird als override Property interpretiert. Je nach Compiler und Typ des übergebenen Index wird nun die Variante mit Index oder die mit NativeInt verwendet.
Delphi-Quellcode:
      LBauteil1 := LBauteilList[i]; { 1 }
      LBauteil2 := LBauteilList[LBauteilList.Count-1]; { 2 }
In {1} wird ein Integer übergeben, was auf die Deklaration in TBauteilList.Items aufgelöst wird. In {2} is LBauteilList.Count aber ein NativeInt, was bei der Subtraktion erhalten bleibt. Das wird dann unter Win64 auf TObjektList.Items aufgelöst und führt zu dem Incompatible Types Fehler.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 15:09
Warum nehmt Ihr nicht TObjectList<TBauteil>?
Historisch gewachsener Code seit Delphi 3; über 100 Listen-Klassen müssten umgebaut werden. Damals gab's die Generics noch nicht.
Damals konnte mal so etwas mit Include-Files übrigens trotzdem hinbekommen. Als dann Generics kamen, konnte ich das dann per ifdef direkt umbiegen, so dass es keine großén Änderungen gab.

Angesichts dessen, dass ja ohnehin etwas geändert werden muss, stellt sich aber hier denke ich schon die Frage, ob ein Umbau auf Generics nicht die sinnvollere Lösung wäre. Denn die Änderungen sollten sich ja auf die Klassen beschränken, die Nutzung sollte ja gleich bleiben. Bevor man da ggf. irgendwann noch einmal ran muss...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Achim Kalwa

Registriert seit: 2. Apr 2005
Ort: Lienen
112 Beiträge
 
Delphi 12 Athens
 
#10

AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3

  Alt 18. Jun 2024, 17:15
Angesichts dessen, dass ja ohnehin etwas geändert werden muss, stellt sich aber hier denke ich schon die Frage, ob ein Umbau auf Generics nicht die sinnvollere Lösung wäre. Denn die Änderungen sollten sich ja auf die Klassen beschränken, die Nutzung sollte ja gleich bleiben. Bevor man da ggf. irgendwann noch einmal ran muss...
Ein gutes Argument; Danke!
Kannst Du auch noch erklären, warum das Problem bei TBauteilList = TObjectList<TBauteil> nicht auftritt, auch wenn meine Index-Variable vom Typ "Integer" ist...
Achim
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz