Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi D11.2 64Bit inaccessible value (gelöst) (https://www.delphipraxis.net/211389-d11-2-64bit-inaccessible-value-geloest.html)

venice2 9. Sep 2022 01:12


D11.2 64Bit inaccessible value (gelöst)
 
Seit D11.2 tritt unter 64Bit folgender Fehler auf.

Beim initialisieren von lPixel bekomme ich "inaccessible value"
Der selbe Quelltext unter 32Bit funktioniert.
Unter D11 hat auch 64Bit funktioniert jetzt plötzlich nicht mehr.

Hat vielleicht jemand eine Info was geändert wurde?

Delphi-Quellcode:
procedure TSkinEngine.CreateFormRegion(hParent: HWND; TransColor: COLORREF);
var
  p32: PByte;
  lPixel: PRGBQuad;
begin
  // nur relevanter Quelltext des Fehlers
  p32 := PByte(integer(bm.bmBits) + (bm.bmHeight - 1) * bm.bmWidthBytes);
  for Y := 0 to bm.bmHeight - 1 do
  begin
    X := 0;

    while X < bm.bmWidth do
    begin
      M := X;

      lPixel := PRGBQuad(integer(p32) + X * sizeof(cardinal));
      while X < bm.bmWidth do
      begin
        try"
          K := MakeColor(0, lPixel^.rgbRed, lPixel^.rgbGreen, lPixel^.rgbBlue) and $FFFFFF; // Fehler "lPixel^.rgbRed" usw. inaccessible value
        except
          K := 0;
        end;

himitsu 9. Sep 2022 01:36

AW: D11.2 64Bit inaccessible value
 
Versuche mal
Delphi-Quellcode:
lPixel.rgbGreen


Delphi hat hier standardmäßig eine implizite Dereferenzierung, wenn man auf ein Feld oder Methode eines Record-Pointers zugreift.
Vielleicht funktioniert es mit dem Standard-Verhalten besser, als wenn du es explizit/selber dereferenzierst.



oder
Delphi-Quellcode:
var
  p32: PByte;
  //lPixel: PRGBQuad;
begin
  ...

    while X < bm.bmWidth do
    begin
      M := X;

      var lPixel := PRGBQuad(integer(p32) + X * sizeof(cardinal));
      while X < bm.bmWidth do



Ach ja, wenn dein Code mal knallt, weil du Integer(p32) anstatt NativeInt(p32) oder IntPtr(p32) machst, dann zurecht. (ebenso bei integer(bm.bmBits) )
Zitat:

hat auch 64Bit funktioniert
dann hattest zu viel du Glück, aber irgendwann ist es zuende.


Delphi-Quellcode:
lPixel := p32 + X;
(falls niemand die Pointer-Arithmetic deaktiviert hat :stupid:)


Wo ist K definiert?


Was macht MakeColor? Und ich seh da ein
Delphi-Quellcode:
0
... Ist dann
Delphi-Quellcode:
and $FFFFFF
wirklich nötig?
Delphi-Referenz durchsuchenRGB

venice2 9. Sep 2022 01:55

AW: D11.2 64Bit inaccessible value
 
Delphi-Quellcode:
var lPixel := PRGBQuad(integer(p32) + X * sizeof(cardinal));
Macht keinen unterschied.
Delphi-Quellcode:
lPixel.rgbGreen
ebenso wenig.

Es bleibt bei "inaccessible value"

Dein Hinweis mit bm.bmBits hat mich auf die Lösung gebracht. Danke!
Delphi-Quellcode:
p32 := PByte(Long_PTR(bm.bmBits) + (bm.bmHeight - 1) * bm.bmWidthBytes);
lPixel := PRGBQuad(Long_PTR(p32) + X * sizeof(cardinal));


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