Pobieranie koloru – problem z opóźnieniem

0

Co robię źle że dopiero po przejechaniu 3/4 pikseli z danym kolorem program mi pobiera kolor?

procedure TForm_pobieranie_koloru.kolor;
var
   pozycja: TPoint;
begin
  GetCursorPos(pozycja); 
  Panel2.Color := KolorPiksela(pozycja.X, pozycja.Y); // wyświetlanie elementu w danym kolorze 
  Panel3.caption := KolorFormatowany(KolorPiksela(pozycja.X, pozycja.Y)); // wyświetlanie nazwy dla koloru
end;

a poniżej funkcje KolorPiksela i KolorFormatowany:

function KolorPiksela(const X, Y: Integer): TColor;
var
  k: TCanvas;
begin
  k := TCanvas.Create;
  try
    k.Handle := GetWindowDC(GetDesktopWindow);
    Result   := GetPixel(k.Handle, X, Y); // X- szerokość Y-wysokość 
  finally
    k.Free;
  end;
end; 
function KolorFormatowany(DColor:TColor):string;
var
  temp_RGB : TColorRef;
begin
  temp_RGB := ColorToRGB(DColor) ;
  Result:=Format('#%.2x%.2x%.2x',[GetRValue(temp_RGB),GetGValue(temp_RGB),GetBValue(temp_RGB)]);
end;  
0
XA napisał(a):

Co robię źle że dopiero po przejechaniu 3/4 pikseli z danym kolorem program mi pobiera kolor?

A po polsku? Wybacz, ale to zdanie jest niejasne i zbyt ogóle.

procedure TForm_pobieranie_koloru.kolor;
var
   pozycja: TPoint;
begin
  GetCursorPos(pozycja); 
  Panel2.Color := KolorPiksela(pozycja.X, pozycja.Y); // wyświetlanie elementu w danym kolorze 
  Panel3.caption := KolorFormatowany(KolorPiksela(pozycja.X, pozycja.Y)); // wyświetlanie nazwy dla koloru
end;

Paskudne identyfikatory wybierasz… Nigdy nie pisz kodu po polsku, bo – wbrew pozorom – jest mniej czytelny niż angielski. Poza tym, nazwa każdej funkcji powinna rozpoczynać się od czasownika – Get*, Set*, Update*, Prepare* itd.

function KolorPiksela(const X, Y: Integer): TColor;
var
  k: TCanvas;
begin
  k := TCanvas.Create;
  try
    k.Handle := GetWindowDC(GetDesktopWindow);
    Result   := GetPixel(k.Handle, X, Y); // X- szerokość Y-wysokość 
  finally
    k.Free;
  end;
end; 

Ten kod nie jest zły, tyle tylko że każdorazowe wywołanie tej funkcji oznacza stworzenie płótna, pobranie uchwytu, zwrócenie koloru i zwolnienie płótna. Na kilka wywołań może być, ale o pętli skanującej ekran zapomnij. W takim przypadku najpierw stwórz płótno i ustaw uchwyt, następnie przeskanuj wszystkie zadane piksele (GetPixel i nic więcej), a na koniec zwolnij płótno – będzie działać tysiąc razy szybciej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1