![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 сходи в функцию, увидишь как работает. |
|
#9
|
||||
|
||||
|
Цитата:
Код:
canvas.brush.color := clGreen |
|
#10
|
||||
|
||||
|
NumLock же тебе написал:
Цитата:
Значит у тебя нифига не clGreen. Показывай свой код, или ждём телепатов. |
|
#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 строки и выбросить на печать? Какой формат лучше использовать? |