Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.06.2018, 10:30
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сканер цвета

Доброго времени суток!

Помогите пожалуйста с модулем - он же сканер цвета.
Вот код модуля, в котором 3 процедуры.

Код:
unit Unit2;

interface

uses
  Classes, Graphics;

type
  TScan = class(TThread)
  private
    Procedure FindVisual;
    Procedure Control;
  protected
    procedure Execute; override;
  end;

Var
  Scan : TScan;

implementation

Uses Unit1;

{ TScan }

Procedure TScan.FindVisual;
Begin
  Form1.Panel1.Color:= clLime;
End;

Procedure TScan.Control;
Begin
  Form1.Panel1.Color:= clRed;
End;

procedure TScan.Execute;
var
  x,y : integer;
begin
  Repeat
    For x:=X1 To X2 Do
    For y:=Y1 To Y2 Do
//    If GetPixel(c.Handle,x,y)=Cl Then
    If c.Pixels[x,y]=Cl Then Synchronize(FindVisual);
  Until Terminated;
end;

end.

Procedure TScan.Execute - сканирует указанную область экрана на соответствие цвета, который выбран в ColorDialog на основной форме и если условие выполняется, то передает команду процедуре TScan.FindVisual.
Procedure TScan.FindVisual - обрабатывает результаты со сканера и выполняет действие № 1.
Проблема возникла вот в чем. Как правильно прописать в процедуре TScan.Execute условие когда в заданой области нет того самого цвета, который выбран в ColorDialog на основной форме и передать команду процедуре TScan.Control, которая будет выполнять действие № 2.

Спасибо заранее!
Ответить с цитированием
  #2  
Старый 27.06.2018, 14:56
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Да нет, немного по-другому этот код работает чем описано, образец не с экрана поступает, а из битмапа с, проще отслеживать напрямую, примерно так
Код:
var
DC: HDC;
begin
DC:= GetDC(0);
Panel2.Color:= GetPixel(DC, X, Y);
ReleaseDC(0, DC);
end;
Насчёт "Как правильно прописать в процедуре TScan.Execute условие когда в заданой области нет того самого цвета" у пары if..then есть замечательное дополнение else, это как раз второе условие когда не выполняется первое

Идею в принципе уловил, непонятки лишь насчёт отслеживаемых пикселей что в промежутке между X1Y1..X2Y2, как они определяются, предложенный из drkb кусман проверен на обработчике сдвига мышки, панелька окрашивается в цвет пикселя что под курсором, оно работает
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (27.06.2018)
  #3  
Старый 27.06.2018, 18:18
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Добрый вечер многоуважаемый Alegun!

Туть суть немного в другом. Цвет панели, это как бы я указал просто, опеределенное действие. А теперь поясню чтобы не было как раз тех самых непоняток. С главной формы я определяю координаты области экрана (верхний левый угол - X1Y1, правый нижний угол - X2Y2), в компоненте ColorDialog указываю необходимый цвет (например красный), который должен находиться в области X1Y1 X2Y2, и если он там есть то выполняется одно условие. Вот этот и есть модуль-сканер цвета, который запускается по таймеру каждые 15 секунд, и проверяет это самое условие, т.е. если допустим красный цвет попадает в область X1Y1 X2Y2 то программа выполняет действие (пускай будет клик мышки). А если сканер не находит этот красный цвет, то останавливает выполнения действия (клик мышки), при этом сканер продолжает работать и искать все в той же области искомый цвет (красный) с тем же интервалом 15 секунд, и если через вдруг при очередном сканировании находит искомый красный цвет, то возобновляет выполнение действия (клик мышки).
Этот код я видел, он мне немного не пожходит вот почему. Тут условие такое, что мышь в это время находится вне области X1Y1 X2Y2 и выполняет опеределенное действие, а этот код и определяет цвет под курсором, т.е. в том месте где находится мышь, при этом координаты нахождения мыши на экране фиксированы и записаны (т.е. никаких лево и право) и она соответственно будет бить все время в один пиксель, в одном месте.
У меня собственно в сканере (код выше) получилось сделать так:
Код:
procedure TScan.Execute;
var
  x,y : integer;
begin
  Repeat
    For x:=X1 To X2 Do
    For y:=Y1 To Y2 Do
//    If GetPixel(c.Handle,x,y)=Cl Then
    If c.Pixels[x,y]=Cl Then Synchronize(FindVisual);

  else If c.Pixels[x,y]<>Cl Then Synchronize(Conrtol);
  Until Terminated;
end;

Но тут проблема у меня в <>Cl и я это понимаю, так как значение CL может быть и больше и меньше, и оно может тоже попадать в область X1Y1 X2Y2 соответсвенно это не то требование, которое мне нужно. А как по уму записать это условие, у меня чот голова не догоняет пока.
Т.е. нужно следующее - если в области X1Y1 X2Y2 искомый цвет то выполняется процедура 1, если в этой же области этого цвета нет, то выполняется процедура 2. Однако этот искомый цвет может появляться и исчезать периодически. Для этого собственно и сделал сканер, который работает по времени.
Добиться того чтобы выполнялось действие 1 у меня в принципе получилось, вот теперь осталось получить действие 2 при работе сканера... а на что заменить вот этот кусок If c.Pixels[x,y]=Cl я не знаю.

Последний раз редактировалось LIONSMILE, 27.06.2018 в 18:21.
Ответить с цитированием
  #4  
Старый 27.06.2018, 19:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. комбинация "<>" означает "не равно".
2. if в else там вообще не нужен, бо как цвет либо равен, либо не равен, т.е. код можно переделать так:
Код:
procedure TScan.Execute;
var
  x,y : integer;
begin
  Repeat
    For x:=X1 To X2 Do
    For y:=Y1 To Y2 Do
    If c.Pixels[x,y]=Cl 
      Then Synchronize(FindVisual)
      Else Synchronize(Conrtol);
  Until Terminated;
end;

ЗЫ. Ну и ошибка там в коде была, так что он вообще компилиться не должен был.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
LIONSMILE (28.06.2018)
  #5  
Старый 27.06.2018, 19:53
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда здесь в циклах вроде проверять нужно весь диапазон, типа
Код:
procedure TScan.Execute;
var
  x,y : integer;
  flg: boolean;
begin
  flg:= false;
  Repeat
    For x:=X1 To X2 Do
    For y:=Y1 To Y2 Do
    If c.Pixels[x,y]=Cl then flg:= true;
     if flg Then Synchronize(FindVisual)
      Else Synchronize(Conrtol);
  Until Terminated;
end;
тогда если хоть один пиксель нужный есть - сработает, иначе отбой
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (28.06.2018)
  #6  
Старый 28.06.2018, 10:10
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Alegun, Lmikle Огромное спасибо! Все работает.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter