Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   "strong alias" / "weak alias"? (https://www.delphipraxis.net/214705-strong-alias-weak-alias.html)

freimatz 24. Feb 2024 09:42

Delphi-Version: 5

"strong alias" / "weak alias"?
 
Zitat:

Zitat von Rollo62 (Beitrag 1533827)
Hallo zusammen,

ich suche gerade nach ein paar mysteriösen, unterschiedlichen Verhalten von Apps unter D12, was vorher einwandfrei lief.
Mir ist die Umstellung siehe oben bekannt, hier unter anderem auch aus den Blogs von Marco Cantu und GDK

Ich hätte da noch ein paar zusammenfassende Fragen, ...

Ich habe da nur eine Frage: um was geht es überhaupt? Ich habe die zwei Blogs gelesen und gegoogelt aber nicht herausfinden können was "strong alias" und "weak alias" überhaupt sind.
Was ich bisher kenne ist
Delphi-Quellcode:
type
  TAliasA = TBla;
  TAliasB = type TBla;
Ist sowas gemeint? Und falls ja was ist das Neue daran bei D12?

Rollo62 24. Feb 2024 09:56

AW: "strong alias" / "weak alias"?
 
Ich denke, es geht nur um die internen Delphi-Typen, wie NativeInt, welche sich beim overload jetzt anders verhalten.
Der NativeIn verändert seinen Typ, je nach Plattform mal Int32 oder Int64, dies hat einige Probleme erzeugt.

Früher war der overload so möglich, jetzt nicht mehr.

Zitat:

You can use it instead of the two counterparts, not in parallel. You can no longer overload like this in Delphi:
Delphi-Quellcode:
procedure doIt( I : Integer  ); overload;
procedure doIt( I : Int64     ); overload;
procedure doIt( I : NativeInt ); overload; // Error 120 nativeint      it’s a redeclaration.
Zitat:

Now must either do this if you want distinct behaviors on how to handle 32-bit vs. 64-bit integers:
Delphi-Quellcode:
procedure doIt( I : Integer  ); overload;
procedure doIt( I : Int64     ); overload;
Zitat:

Or just write a single version that adapts to the specific platform bittness:
Delphi-Quellcode:
procedure doIt( I : NativeInt ); overload;

himitsu 24. Feb 2024 10:30

AW: "strong alias" / "weak alias"?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Gute Frage, laut Hilfe (DocWiki) gibt es in C++ ein Attribut, für Weak-Typen.
https://docwiki.embarcadero.com/RADS.../GNU-Attribute
Im Delphi probiert, funktioniert es nicht.
Delphi-Quellcode:
type
  [Weak] NewInt = type Integer; // wirkungslos (keine CompilerWarnung, aber Weak hat eh nur eine Wirkung auf Variablen mit Managed-Types ala Interface)
  NewInt = [Weak] type Integer; // compiliert nicht
  NewInt = type [Weak] Integer; // compiliert nicht
Prinzipiell gibt es das schon ewig, aber das Verhalten des Compilers hat sich geändert
und dementsprechend haben sie einige "ihrer" Typen ab jetzt anders deklariert,
Scheinbar war NativeInt früher sowas wie ein
Delphi-Quellcode:
type Integer
und ist nun nur noch
Delphi-Quellcode:
Integer
.

Aber der Compiler und CodeInsight behandeln nun "Alias" anders.
Früher wurde beim CodeInsight (CodeCompletion) und HelpInsight (Hint mit Deklaration) immer der "ursprüngliche" Typ angezeigt, aber jetzt der "Deklarierte".
Und das hat endlich einen enormen Vorteil, denn wenn du dir im Editor die Deklaration von SendMessage ansiehst, dann steht dort endlich LPARAM/WPARAM/LRESULT und nicht nur NativeInt, bzw. ganz früher Integer.
siehe Anhang -> HWND ist ein eigener Typ (stong-type) und der Rest nur ein Alias (weak-type)

Delphi-Quellcode:
type
  AliasInt = Integer;
  NewInt  = type Integer;

  TTest = record
    procedure doIt(I: Integer);  overload;
    procedure doIt(I: Int64);    overload;
  //procedure doIt(I: NativeInt); overload; // unter D11 konnte man das noch deklarieren, da NativeInt ein "eigener" Typ war
  //procedure doIt(I: AliasInt); overload; // geht nicht, weil ist Typ "identisch" mit Integer
    procedure doIt(I: NewInt);   overload;
  end;

procedure TForm2.FormCreate(Sender: TObject);
var
  i4: Integer; // Int32 = Integer
  i8: Int64;
  ix: NativeInt;
  ai: AliasInt;
  ni: NewInt;
  lp: LPARAM; // LPARAM = INT_PTR = IntPtr = NativeInt
  Test: TTest;
begin
  Test.doIt(i4);
  Test.doIt(i8);
  Test.doIt(ix); // im D11 weiß NativeInt nicht wo hint, alo ob Integer oder NewInt
  Test.doIt(ai); // Links die Maus über "ai" halten - früher wurde es überall als "Integer" angezeigt, jetzt als "AliasInt"
  Test.doIt(ni);
  Test.doIt(lp); // seid D12 wird es als "LPARAM" angezeigt, aber früher als "NativeInt"
end;

procedure TTest.doIt(I: Integer);
begin
end;

procedure TTest.doIt(I: Int64);
begin
end;

{procedure TTest.doIt(I: NativeInt);
begin
end;}

procedure TTest.doIt(I: NewInt);
begin
end;

PS: Ich hab soeben beim "Verantwortlichen" nochmal nachgefragt ... mal sehn ob/was er antwortet.
https://blog.marcocantu.com/blog/202...eak-alias.html

Uwe Raabe 24. Feb 2024 11:29

AW: "strong alias" / "weak alias"?
 
Das
Delphi-Quellcode:
type
Keyword solltest du aber weglassen, denn damit deklarierst du einen definitiv anderen Typ.

freimatz 24. Feb 2024 18:22

AW: "strong alias" / "weak alias"?
 
Danke Euch allen. Dann lege ich die Sache für mich und behalte das mal im Hinterkopf. Falls wir in unserem Projekt diesen NativInt verwendet haben kümmert sich ein Kollege daram :-D

Zitat:

Zitat von Uwe Raabe (Beitrag 1533854)
Das
Delphi-Quellcode:
type
Keyword solltest du aber weglassen, denn damit deklarierst du einen definitiv anderen Typ.

Meinst Du mich?
Ich persönlich verwende selten Aliase und wenn dann kommt es darauf an. Klar, mit type ist es ein nuer Typ. Dafür bekommt man die Typsicherheit. Ich könnte mir sowas vorstellen:
Delphi-Quellcode:
type
  TDistance = type Double;
  TAngle = type Double;
Mit dem type könnte man verhindern, dass man als Entwickler versehentlich mal was falsch zuweist. (Dafür handelt man sich woanders recht viel Arbeit ein.)

Uwe Raabe 24. Feb 2024 21:41

AW: "strong alias" / "weak alias"?
 
Zitat:

Zitat von freimatz (Beitrag 1533858)
Meinst Du mich?

Nein. Damit war Frank gemeint.

himitsu 24. Feb 2024 22:41

AW: "strong alias" / "weak alias"?
 
Das war ja nur für den Vergleich von MIT und OHNE :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:05 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