Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit function und canvas (https://www.delphipraxis.net/106632-problem-mit-function-und-canvas.html)

k4ni 14. Jan 2008 11:07


Problem mit function und canvas
 
hey leute.

Ich verzweifel.
Ich hab hier diese function gemacht:

Delphi-Quellcode:
function TForm1.LogCheck(): Boolean;
var
 DCanvas: TCanvas;
 DHandle: HDC;
begin
 DHandle:=GetDC(0);
 if DHandle<>0 then
 begin
   try
     DCanvas:=TCanvas.Create;
     try
     DCanvas.Handle:=DHandle;
     if DCanvas.Pixels[487, 481] = RGB(255, 255, 255)
       then
       begin
       Result := true;
       end
       else
       Result := false;
     finally
       DCanvas.Free;
     end;
    finally
      if ReleaseDc(0, DHandle)<>1 then
        RaiseLastOSError;
    end;
 end
 else
   RaiseLastOSError;
end;
Soweit alles ok. Hab das auch mit nem anderen programm schon getestet, funktioniert super.
So doch das will ich in eine repeat-schleife einbauen das wäre dann so:

Delphi-Quellcode:
procedure TForm1.Schleife();
begin
repeat
if LogCheck() = true then
Exit;

...
...
until
...
end;
Doch auch wenn das Result von LogCheck true ist hoert er einfach nicht auf. Woran könnte das liegen?

Aurelius 14. Jan 2008 11:18

Re: Problem mit function und canvas
 
Man soll ja nicht auf
Delphi-Quellcode:
if Bool = True then
prüfen sondern
Delphi-Quellcode:
if Bool then
.

Versuch es mal so.

DeddyH 14. Jan 2008 11:19

Re: Problem mit function und canvas
 
Und wenn Du Exit mal durch break ersetzt? Übrigens nie auf true prüfen, das kann danebenegehen.

Klaus01 14. Jan 2008 11:24

Re: Problem mit function und canvas
 
Delphi-Quellcode:
function TForm1.LogCheck(): Boolean;
var
  DCanvas: TCanvas;
  DHandle: HDC;
begin
  DHandle:=GetDC(0);
  if DHandle<>0 then
    begin
      try
        DCanvas:=TCanvas.Create;
        try
          DCanvas.Handle:=DHandle;
          result := DCanvas.Pixels[487, 481] = RGB(255, 255, 255)
        finally
          DCanvas.Free;
        end;
      finally
        if ReleaseDc(0, DHandle)<>1 then
          RaiseLastOSError;
      end;
    end
  else
    RaiseLastOSError;
end;
Im obigen Code is result nicht definiert wenn DHandle = 0 ist
und wenn DCanvas.Create fehlgeschlagen ist.
Delphi-Quellcode:
procedure TForm1.Schleife();
begin
  repeat
    if LogCheck then
      Exit;

  until // Bedingung fehlt
 
end;
Hier ist noch dazu zu sagen das man niemals auf = true prüfen sollte.
LogChecl liefert doch schon ein Boolean zurück.

Grüße
Klaus

turboPASCAL 14. Jan 2008 11:28

Re: Problem mit function und canvas
 
Also 1.

Einen Canvas (TCanvas) zu erstellen und nach ein paar Millesec. wieder zu
zerstören halte ich für keine gute Idee. Das geht einfacher und effektiver.

Delphi-Quellcode:
function TForm1.LogCheck(): Boolean;
var
  hDeskDC: HDC;
  hDeskWnd: HWND;
begin
  Result := FALSE;

  hDeskWnd := GetDesktopWindow;
  hDeskDC := GetDC(hDeskWnd);

  if hDeskDC <> 0 then
  begin
     if Windows.GetPixel(hDeskDC, 487, 481) = RGB(255, 255, 255)
       then Result := TRUE
       else Result := FALSE;
  end;

  ReleaseDC(hDeskWnd, hDeskDC);
end;
( Code ist nicht von mir getestet, also selber nachgucken. )

2.)

Schlägt eine IF-Abfrage ( if DHandle<>0 then ) fehl weil etwas nicht stimmt
hat deine Function keinen vordef. Rückgabewert. Die Whileschleife kann sich u.U. einen Wolf
laufen. ;)

// Edit:

Vergiss in deiner While-Schleife nicht Application.ProcessMessages einzubauen, sonst
hängt dein Programm weil dieMessages nicht weiterverarbeitet werden.

raiguen 14. Jan 2008 11:58

Re: Problem mit function und canvas
 
Wenn schon mit 'ner repeat-Schleife, dann würd' ich das so machen:
Delphi-Quellcode:
procedure TForm1.Schleife();
var IstOkay: Boolean;
begin
//--sicherheitshalber
IstOkay := false;
repeat
  IstOkay := LogCheck();
until IstOkay;
end;

DeddyH 14. Jan 2008 12:07

Re: Problem mit function und canvas
 
Noch besser wäre allerdings IMHO eine Kopfschleife.
Delphi-Quellcode:
while not LogCheck do...

k4ni 14. Jan 2008 14:11

Re: Problem mit function und canvas
 
Also wegen der function von mir, ich hab die mit einem timer getestet, wenn es da und do diese farbe hat geht das label auf 'Pass' sonst auf 'Passt nicht', ging super.

Ich hab jetzt die sachen von hier getestet aus der mit dem "until Bool" ding weil ich bei until das drinne hab: 'Odd(GetAsyncKeyState(VK_f10))'.

Aber ich blick das nicht warum der nicht einfach aushört :?

turboPASCAL 14. Jan 2008 14:19

Re: Problem mit function und canvas
 
Also, ich würde da keinen Timer nehmen, der ist ggf. zu langsam. Ein Thread ist da besser.

Wenn dein Quelltext nicht so recht funktion. könnenwir nur helfen wenn du ihn herzeigst. ;)
Wenn du willst häng ihn mal als Zip an einen Beitrag an.

Muetze1 14. Jan 2008 14:23

Re: Problem mit function und canvas
 
Zitat:

Zitat von k4ni
Aber ich blick das nicht warum der nicht einfach aushört :?

Wie kommst du zu diesem Schluß, dass er nicht aufhört? Also wie kommst du darauf, dass das der Fehler ist?

Weil wenn ich folgendes lese:

Zitat:

Zitat von k4ni
Also wegen der function von mir, ich hab die mit einem timer getestet, wenn es da und do diese farbe hat geht das label auf 'Pass' sonst auf 'Passt nicht', ging super.

Habe ich die Vermutung, dass du es nun immernoch so machst, aber er keine Zeit hat das Label zu malen in der Schleife. Kann es sein?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 Uhr.
Seite 1 von 2  1 2      

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