Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

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

  Alt 24. Feb 2024, 10:30
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 type Integer und ist nun nur noch 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
Miniaturansicht angehängter Grafiken
lparam.png  
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Feb 2024 um 10:56 Uhr)
  Mit Zitat antworten Zitat