соответствие

Ответить
ENERGY
Сообщения: 5
Зарегистрирован: 23 дек 2009, 21:34

суть программы такова:
тест. есть картинка с изображением мускулатуры на пол окна и есть цифры ( 1 до 23 ), с названиями мышц.
надо что б накладывались цифры на мишци и при правильном соответствии засчитовало правильный ответ
передвижение обьектов я зделал но вот вопрос в том как зделать так что б, допустим Лэйбл1, должен был прикреплятся в конкретному месту, и при прикреплении засчитовало

хелп :(
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Ставим каждой метке тег, равный ее номеру (чтобы не пришлось вытаскивать номер из имени метки).
Создаем картинку-маску. На ней вся мышца №1 закрашена цветом, скажем, rgb(1,0,0), мышца №2 - rgb(2,0,0) и т.д. Пусть называется MaskImage.
Делаем процедуру проверки

Код: Выделить всё

for i:=0 to form1.componentsCount-1 do
  if form1.components[i] is TLabel then
  begin
     with (Form1.Components[i] as TLabel) do
     begin
        x:=Left;
        y:=Top;
        num:=Tag;
     end;
     if MaskImage.Pixels[x,y]=rgb(num, 0,0)
        then showmessage('Метка '+inttostr(num)+' размещена корректно!');
  end;
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
ENERGY
Сообщения: 5
Зарегистрирован: 23 дек 2009, 21:34

Хыиуду писал(а):Ставим каждой метке тег, равный ее номеру (чтобы не пришлось вытаскивать номер из имени метки).
Создаем картинку-маску. На ней вся мышца №1 закрашена цветом, скажем, rgb(1,0,0), мышца №2 - rgb(2,0,0) и т.д. Пусть называется MaskImage.
Делаем процедуру проверки

а теперь пожалуйста с разжовыванием как для идиота
1) как поставить тег
2) как создать картинку-маску
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

1. В диспетчере объектов у каждого визуального компонента есть параметр Tag.
2. Судя по всему, ручками в Пейнте, иного пути не вижу.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
ENERGY
Сообщения: 5
Зарегистрирован: 23 дек 2009, 21:34

её можно будет сделать прозрачной?
ENERGY
Сообщения: 5
Зарегистрирован: 23 дек 2009, 21:34

м... чёт не могу понять... ну розресовал я картинку в красный (1) и синий (2) зоны. чё дальше... и, наверно по той же причине, дэлфи матюкается тут:
if MaskImage.Pixels[x,y]=rgb(num, 0,0)
после Pixels пишет: for loop control variable must be simple local variable

:rolleyes:
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Нет, конечно!
Во-первых, ты для цикла, похоже, используешь не ту переменную индекса, которую надо.
А во-вторых, раз уж ты создал синюю и красную зоны - делай массив colors, типа: 1 => clRed, 2 => clBlue и т.д.
А проверку MaskImage.Pixels[x,y]=rgb(num, 0,0) заменяй на MaskImage.Pixels[x,y]=colors[num].
Вообще, код сюда - посмотрим, в чем ошибка.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
ENERGY
Сообщения: 5
Зарегистрирован: 23 дек 2009, 21:34

Код: Выделить всё

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons, jpeg;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Shape1: TShape;
    Shape2: TShape;
    Image1: TImage;
    Shape3: TShape;
    Shape4: TShape;
    BitBtn1: TBitBtn;
    maskimage: TImage;
    procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Shape1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x,y,Pixels,num: real;
  x1,i,y1:integer;
  flag:boolean=False; implementation


{$R *.dfm}

procedure TForm1.Shape1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
flag:=False;
end;

procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Flag then with TShape (sender) do begin Left:=Left+x-x1;Top:=Top+y-y1;
end;
    end;
procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
x1:=x;y1:=y; flag:=True;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
for i:=0 to form1.componentCount-1 do
  if form1.components[i] is TLabel then
  begin
     with (Form1.Components[i] as TLabel) do
     begin
        x:=Left;
        y:=Top;
        num:=Tag;
     end;
     if MaskImage.Pixels[x,y]=rgb(num,0,0)
        then showmessage('Метка '+inttostr(num)+' размещена корректно!');
  end;
end;

end.
:(
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

if MaskImage.Pixels[x,y]=rgb(num,0,0)
then showmessage('Метка '+inttostr(num)+' размещена корректно!');
Внеси это внутрь цикла. И если уж ты решил оставить эту проверку - то первый цвет должен иметь цвет rgb(1,0,0), второй - rgb(2,0,0) и т.д. Это. конечно, неоптимально (для глаза все эти цвета визуально будут почти черными с красноватым отливом). Так что второй вариант, который я предложил постом выше, всяко лучше.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить