Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 980

/ вопрос открыт /

Здравствуйте!
Помогите пожалуйста... Как мне можно разбить компонент image на "условные" части? То есть, суть такова, я тыкаю правой кнопкой мыши и фрагмент под мышей закрашивается в красный, левой, в белый... Ну или как мне применить событие "заливки" к 400 компонентам image сразу? Кстате второй вариант будет проще для меня...

padonak Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: padonak (статус: Посетитель)
Вопрос отправлен: 5 апреля 2010, 18:33
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: webkent

Здравствуйте, padonak!
Вот файл проекта. http://webfile.ru/4409570

Я там написал ту часть, что окрашивает квадраты и записывает в массив какие из них уже окрашены. Так же убирает при повторном клике. Логику не писал - в вопросе этого нет, да и опять же лень =)

Везде поставил комментарии, должно быть понятно, так что училке объяснишь... =)

Если неохота качать, выкладываю код, просто скопируй его.

Приложение:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8. Dialogs;
  9.  
  10. type
  11. TForm1 = class(TForm)
  12. procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  13. Shift: TShiftState; X, Y: Integer);
  14. private
  15. { Private declarations }
  16. public
  17. { Public declarations }
  18. end;
  19.  
  20. var
  21. Form1: TForm1;
  22.  
  23. implementation
  24.  
  25. {$R *.dfm}
  26.  
  27. procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  28. Shift: TShiftState; X, Y: Integer);
  29. var
  30. MouseX,MouseY:integer;
  31. begin
  32.  
  33.  
  34.  
  35.  
  36. MouseX:=MouseX+1;
  37.  
  38. MouseY:=MouseY+1;
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45. end
  46.  
  47.  
  48.  
  49. Form1.Canvas.Rectangle(MouseX-40, MouseY-40, MouseX, MouseY);
  50. Massiv[Round((MouseX-40)/40), Round((MouseY-40)/40)]:=false;
  51. end;
  52. end;
  53. end;
  54.  
  55. end.


Ответ отправил: webkent (статус: 2-ой класс)
Время отправки: 6 апреля 2010, 16:36


Мини-форум вопроса

Всего сообщений: 27; последнее сообщение — 6 апреля 2010, 18:37; участников в обсуждении: 5.

Страницы: [1] [2] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 5 апреля 2010, 20:41 [#1]:

Слышь, ты меня по аське уже задолбал своими бредовыми идеями. Давай-ка расскажи, зачем тебе 400 TImage.
И ваще, иди работать.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
padonak

padonak (статус: Посетитель), 5 апреля 2010, 21:03 [#2]:

Миняй, во первый, куда работать??? А во вторых, зачем мне 400 имагов, так поправляюсь, их всего 200... А вопроса насчёт 200 не было...
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2010, 21:11 [#3]:

Цитата (padonak):

А вопроса насчёт 200 не было...

А зачем 200? Теперь есть вопрос.

Цитата (padonak):

куда работать???

Как куда?
Вагоны требуют срочной разгрузки, ёмаё.
Проститутки требуют новых сутенёров!
Дворники требуют новый мусор на улицах!
Мусор на улицах требует новых клиентов для обезьянника!

Все работы хороши - выбирай на вкус! (© С. Я. Маршак)

Бросай программирование. Поверь, это на для тебя.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
padonak

padonak (статус: Посетитель), 5 апреля 2010, 21:20 [#4]:

Знаешь меняй... Я тебя, твоих родствеников по седьмое колено, и твою собаку ****... И мне пох что ты на это скажешь... Да, и ещё, из тя програмист, как из меня балерина(а танцую я хуёво)... Самоучка недоносок...
min@y™

min@y™ (статус: Доктор наук), 5 апреля 2010, 21:33 [#5]:

Спасибо, конечно. Но у меня нет собаки. Если ты собак ****, то тебе на другой сайт надо. У меня есть кот Рыжик, чёрный с белым животом.
Если танцуешь также, как я проги пишу, то ты Андрис Лиепа.
А моих родственников не трогай. Они все на кладбище давно, я сирота. А то, что я недоносок, это ты не прав. Моя Мама (царствие ей Небесное) родила меня через 9 месяцев после зачатия.
Я тебе очень много раз оказывал помощь. По аське, да... И бесплатно. А ты вот как, значит... Вот из-за таких, как ты, я разочарован в этом мире.

Спасибо за внимание.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
IlluminatI

IlluminatI (статус: 2-ой класс), 5 апреля 2010, 21:36 [#6]:

А правда, зачем тебе столько TImage на форме о_О? Может все гораздо проще?
padonak

padonak (статус: Посетитель), 5 апреля 2010, 21:49 [#7]:

IlluminatI Возможно... А может и вреале програмирование не для меня и все мои идеи полный бред...
IlluminatI

IlluminatI (статус: 2-ой класс), 5 апреля 2010, 22:10 [#8]:

так ты объясни идею, а там будем смотреть - легче или нет
padonak

padonak (статус: Посетитель), 5 апреля 2010, 23:19 [#9]:

Школьное задание... Написать игру или что-то наподобие(массивы и графика)... Я хотел иметь 200ячеек(что-то вроде графического массива) и чтобы находился кратчайший путь к заданной точке... Проблема в том, что я не работал не с массивами, да и вобще ничего подобного не делал... Да и ещё, задача осложняется тем, что на поле, по клику мыши будут возникать препятствия, то есть если ячейка красная, то элемент не может пройди через неё... Всё как-то запутано, пытаюсь решить... Время у меня много, вот я и решил что нибудь с имагами попробовать. Знаю что глупо, уже поставил на форму, так получается для каждого событие писать, это вобще аврал... Вобще решение задания могло быть любым, но связано что нибудь с графикой и массивами...
webkent

webkent (статус: 2-ой класс), 6 апреля 2010, 08:29 [#10]:

ненадо 200 TImage тебе надо написать класс этого поля, состоящего из ячеек. Каждую ячейку можно прорисовывать на Canvas'е формы. При клике смотришь на координаты курсора, определяешь над каким он квадратом и закрашиваешь. Я бы написал, но мне очень лень, сорри. Хотя, если в конце рабочего дня еще не помогут, тогда напишу.
Вадим К

Вадим К (статус: Академик), 6 апреля 2010, 10:21 [#11]:

Думаю, для начала надо разобраться в массивах. особенно двумерных (они же называются "матрицами"). А там дело пойдет легче. А так с наскоку брать такую задачу, не понимая, что такое массивы - тупик моментальный. Я себе уже представил, как будет решаться задача поиска маршрута на одних TImage.

Подсказки.
Для нахождения кратчайшего пути рекомендую почитать, что такое "волновой алгоритм".
Для отрисовки поля можно воспользоваться TDrawGrid - компонент-брат TStringGrid'а.
Галочка "подтверждения прочтения" - вселенское зло.
padonak

padonak (статус: Посетитель), 6 апреля 2010, 14:19 [#12]:

webkent, не в коем случае не пиши. К нам прислали информатичку-чайника(я с ней в очень натянутых отношениях), лучше я во всём разберусь, и смогу потом "защетить" свою прогу.
Вадим К

Вадим К (статус: Академик), 6 апреля 2010, 14:29 [#13]:

а если пользователь не кликнул, как мы угадаем, куда он кликнет?
Я не думаю, что для 200 ячеек такая сложная логика получиться и пересчет будет занимать доли секунды.
Галочка "подтверждения прочтения" - вселенское зло.
webkent

webkent (статус: 2-ой класс), 6 апреля 2010, 16:37 [#14]:

там и без массива можно сделать если просто по цвету проверять, ну раз надо...

Я там в выложенном проекте забыл форме задать размеры 600 на 600, ну это, я думаю не сложно...
padonak

padonak (статус: Посетитель), 6 апреля 2010, 16:48 [#15]:

Погоди, а как без массива?
webkent

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

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

webkent (статус: 2-ой класс), 6 апреля 2010, 16:56 [#19]:

понятно... Буду знать.
padonak

padonak (статус: Посетитель), 6 апреля 2010, 16:58 [#20]:

Вадим К, ну если всего лишь 484 квадрата, то есть области для передвижения, то проблем не должно возникнуть?

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.