Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Problem mit Delphi 12 CE mit überladenen Funktionen (https://www.delphipraxis.net/215583-problem-mit-delphi-12-ce-mit-ueberladenen-funktionen.html)

Maekkelrajter 31. Jul 2024 12:15

Problem mit Delphi 12 CE mit überladenen Funktionen
 
Gestern habe ich die Delphi 12 CE installiert. Die Installation verlief problemlos. Als Erstes habe ich mein aktuelles Projekt geladen und versucht zu compilieren. Dieses Projekt verwendet die Jedi Code Library, was bisher (Delphi 11.3 CE) problemlos funktionierte. Leider in tritt mit der D12 CE ein Fehler in der Unit JclGraphUtils auf:
Delphi-Quellcode:
procedure CMYKToBGR(const Source, Target: Pointer; const BitsPerSample: Byte; Count: Cardinal); overload;
var
  R, G, B, K: Integer;
  I: Integer;
  SourcePtr: PCMYK;
  SourcePtr16: PCMYK16;
  TargetPtr: PByte;
begin
  case BitsPerSample of
    8:
      begin
        SourcePtr := Source;
        TargetPtr := Target;
        Count := Count div 4;
        for I := 0 to Count - 1 do
        begin
          K := SourcePtr.K;
          R := 255 - (SourcePtr.C - MulDiv(SourcePtr.C, K, 255) + K);
          G := 255 - (SourcePtr.M - MulDiv(SourcePtr.M, K, 255) + K);
          B := 255 - (SourcePtr.Y - MulDiv(SourcePtr.Y, K, 255) + K);
          TargetPtr^ := Max(0, Min(255, Byte(B)));// Fehler 'Doppeldeutiger überladener Ausdruck' (Max und Min)
          Inc(TargetPtr);
          TargetPtr^ := Max(0, Min(255, Byte(G)));// Fehler 'Doppeldeutiger überladener Ausdruck' (Max und Min)
          Inc(TargetPtr);
          TargetPtr^ := Max(0, Min(255, Byte(R)));// Fehler 'Doppeldeutiger überladener Ausdruck' (Max und Min)
          Inc(TargetPtr);
          Inc(SourcePtr);
        end;
      end;
    16:
      begin
        SourcePtr16 := Source;
        TargetPtr := Target;
        Count := Count div 4;
        for I := 0 to Count - 1 do
        begin
          K := SourcePtr16.K;
          R := 255 - (SourcePtr16.C - MulDiv(SourcePtr16.C, K, 65535) + K) shr 8;
          G := 255 - (SourcePtr16.M - MulDiv(SourcePtr16.M, K, 65535) + K) shr 8;
          B := 255 - (SourcePtr16.Y - MulDiv(SourcePtr16.Y, K, 65535) + K) shr 8;
          TargetPtr^ := Max(0, Min(255, Byte(B)));// Fehler 'Doppeldeutiger überladener Ausdruck' (Max und Min)
          Inc(TargetPtr);
          TargetPtr^ := Max(0, Min(255, Byte(G)));// Fehler 'Doppeldeutiger überladener Ausdruck' (Max und Min)
          Inc(TargetPtr);
          TargetPtr^ := Max(0, Min(255, Byte(R)));// Fehler 'Doppeldeutiger überladener Ausdruck' (Max und Min)
          Inc(TargetPtr);
          Inc(SourcePtr16);
        end;
      end;
    else
      raise EColorConversionError.CreateResFmt(@RsBitsPerSampleNotSupported, [BitsPerSample]);
  end;
end;
Die Funktionen Max() und Min(), die in system.math deklariert sind, erzeugen den Fehler 'Doppeldeutiger überladener Ausdruck', unter 11.3 CE gab es das Problem nicht.
Gibt es womöglich in der D12 IDE eine Einstellung, mit der man das beeinflussen kann?


Gruß LP

LoZe 31. Jul 2024 12:21

AW: Problem mit Delphi 12 CE mit überladenen Funktionen
 
nur ne Idee wenn du
Delphi-Quellcode:
System.Math.Max(...
und
Delphi-Quellcode:
System.Math.Min(..
schreibst sollte es nicht mehr Doppeldeutig sein.

Maekkelrajter 31. Jul 2024 13:27

AW: Problem mit Delphi 12 CE mit überladenen Funktionen
 
Ja, so funktioniert's tatsächlich. Die Funktionen Min() und Max() sind nämlich auch in der Unit JclLogic deklariert. Die werden in JclGraphUtils allerdings so aufgerufen:
Delphi-Quellcode:
function RectIntersection(const R1, R2: TRect): TRect;
begin
  with Result do
  begin
    Left := JclLogic.Max(R1.Left, R2.Left);
    Top := JclLogic.Max(R1.Top, R2.Top);
    Right := JclLogic.Min(R1.Right, R2.Right);
    Bottom := JclLogic.Min(R1.Bottom, R2.Bottom);
  end;
  if not RectIsValid(Result) then
    Result := NullRect;
end;
Die 'uses'- Klausel sieht so aus:
Delphi-Quellcode:
implementation

uses
  {$IFDEF HAS_UNITSCOPE}
  System.Classes, Vcl.Consts, System.Math,
  {$ELSE ~HAS_UNITSCOPE}
  Classes, Math,
  {$IFDEF FPC}
  RTLConsts,
  {$ELSE ~FPC}
  Consts,
  {$ENDIF ~FPC}
  {$ENDIF ~HAS_UNITSCOPE}
  {$IFDEF HAS_UNIT_SYSTEM_UITYPES}
  System.UITypes,
  {$ENDIF HAS_UNIT_SYSTEM_UITYPES}
  JclVclResources, JclSysInfo, JclLogic;
Ich wüsste aber doch gerne, warum das unter D 12 nicht mehr funktioniert.

Gruß LP

Uwe Raabe 31. Jul 2024 13:32

AW: Problem mit Delphi 12 CE mit überladenen Funktionen
 
Delphi 12 führt neue Overloads für Byte, ShortInt, SmallInt, Word und Cardinal bei Max und Min ein (bei Win32 auch für Currency).

Maekkelrajter 31. Jul 2024 22:37

AW: Problem mit Delphi 12 CE mit überladenen Funktionen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1539413)
Delphi 12 führt neue Overloads für Byte, ShortInt, SmallInt, Word und Cardinal bei Max und Min ein (bei Win32 auch für Currency).

Das erklärt einiges. Gleichnamige Funktionen mit identischer Signatur sind nämlich in der Unit JclLogic ebenfalls vorhanden.
Die waren auch ganz sicher mit den Aufrufen in JclGraphUtils eigentlich 'gemeint'. Ich habe jetzt in der Unit JclGraphUtils alle Aufufe von Min und Max mit 'JclLogic.' qualifiziert.
Nun läuft's wie geschmiert :-D

Gruß LP

himitsu 31. Jul 2024 23:25

AW: Problem mit Delphi 12 CE mit überladenen Funktionen
 
Oder per
Delphi-Quellcode:
{$if CompilerVersion < 36}
die nun unnötigen Überladungen der JclLogic entfernen. :angle2:

Oder via
Delphi-Quellcode:
{$IFnDEF DELPHI12_UP
oder
Delphi-Quellcode:
{$IFDEF DELPHI11ANDBEFORE
oder wie auch immer die JCL sich sowas bestimmt definiert hat.

Maekkelrajter 1. Aug 2024 09:45

AW: Problem mit Delphi 12 CE mit überladenen Funktionen
 
Zitat:

Zitat von himitsu (Beitrag 1539435)
Oder per
Delphi-Quellcode:
{$if CompilerVersion < 36}
die nun unnötigen Überladungen der JclLogic entfernen. :angle2:

Oder via
Delphi-Quellcode:
{$IFnDEF DELPHI12_UP
oder
Delphi-Quellcode:
{$IFDEF DELPHI11ANDBEFORE
oder wie auch immer die JCL sich sowas bestimmt definiert hat.

Dann müsste aber sichergestellt sein, dass in der gesamten JCL überall dort, wo Aufrufe von Min oder Max erfolgen, auch system.math eingebunden ist. Das überlasse ich aber lieber den Jedi - Machern für das nächste Update.

Edit:
Das Update liegt bereits vor.
Gerade habe ich das neueste von den JCL Daily Packages heruntergeladenhttps://jcl.sourceforge.net/daily/
Dort finden sich exakt die Modifikationen, die ich bei meiner Installation bereits vorgenommen hatte.
Geht doch!

Gruß LP


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