![]() |
Delphi-Version: 11 Alexandria
Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Hallo,
folgender Code hat mit Delphi 11.3 unter 32 und 64 Bit problemlos compiliert. Mit Delphi 12 32 Bit funktioniert es weiterhin, mit Delphi 12 64 Bit gibt es Fehler:
Delphi-Quellcode:
Wo ist da jetzt das Problem? Zumal alles mit 11.3 funktioniert hat.
type TSupBookList = class(TList)
private function GetItems(Index: integer): TSupBook; public destructor Destroy; override; procedure Clear; override; procedure Add(P: PRecSUPBOOK); overload; procedure Add(Path,Filename,SheetName: AxUCString); overload; function AddEncodec(Tabs: integer; Code: word): integer; property Items[Index: integer]: TSupBook read GetItems; default; end; type TExternalNames = class(TObject) private FSupBooks: TSupBookList; public procedure SetCRN (SheetIndex: integer; P: PRecCRN; Size: word); end; procedure TExternalNames.SetCRN(SheetIndex: integer; P: PRecCRN; Size: word); begin if FSupBooks.Count <= 0 then raise XLSRWException.Create('No SUPBOOK for CRN'); if SheetIndex >= FSupBooks[FSupBooks.Count - 1].Count then // <----E2018 Record, object or class type required raise XLSRWException.Create('Invalid SUPBOOK Sheet Index'); FSupBooks[FSupBooks.Count - 1].Sheets[SheetIndex].SetCRN(P,Size); // <----E2018 Record, object or class type required end; Wurde in 12 was an TList geändert? Grüße Stefan Westner |
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Zitat:
Delphi-Quellcode:
und
Index
Delphi-Quellcode:
sind jetzt
Count
Delphi-Quellcode:
, was unter 64-Bit nicht mehr gleich
NativeInt
Delphi-Quellcode:
ist. Damit löst
Integer
Delphi-Quellcode:
auf das NativeInt
FSupBooks[FSupBooks.Count - 1]
Delphi-Quellcode:
Property von
Items
Delphi-Quellcode:
auf und nicht auf deine Integer Version.
TList
|
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Heißt das jetzt, daß ich überall machen muß:
Delphi-Quellcode:
Oder kann pauschal immer
{$IFDEF WIN32}
property Items[Index: integer]: TSupBook read GetItems; default; {$ELSEIF WIN64} property Items[Index: NativeInt]: TSupBook read GetItems; default; {$ENDIF}
Delphi-Quellcode:
property Items[Index: NativeInt]: TSupBook read GetItems; default;
verwendet werden? |
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
NativeInt ist unter 32 Bit 32 Bit groß und unter 64 Bit natürlich 64 Bit.
im Grunde genommen sieht es quasi so aus
Delphi-Quellcode:
type
{$IFDEF WIN32} NativeInt = Integer; // aka Int32 {$ELSE} NativeInt = Int64; {$ENDIF} ![]() ![]() ![]() Es gab aber im QP auch einen eigenen BugReport bezüglich dieses Problems (fand ihn nicht, aber siehe Facebook), also dass der Typ "NativeInt" nun strenger geprüft wird und unter Win64 dann plötzlich Int64 und NativeInt nicht "identisch" sind, obwohl sie eigentlich gleich sind. |
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Zitat:
|
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Zitat:
Gibt es eine abwärtskompatible Lösung? Wir stellen gerade von D11.3 auf D12.1 um und sind dabei auf obige Problematik bei Win64 gestoßen. Gibt es eine Lösung, die sowohl mit D11 als D12 funktioniert? Bei D11 ist ja TList (bzw. TObjectList).Items[Index: Integer] deklariert; und bei D12 als NativeInt. Wie weiter oben schon vorgeschlagen könnte ich mittels {$IFDEF WIN32} type NativeInt = Integer;{$ENDIF} einbauen; aber an manchen Stellen wie z.B. der Windows-API wird dann noch wieder der "echte" NativeInt verwendet. TIA Achim |
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Bei welchem Code habt ihr denn Probleme?
|
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Zitat:
Delphi-Quellcode:
(Ja, die Liste ist leer. Aber es geht um einen Fehler beim compilieren für Win64.)
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; 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ß |
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Warum nehmt Ihr nicht TObjectList<TBauteil>?
|
AW: Delphi 12 / TList unter 64 Bit funktioniert nicht mehr wie unter 11.3
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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