| 
| 
 | Вопрос # 1 277/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!Я прошу вас помочь с доработкой программы:
 Мне нужно создать приложение на форму которого помещены компоненты:Label-2шт, Image-1шт. И написать обработчик событий OnMouseMove компонента Image, который отображает с помощью первого компонента Label координаты мыши, а с помощью второго Label цвет каждой составляющей(красной,синей,зеленой) пикселя в текущих координатах.
 Вопрос: 1)как координаты объединить в один Label
 2)как отобразить цвет пикселя во второй Label на который навел. Второй вопрос важнее.
 Кто поможет, заранее спасибо!!!
 Приложение:Переключить в обычный режим    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);   beginlabel1.Caption:=inttostr(x);label2.Caption:=inttostr(y);  
|  |   Вопрос задал: Smirnov Ivan (статус: Посетитель)Вопрос отправлен: 20 января 2008, 14:01
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Dron Здравствуйте, Smirnov Ivan!Вероятно, вы новичок в программировании, потому что первый вопрос очень простой. Label.Caption - строка, текст, а чтобы "связать" две строки в одну, достаточно их сложить (знаком "+"). Поэтому координаты отобразить можно так:
 
 Label1.Caption:=IntToStr(X)+' , '+IntToStr(Y);Теперь насчёт цвета. Не совсем понятна фраза "пытался так, но похоже он отображает цвет с помощью координат, а не пикселя". Получить цвет точки можно именно через Canvas, только вопрос в том, с какой именно канвой работать. Это зависит от типа изображения загруженного в TImage. К примеру, если загружена картинка из файла *.bmp, то нужно обращаться к Picture.Bitmap: 
 Label2.Color:=Image1.Picture.Bitmap.Canvas.Pixels[X,Y];Обращение напрямую к Image.Canvas не всегда даст успех. Удачи!
 
|  | Ответ отправил: Dron (статус: Студент)Время отправки: 20 января 2008, 14:20
 Оценка за ответ: 5
 Комментарий к оценке: Dron спасибо!Первый ответ правильный и второй тоже.Во втором у меня написано:
 label3.Color:=image1.Canvas.Pixels[x,y];
 это опечатка, просто по ходу редактирования текста, половина куда-то подевалось а так было написано:Label3.Color:=Image1.Picture.Bitmap.Canvas.Pixels[X,Y];
 
 После твоего ответа я попробовал создать в Pait файл *.bmp и у меня получилось,а когда брал другие bmp файлы эта функция работала не корректно).
 Благодарю, удачи!
 
 |  Ответ #2. Отвечает эксперт: Николай Рубан Здравствуйте, Smirnov Ivan!
 В дополнение к предыдущему ответу, скажу что если Вам предварительно не извесен формат картинки, то можно обратится к канвасу самой формы. Так же в примере полученный цвет отображается в RGB.
 
 procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var r,g,b:Byte;
    rgb:TColor;
begin
  Label1.Caption:=Format('%dx%d',[x,y]);
  rgb:=ColorToRGB(Form1.Canvas.Pixels[x,y]);
  Label2.Caption:=Format('R=%d G=%d B=%d',[GetRValue(rgb),GetGValue(rgb),GetBValue(rgb)]);
end;Good Luck!!!
 
|  | Ответ отправил: Николай Рубан (статус: 10-ый класс)Время отправки: 20 января 2008, 15:28
 Оценка за ответ: 5
 Комментарий к оценке: Спосибо!Тоже может пригодиться)
 |  
 Мини-форум вопросаВсего сообщений: 5; последнее сообщение — 21 января 2008, 18:44; участников в обсуждении: 3. 
|   | Smirnov Ivan (статус: Посетитель), 20 января 2008, 16:22 [#1]:Причем функция label1.Color:=image1.Canvas.Pixels[x,y];
 тоже действует)
 |  
|   | Dron (статус: Студент), 20 января 2008, 16:44 [#2]:Smirnov Ivan: 
 Цитата: Причем функция label1.Color:=image1.Canvas.Pixels[x,y]; тоже действует) Ну, это не функция, а строка программного кода, команда. Лучше называть вещи своими именами.
 
 Николай Рубан:
 В коде "r,g,b:Byte;" - лишнее
   С уважением. |  
|   | Smirnov Ivan (статус: Посетитель), 20 января 2008, 18:42 [#3]:“Цитата” () Ну, это не функция, а строка программного кода, команда. Лучше называть вещи своими именами.
 
 Запомню, на будущее)
 |  
|   | Николай Рубан (статус: 10-ый класс), 20 января 2008, 22:17 [#4]:Да Вы правы просто изначально код выглядел так: 
 
 ...
r:=GetRValue(Color);
  g:=GetGValue(Color);
  b:=GetBValue(Color);
  ShowMessage(format('R=%d G=%d B=%d',[r,g,b]));
...Забыл убрать....
  )) |  
|   | Smirnov Ivan (статус: Посетитель), 21 января 2008, 18:44 [#5]:да, без r,g,b:Byte; работает также) |  31 января 2011, 19:30: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |