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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.02.2013, 09:11
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию Как определить цвет пикселя на форме?

Доброго дня товарищи.
Имеется две формы. В первой форрме происходит вот такое :
Код:
form2.image1.canvas.brush.color := clGreen;
form2.image1.canvas.rectangle(0,0,720,9);
При этом на второй форме рисуется прямоугольник 720 на 9 , зеленый.
Однако когда я хочу на второй форме посчитать кол-во зеленых пикселей, то не получается. Например код в цикле :
Код:
if image1.canvas.pixels[3,3] = clGreen then x := x + 1 ;
То условие не сработает. Что делаю не так?
Ответить с цитированием
  #2  
Старый 01.02.2013, 09:28
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
if form2.image1.canvas.pixels[3,3] = clGreen then x := x + 1 ;
размер картинки больше или равен 720 на 9?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 01.02.2013, 09:35
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
Код:
if form2.image1.canvas.pixels[3,3] = clGreen then x := x + 1 ;
размер картинки больше или равен 720 на 9?
Сам image ровно 720 на 9.
Я пытаюс так :
Код:
for x := 1 to 720 do if image1.canvas.pixels[x,3] = clGreen then y := y + 1;
Т.е. по русски сказать, есть временной отрезок у меня, в виде image. На нем зеленым закрашены часы, например с 2 до 3 дня.
Этим кодом пытаюсь посчитать кол-во часов.
1 пиксель = 2 минуты. но это уже другая история)
Ответить с цитированием
  #4  
Старый 01.02.2013, 11:36
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

ну осталось только посмотреть отладчиком

Код:
var
  C:TColor;
  X,Y:Integer;


Y:=0;
for X:=1 to 720 do
begin
  C:=form2.image1.canvas.pixels[X,3];
  if C = clGreen then
    Y:=Y+1;
end;

выключить оптимизацию, сделать останов на строке 10 и посмотреть, чему равен C;
Ответить с цитированием
  #5  
Старый 01.02.2013, 11:43
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Включил отладчик - меня просто убило.
Итак, нужное мне значение называется не clGreen , а $00008200. окей, хорошо, теперь начинается самое интересное ))
Код
Код:
if colortostring(image1.Canvas.Pixels[3,3]) = '$00008200' then application.MessageBox('','');
Работать не будет)))
А в тем временем :
Код:
label1.Caption := colortostring(image1.Canvas.Pixels[3,3]);
if label1.Caption  = '$00008200' then application.MessageBox('','');
- прекрасно работает.
Шо за бред?
не хочется такой костыль втыкать в программу
**************
З.ы. Попробовал делать как раньше - стер весь код и написал заново. в таком положении работает. Видать руки кривые :
Код:
for x := 1 to 720 do if colortostring(image1.Canvas.Pixels[x,3])  = '$00008200' then label1.Caption := floattostr(strtofloat(label1.Caption) + 2);

Последний раз редактировалось alexusankov, 01.02.2013 в 11:53.
Ответить с цитированием
  #6  
Старый 01.02.2013, 11:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

кошмар...

1. clGreen = TColor($008000);
2. ColorToString(clGreen) = "clGreen"
3. ColorToString($00008200) = $00008200
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 01.02.2013, 11:55
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
кошмар...

1. clGreen = TColor($008000);
2. ColorToString(clGreen) = "clGreen"
3. ColorToString($00008200) = $00008200
****
не совсем тебя понял. Я поправил сообщение выше - проблема решена.
Ответить с цитированием
  #8  
Старый 01.02.2013, 11:55
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Колор видимо левый и не входит в перечень определенных констант, вот тебе и выдает шестнадцатиричное значение.
По Ctrl сходи в функцию, увидишь как работает.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 01.02.2013, 12:04
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Колор видимо левый и не входит в перечень определенных констант, вот тебе и выдает шестнадцатиричное значение.
По Ctrl сходи в функцию, увидишь как работает.
Ну так этот цвет то я рисовал с помощью
Код:
canvas.brush.color := clGreen
Ответить с цитированием
  #10  
Старый 01.02.2013, 12:11
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

NumLock же тебе написал:

Цитата:
Сообщение от NumLock
1. clGreen = TColor($008000);
2. ColorToString(clGreen) = "clGreen"
3. ColorToString($00008200) = $00008200

Значит у тебя нифига не clGreen.

Показывай свой код, или ждём телепатов.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 01.02.2013, 12:29
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Окей, раз пошла такая пьянка, еще 1 вопрос тогда будет. Код пожалуйста.
Код:
form5.Image1.Canvas.Brush.Color :=clGreen;
form5.Image1.Canvas.Rectangle(0,0,720,9);
*****
Код:
for i:= 1 to 47 do for x := 1 to 720 do if colortostring((FindComponent('image'+inttostr(i)) as Timage).Canvas.Pixels[x,7])  = '$00008200' then (FindComponent('label'+inttostr(i)) as Tlabel).Caption  := floattostr(strtofloat((FindComponent('label'+inttostr(i)) as Tlabel).Caption) + 2);
Все работает.
остался 1 вопрос. В итоге у меня на label1.caption появляется количество пикселей * 2 = количество минут.
Как мне сделать, чтобы не ко-во минут показывалось, а кол - во часов / минут.
Т.е. не 190 а 3,10

И тема вопроса не раскрыта. Почему красим в clGreen, а определять приходится не зеленый а его оттенок

Последний раз редактировалось alexusankov, 01.02.2013 в 15:08.
Ответить с цитированием
  #12  
Старый 03.02.2013, 03:40
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от alexusankov
...Как мне сделать, чтобы не ко-во минут показывалось, а кол - во часов / минут.
Т.е. не 190 а 3,10
...
Можно и так:
Код:
function LenPlay(ds: integer): string;
var
 hour, min, sec: integer;
begin
 min := ds div 60;
 hour:= min div 60;
 if min > 60 then min:= min mod 60;
 sec := ds mod 60;
 Result:= FormatDateTime('h:mm:ss', EncodeTime(hour, min, sec, 0));
end;
А лучше всего в хелпе про функции для работы со временем прочесть.
Ответить с цитированием
  #13  
Старый 04.02.2013, 11:03
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

А как можно готовую строку заставить вывести не минуты, а формат hh.mm?
Строка :
Код:
for i:= 1 to 47 do for x := 1 to 720 do if colortostring((FindComponent('image'+inttostr(i)) as Timage).Canvas.Pixels[x,7])  = '$00008200' then (FindComponent('label'+inttostr(i)) as Tlabel).Caption  := floattostr(strtofloat((FindComponent('label'+inttostr(i)) as Tlabel).Caption) + 2);
З.ы. в label(x) - лежит значение минут
Ответить с цитированием
  #14  
Старый 04.02.2013, 15:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от alexusankov
А как можно готовую строку заставить вывести не минуты, а формат hh.mm?

В функции, что была выше, надо убрать sec и заменить результирующую строку:
Код:
...
  Result:= FormatDateTime('hh:mm', EncodeTime(hour, min, 0, 0));
...

// А дальше так (вводятся минуты, а на выходе будет форматное время):
  Label2.Caption := LenPlay(StrToInt(Label1.Caption));
Ответить с цитированием
  #15  
Старый 04.02.2013, 16:45
Аватар для alexusankov
alexusankov alexusankov вне форума
Новичок
 
Регистрация: 27.08.2012
Сообщения: 78
Версия Delphi: C++/Delphi 2010
Репутация: 10
По умолчанию

Спасибо, получилось.
Кстати, еще момент тогда ).
Есть текст, отформатированный. Например rft (непринципиально).
Как в нем заменить ровно 2 строки и выбросить на печать?
Какой формат лучше использовать?
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter