|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как определить цвет пикселя на форме?
Доброго дня товарищи.
Имеется две формы. В первой форрме происходит вот такое : Код:
form2.image1.canvas.brush.color := clGreen; form2.image1.canvas.rectangle(0,0,720,9); Однако когда я хочу на второй форме посчитать кол-во зеленых пикселей, то не получается. Например код в цикле : Код:
if image1.canvas.pixels[3,3] = clGreen then x := x + 1 ; |
#2
|
||||
|
||||
Код:
if form2.image1.canvas.pixels[3,3] = clGreen then x := x + 1 ; Пишу программы за еду. __________________ |
#3
|
||||
|
||||
Цитата:
Я пытаюс так : Код:
for x := 1 to 720 do if image1.canvas.pixels[x,3] = clGreen then y := y + 1; Этим кодом пытаюсь посчитать кол-во часов. 1 пиксель = 2 минуты. но это уже другая история) |
#4
|
|||
|
|||
ну осталось только посмотреть отладчиком
Код:
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
|
||||
|
||||
Включил отладчик - меня просто убило.
Итак, нужное мне значение называется не 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
|
||||
|
||||
кошмар...
1. clGreen = TColor($008000); 2. ColorToString(clGreen) = "clGreen" 3. ColorToString($00008200) = $00008200 Пишу программы за еду. __________________ |
#7
|
||||
|
||||
Цитата:
не совсем тебя понял. Я поправил сообщение выше - проблема решена. |
#8
|
||||
|
||||
Колор видимо левый и не входит в перечень определенных констант, вот тебе и выдает шестнадцатиричное значение.
По Ctrl сходи в функцию, увидишь как работает. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#9
|
||||
|
||||
Цитата:
Код:
canvas.brush.color := clGreen |
#10
|
||||
|
||||
NumLock же тебе написал:
Цитата:
Значит у тебя нифига не clGreen. Показывай свой код, или ждём телепатов. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#11
|
||||
|
||||
Окей, раз пошла такая пьянка, еще 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
|
||||
|
||||
Цитата:
Код:
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
|
||||
|
||||
А как можно готовую строку заставить вывести не минуты, а формат 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); |
#14
|
||||
|
||||
Цитата:
В функции, что была выше, надо убрать sec и заменить результирующую строку: Код:
... Result:= FormatDateTime('hh:mm', EncodeTime(hour, min, 0, 0)); ... // А дальше так (вводятся минуты, а на выходе будет форматное время): Label2.Caption := LenPlay(StrToInt(Label1.Caption)); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#15
|
||||
|
||||
Спасибо, получилось.
Кстати, еще момент тогда ). Есть текст, отформатированный. Например rft (непринципиально). Как в нем заменить ровно 2 строки и выбросить на печать? Какой формат лучше использовать? |