Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VST BiltBlt im AfterCellPaint liefert False (https://www.delphipraxis.net/216906-vst-biltblt-im-aftercellpaint-liefert-false.html)

Hobbycoder 21. Mär 2025 17:30

VST BiltBlt im AfterCellPaint liefert False
 
Hi,

ich möchte eine Grafik ein einer Zelle im VirtualStringTree zeichnen.
Mit TargetCanvas.Draw geht das ohne Probleme. BitBlt liefert jedoch ein False.

Während hier nur ein leer Zelle erscheint
Delphi-Quellcode:
BitBlt(TargetCanvas.Handle, CellRect.Left, CellRect.Top, CellRect.Width, CellRect.Height, T.picture.Bitmap.Handle, 0, 0, SRCCOPY);
wird das richtig gezeichnet.
Delphi-Quellcode:
if not BitBlt(TargetCanvas.Handle, CellRect.Left, CellRect.Top, CellRect.Width, CellRect.Height, T.picture.Bitmap.Handle, 0, 0, SRCCOPY) then
  TargetCanvas.Draw(CellRect.Left, CellRect.Top, T.picture.Bitmap);
Kennt jemand die Ursache?

jaenicke 21. Mär 2025 18:12

AW: VST BiltBlt im AfterCellPaint liefert False
 
Was sagt denn GetLastError bzw. SysErrorMessage(GetLastError)? Laut Doku wird der Wert ja gefüllt, wenn die Funktion nicht erfolgreich ist.

Hobbycoder 24. Mär 2025 11:31

AW: VST BiltBlt im AfterCellPaint liefert False
 
Delphi-Quellcode:
if not BitBlt(TargetCanvas.Handle, CellRect.Left+1, CellRect.Top+1, CellRect.Width-2, CellRect.Height-2, T.picture.Bitmap.Handle, 0, 0, SRCCOPY) then
  ShowMessage(SysErrorMessage(GetLastError));
GetLastError liefert 0 btw. "Der Vorgang wurde erfolgrech beenden". Jedoch liefert BitBlt definitiv False.

Uwe Raabe 24. Mär 2025 12:33

AW: VST BiltBlt im AfterCellPaint liefert False
 
Das könnte daran liegen, dass BOOL aus 4 Byte besteht, ein Boolean aber nur aus 1 Byte. Caste doch mal den Rückgabewert von BitBlt in Longint und prüfe das auf 0.

Hobbycoder 25. Mär 2025 12:18

AW: VST BiltBlt im AfterCellPaint liefert False
 
Delphi-Quellcode:
var
  LB: LongBool;
begin
  lb:=BitBlt(TargetCanvas.Handle, CellRect.Left+1, CellRect.Top+1, CellRect.Width-2, CellRect.Height-2, T.picture.Bitmap.Handle, 0, 0, SRCCOPY);
  if not lb then
  .
  .
Laut Debugger ist lb=False

Uwe Raabe 25. Mär 2025 12:40

AW: VST BiltBlt im AfterCellPaint liefert False
 
Das ist nicht so ganz was ich vorgeschlagen hatte. Auch bei diesem Code wird ein 4-Byte-LongBool in einen 1-Byte-Boolean konvertiert - ob der nun im Debugger dargestellt oder in einem
Delphi-Quellcode:
if not
abgefragt wird. Wenn bei der Konvertierung nur das niedrige Byte berücksichtigt wird kann das auch mal schiefgehen.

Versuch doch mal dies:
Delphi-Quellcode:
var
  LB: LongBool;
begin
  lb := BitBlt(TargetCanvas.Handle, CellRect.Left+1, CellRect.Top+1, CellRect.Width-2, CellRect.Height-2, T.picture.Bitmap.Handle, 0, 0, SRCCOPY);
  if LongInt(LB) <> 0 then
  .
  .
Am Ende ist für die WinApi ein BOOL immer noch eine Zahl.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 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 by Thomas Breitkreuz