| 
| 
 | Вопрос # 3 980/ вопрос открыт / | 
 |  Здравствуйте!Помогите пожалуйста... Как мне можно разбить компонент image на "условные" части? То есть, суть такова, я тыкаю правой кнопкой мыши и фрагмент под мышей закрашивается в красный, левой, в белый... Ну или как мне применить событие "заливки" к 400 компонентам image сразу? Кстате второй вариант будет проще для меня...
 
|  |   Вопрос задал: padonak (статус: Посетитель)Вопрос отправлен: 5 апреля 2010, 18:33
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: webkent Здравствуйте, padonak!Вот файл проекта. http://webfile.ru/4409570
 
 Я там написал ту часть, что окрашивает квадраты и записывает в массив какие из них уже окрашены. Так же убирает при повторном клике. Логику не писал - в вопросе этого нет, да и опять же лень =)
 
 Везде поставил комментарии, должно быть понятно, так что училке объяснишь... =)
 
 Если неохота качать, выкладываю код, просто скопируй его.
 Приложение:Переключить в обычный режим  unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs; type  TForm1 = class(TForm)    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;      Shift: TShiftState; X, Y: Integer);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);var  MouseX,MouseY:integer;begin          MouseX:=MouseX+1;       MouseY:=MouseY+1;          end         Form1.Canvas.Rectangle(MouseX-40, MouseY-40, MouseX, MouseY);      Massiv[Round((MouseX-40)/40), Round((MouseY-40)/40)]:=false;    end;  end;end; end.
|  | Ответ отправил: webkent (статус: 2-ой класс)Время отправки: 6 апреля 2010, 16:36
 
 |  
 Мини-форум вопросаВсего сообщений: 27; последнее сообщение — 6 апреля 2010, 18:37; участников в обсуждении: 5. Страницы: [1] [2] [Следующая »]  
|   | min@y™ (статус: Доктор наук), 5 апреля 2010, 20:41 [#1]:Слышь, ты меня по аське уже задолбал своими бредовыми идеями. Давай-ка расскажи, зачем тебе 400 TImage. И ваще, иди работать.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | padonak (статус: Посетитель), 5 апреля 2010, 21:03 [#2]:Миняй, во первый, куда работать??? А во вторых, зачем мне 400 имагов, так поправляюсь, их всего 200... А вопроса насчёт 200 не было... |  
|   | min@y™ (статус: Доктор наук), 5 апреля 2010, 21:11 [#3]: Цитата (padonak): А вопроса насчёт 200 не было...  А зачем 200? Теперь есть вопрос.
 
 Цитата (padonak): куда работать??? Как куда?
 Вагоны требуют срочной разгрузки, ёмаё.
 Проститутки требуют новых сутенёров!
 Дворники требуют новый мусор на улицах!
 Мусор на улицах требует новых клиентов для обезьянника!
 
 Все работы хороши - выбирай на вкус! (© С. Я. Маршак)
 
 Бросай программирование. Поверь, это на для тебя.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | padonak (статус: Посетитель), 5 апреля 2010, 21:20 [#4]:Знаешь меняй... Я тебя, твоих родствеников по седьмое колено, и твою собаку ****... И мне пох что ты на это скажешь... Да, и ещё, из тя програмист, как из меня балерина(а танцую я хуёво)... Самоучка недоносок... |  
|   | min@y™ (статус: Доктор наук), 5 апреля 2010, 21:33 [#5]:Спасибо, конечно. Но у меня нет собаки. Если ты собак ****, то тебе на другой сайт надо. У меня есть кот Рыжик, чёрный с белым животом. Если танцуешь также, как я проги пишу, то ты Андрис Лиепа.
 А моих родственников не трогай. Они все на кладбище давно, я сирота. А то, что я недоносок, это ты не прав. Моя Мама (царствие ей Небесное) родила меня через 9 месяцев после зачатия.
 Я тебе очень много раз оказывал помощь. По аське, да... И бесплатно. А ты вот как, значит... Вот из-за таких, как ты, я разочарован в этом мире.
 
 Спасибо за внимание.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | IlluminatI (статус: 2-ой класс), 5 апреля 2010, 21:36 [#6]:А правда, зачем тебе столько TImage на форме о_О? Может все гораздо проще? |  
|   | padonak (статус: Посетитель), 5 апреля 2010, 21:49 [#7]:IlluminatI Возможно... А может и вреале програмирование не для меня и все мои идеи полный бред... |  
|   | IlluminatI (статус: 2-ой класс), 5 апреля 2010, 22:10 [#8]:так ты объясни идею, а там будем смотреть - легче или нет |  
|   | padonak (статус: Посетитель), 5 апреля 2010, 23:19 [#9]:Школьное задание... Написать игру или что-то наподобие(массивы и графика)... Я хотел иметь 200ячеек(что-то вроде графического массива) и чтобы находился кратчайший путь к заданной точке... Проблема в том, что я не работал не с массивами, да и вобще ничего подобного не делал... Да и ещё, задача осложняется тем, что на поле, по клику мыши будут возникать препятствия, то есть если ячейка красная, то элемент не может пройди через неё... Всё как-то запутано, пытаюсь решить... Время у меня много, вот я и решил что нибудь с имагами попробовать. Знаю что глупо, уже поставил на форму, так получается для каждого событие писать, это вобще аврал... Вобще решение задания могло быть любым, но связано что нибудь с графикой и массивами... |  
|   | webkent (статус: 2-ой класс), 6 апреля 2010, 08:29 [#10]:ненадо 200 TImage тебе надо написать класс этого поля, состоящего из ячеек. Каждую ячейку можно прорисовывать на Canvas'е формы. При клике смотришь на координаты курсора, определяешь над каким он квадратом и закрашиваешь. Я бы написал, но мне очень лень, сорри. Хотя, если в конце рабочего дня еще не помогут, тогда напишу. |  
|   | Вадим К (статус: Академик), 6 апреля 2010, 10:21 [#11]:Думаю, для начала надо разобраться в массивах. особенно двумерных (они же называются "матрицами"). А там дело пойдет легче. А так с наскоку брать такую задачу, не понимая, что такое массивы - тупик моментальный. Я себе уже представил, как будет решаться задача поиска маршрута на одних TImage. 
 Подсказки.
 Для нахождения кратчайшего пути рекомендую почитать, что такое "волновой алгоритм".
 Для отрисовки поля можно воспользоваться TDrawGrid - компонент-брат TStringGrid'а.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | padonak (статус: Посетитель), 6 апреля 2010, 14:19 [#12]:webkent, не в коем случае не пиши. К нам прислали информатичку-чайника(я с ней в очень натянутых отношениях), лучше я во всём разберусь, и смогу потом "защетить" свою прогу. |  
|   | Вадим К (статус: Академик), 6 апреля 2010, 14:29 [#13]:а если пользователь не кликнул, как мы угадаем, куда он кликнет? Я не думаю, что для 200 ячеек такая сложная логика получиться и пересчет будет занимать доли секунды.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | webkent (статус: 2-ой класс), 6 апреля 2010, 16:37 [#14]:там и без массива можно сделать если просто по цвету проверять, ну раз надо... 
 Я там в выложенном проекте забыл форме задать размеры 600 на 600, ну это, я думаю не сложно...
 |  
|   | padonak (статус: Посетитель), 6 апреля 2010, 16:48 [#15]:Погоди, а как без массива? |  
|   | webkent (статус: 2-ой класс), 6 апреля 2010, 16:51 [#16]:всё точно так же, просто удалить все строчки где упомянут "Massiv" 
 С ним проверка препятствий будет такой:
 
 "If Massiv[такойто,такойто] = true then"
 
 А без него такой:
 
 "If Form1.Canvas.Pixels[стокато, стокато] = clWhite then"
 
 
 Вот и все отличия - проверяем не по массиву а по цвету пикселя внутри нужного квадрата.
 
 Например, надо проверить квадрат 10-й по вертикали 5-й по горизонтали проверяем так:
 
 If Form1.canvas.pixels[10*40-20, 5*40-20] = true then
 
 40 это сторона каждого квадрата, 20 отнимаем что бы попасть в середину нужного нам квадрата.
 |  
|   | padonak (статус: Посетитель), 6 апреля 2010, 16:54 [#17]:Да, я написал уже связаное с формой. Вот что получилось... 
 
 
 
 // при октивации формы
 procedure TForm1.FormActivate(Sender: TObject);
 begin
 // раскрасим имаг в белый цвет
 form1.Image1.Canvas.Brush.Color :=  clWhite;
 form1.Image1.Canvas.Rectangle(0, 0, 550, 550);
 // разобьём его на ячейки
 form1.Image1.Canvas.Pen.Mode := pmBlack;
 for i := 0 to 22 do begin
 form1.Image1.Canvas.MoveTo(i * 25, 0);
 form1.Image1.Canvas.LineTo(i * 25, 550);
 end;
 for i := 0 to 22 do begin
 form1.Image1.Canvas.MoveTo(0, i * 25);
 form1.Image1.Canvas.LineTo(550, i * 25);
 end;
 form1.Image1.Canvas.Brush.Style := bsSolid;
 end;
 // при клике на имаге
 procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 var
 a : trect;
 begin
 x2 := x;
 y2 := y;
 // установим правильные значения
 while (pos(Decimalseparator, floattostr(x2 / 25)) <> 0) do
 x2 := x2 - 1;
 while (pos(Decimalseparator, floattostr(y2 / 25)) <> 0) do
 y2 := y2 - 1;
 // уставновим цвет и начертим
 a := Rect(x2 + 1, y2 + 1, x2 + 25, y2 + 25);
 If button = mbleft then
 Form1.Image1.Canvas.Brush.Color := clRed;
 If button = mbright then
 Form1.Image1.Canvas.Brush.Color := clWhite;
 // начертим
 form1.Image1.Canvas.FillRect(a);
 
 
 end;
 |  
|   | Вадим К (статус: Академик), 6 апреля 2010, 16:56 [#18]:код вида "Form1.Canvas.Pixels[стокато, стокато] " хорош, но если расчеты хоть чуточку сложными станут - это будет основное место притормаживания программы. Иногда в сотни раз. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | webkent (статус: 2-ой класс), 6 апреля 2010, 16:56 [#19]:понятно... Буду знать. |  
|   | padonak (статус: Посетитель), 6 апреля 2010, 16:58 [#20]:Вадим К, ну если всего лишь 484 квадрата, то есть области для передвижения, то проблем не должно возникнуть? |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |