Witam!
Załóżmy, że mam wpisany jakiś kolor do TColor. Jak wykryć ten kolor na formie? Chodzi mi o dokładne współrzędne.
Proszę o pomoc.
Witam!
Załóżmy, że mam wpisany jakiś kolor do TColor. Jak wykryć ten kolor na formie? Chodzi mi o dokładne współrzędne.
Proszę o pomoc.
Np. w ten sposób:
procedure TForm1.Button1Click(Sender: TObject);
var x,y: Integer;
szukany_kolor: TColor;
begin
Form1.Canvas.Pixels[10,10]:=clRed;
szukany_kolor:=clRed;
for x:=0 to Form1.Width do
for y:=0 to Form1.Height do
If Form1.Canvas.Pixels[x,y]=szukany_kolor then Form1.Caption:='['+IntToStr(x)+','+IntToStr(y)+']';
Button1.Caption:='Koniec szukania';
end;
Wiadomo, że ta pętla wykona się bardzo szybko. Jednak ja bym dla poprawności dodał tam jeszcze Break'a.
Oczywiście jeśli zależy nam na wskazaniu tylko pierwszego wystapienia, a jak więcej to użyć chocby tablicy.
//...
if Form1.Canvas.Pixels[X, Y] = Szukany_Kolor then
begin
Form1.Caption := '[' + IntToStr(X) + ',' + IntToStr(Y) + ']';
Button1.Caption := 'Koniec szukania';
Break;
end;
Witam!
Dziękuję za odpowiedzi, lecz kod, który wskazał MartinEagle strasznie długo się wykonuje oraz pobiera bardzo dużo pamięci (zawiesza program) :( Czy jest jakiś inny sposób?
Ja innego sposobu nie znam, ale na zablokowanie aplikacji powinno pomóc uruchomienie go w wątku.
Jak coś to artykuł na ten temat: http://4programmers.net/Delphi/Artykuły/Wątki?sid=5512d14e05d7e594f74db2a36b1b67f0
Jeśli masz sporych rozmiarów Formę i "małą" maszynę, to podejrzewam, że przeszukiwanie wolno pójdzie.
Aha, samo wypisywanie: Form1.Caption:='['+IntToStr(x)+','+IntToStr(y)+']' czasowo wykańcza program. Właśnie wypróbowałem.
Nie no jak ustawianie caption'a może wykańczać program. Pętla która się wykonuje kilkaset tysięcy razy może nieco przymulić, ale żeby zawiesić....
Rozwiązań jest kilka:
Optymalizacja olesia to podstawa.
b
b0bik napisał(a)
Nie no jak ustawianie caption'a może wykańczać program.
b
Zrobiłem test:
procedure TForm1.Button1Click(Sender: TObject);
var x,y: Integer;
szukany_kolor: TColor;
begin
Form1.Canvas.Pixels[299,199]:=clRed;
szukany_kolor:=clRed;
for x:=0 to Form1.Width do
for y:=0 to Form1.Height do
If Form1.Canvas.Pixels[x,y] <> szukany_kolor then // znak różności
Form1.Caption:='['+IntToStr(x)+','+IntToStr(y)+']';
Button1.Caption:='Koniec szukania';
end;
czyli skrajny przypadek (szukany kolor na każdym miejscu oprócz ostatniego). Pomijając precyzyjny pomiar, czyli ze stoperem w ręku, przeszukanie i wypisanie każdej pozycji zajęło 2min16sek.
Natomiast zastępując <> znakiem = , bardzo bardzo krótko to trwało. Więc zamula program, choć nie zawiesza.
getFormImage (czy tam bitmap) + scanline to chyba najrozsądniejsze rozwiazanie.
MartinEagle napisał(a)
przeszukanie i wypisanie każdej pozycji zajęło 2min16sek
Założe się że ze scanline nie zajmie 10s.
b
.Pixels[] jest zue - szczerze to nie powinno być go wcale.
b0bik napisał(a)
MartinEagle napisał(a)
przeszukanie i wypisanie każdej pozycji zajęło 2min16sek
Założe się że ze scanline nie zajmie 10s.
b
Gratuluję czytania ze zrozumieniem. :)