Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi [delphix] ctrl-alt-del fehler canvas does not allow drawing (https://www.delphipraxis.net/124513-%5Bdelphix%5D-ctrl-alt-del-fehler-canvas-does-not-allow-drawing.html)

mikeSK 20. Nov 2008 10:45


[delphix] ctrl-alt-del fehler canvas does not allow drawing
 
hallo,

ich habe ein Timer, ich benutze Canvas.
wenn ich presse cltr+alt+del, windows-sicherheit Fenster zeigt. Dann presse ich esc.

ein dialog ziegt "canvas does not allow drawing"

wie kann man das umgehen? ich habe viel versucht, aber nichts funkcioniert.
canvas.lock und try und finally hilft nicht.
est is auch so, wenn du ein demo von undelphix startest.

ist das delphi problem? oder undeplhix problem?

ich benutze delphi 7 enterprise und win xp

Michal

Luckie 20. Nov 2008 10:55

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
Zeichnest du in einem Thread auf den Canvas einer VCL Komponente? Wenn ja, musst du dies mit dem hauptthread synchronisieren, da die VCL nicht threadsafe ist.

DevidEspenschied 20. Nov 2008 10:59

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
Zitat:

Zitat von Luckie
Zeichnest du in einem Thread auf den Canvas einer VCL Komponente? Wenn ja, musst du dies mit dem hauptthread synchronisieren, da die VCL nicht threadsafe ist.

Wie macht man das ? Gibt es dafür Beispiele oder ein Tutorial ?

Luckie 20. Nov 2008 11:01

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
Siehe Delphi Hilfe Delphi-Referenz durchsuchenSynchronize.

mikeSK 20. Nov 2008 11:03

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
das weis ich nicht.
ich zeichne ins form.dxdraw.surface.canvas.pixels[...
nur ein Pixel ist genug.

was is Hauptthread? und wie kann ich die Synchronization machen?

wo im Code kann ich definieren, dass das dialog box "canvas does not allow drawing" nicht angerufen ist?

Luckie 20. Nov 2008 11:05

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
Du benutzt anscheinend DirectX, aber damit kenne ich mich auch nicht aus.

Wäre übrigens schön, wenn man mal solche Informationen gleich im ersten Beitrag bekommen würde. :?

Morphie 20. Nov 2008 13:22

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
steht doch im Titel ;-)

Zeig doch mal deinen Code, mit dem du versuchst auf das Canvas zu zeichnen...

mikeSK 20. Nov 2008 13:31

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
Code ist sehr einfach. Aber die Nachricht "canvas does not allow drawing" ist schrecklich. Alle Demo Beispiele reagieren auf ctlr+alt+del mit diesem DialogBox.
Delphi-Quellcode:
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
  if not DXDraw.CanDraw then exit;

  DXDraw.Surface.Fill(0);

  with DXDraw.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Color := clWhite;
    Font.Size := 30;

    if not dxdraw.CanDraw then exit;
      Textout(30, 30, DateTimeToStr(Now));

    Release; {  Indispensability }
  end;

  DXDraw.Flip;
end;
Ich versuchte auch:
Delphi-Quellcode:
try
  textout...
except
end;
funcioniert nicht

canvas.lock hilft auch nicht

auch Andorra hat diese Probleme (ohne Dialog box, aber the Screen (form) ist schwarz ohne Update)

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen :-) Mfg, SirThornberry[/edit]

Morphie 20. Nov 2008 14:05

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
Hmm bis auf das doppelte
Delphi-Quellcode:
if not dxdraw.CanDraw then exit;
sieht eigentlich alles ganz richtig aus.

Liegt es vielleicht an deiner DirectX-Version?
Oder gar an deinem Rechner?

Schon mal an einem anderen Rechner versucht, das Programm auszuführen?

mikeSK 20. Nov 2008 15:44

Re: [delphix] ctrl-alt-del fehler canvas does not allow draw
 
Also ich benutzte CPU listing.
Problem ist in diese Funktion: TCanvas.RequiredState

Google kann helfen. Auch in Delphi Code gibt es Bugs:
http://qc.codegear.com/wc/qcmain.aspx?d=5132
Aber dieser Bug hilft nicht.

Dann habe ich diese Procedure gefixt (in Graphics.pas):
Es funkcioniert sehr gut, aber ich muss noch ein paar Teste machen.

OLD PROCEDURE

Delphi-Quellcode:
procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
  NeededState: TCanvasState;
begin
  NeededState := ReqState - State;
  if NeededState <> [] then
  begin
    if csHandleValid in NeededState then
    begin
      CreateHandle;
      if FHandle = 0 then
        raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
    end;
    if csFontValid in NeededState then CreateFont;
    if csPenValid in NeededState then CreatePen;
    if csBrushValid in NeededState then CreateBrush;
    State := State + NeededState;
  end;
end;
NEW PROCEDURE

Delphi-Quellcode:
procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
  NeededState: TCanvasState;
begin
  NeededState := ReqState - State;
  if NeededState <> [] then
  begin
    if csHandleValid in NeededState then
    begin
      CreateHandle;
      if FHandle = 0 then exit; //// ---- CHANGED LINE
      //  raise EInvalidOperation.CreateRes(@SNoCanvasHandle); ////---- LINE SKIPPED
    end;
    if csFontValid in NeededState then CreateFont;
    if csPenValid in NeededState then CreatePen;
    if csBrushValid in NeededState then CreateBrush;
    State := State + NeededState;
  end;
end;
[edit=Admin]Delphi-Tags ergänzt. Künftig bitte selber machen, danke. ;-) Mfg, Daniel[/edit]


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