Не могу нарисовать на форме и кнопках линию

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не могу нарисовать на форме и кнопках линию

Сообщение BamsikPotapov » 04.08.2012 22:25:39

Мне нужно нарисовать линию, а вернее зачеркнуть три кнопки. Это нужно для игры крестики-нолики.
Просто нарисовать линию у меня получилось.
Нарисовать на кнопках ее нельзя, но если я ее рисую на тех координатах где кнопки с крестиками и ноликами то она естественно рисуется под ними.
Вопросов несколько:
можно ли рисовать на кнопках, вроде того чтобы карандаш работал поверх всех объектов формы?
Как легко отменить то что нарисовал? свойство clear конечно не подходит, может можно перед рисованием линии как-то запомнить состояние, а потом выполнить clear и восстановить canvas(я имел ввиду холст, надеюсь правильно пояснил) моей основной формы.

Если я подхожу к этой проблеме совершенно неправильно, то подскажите как быть.
Сразу менять кнопки на TImage не хочу, думаю что кто-нибудь знает как сделать то, что мне нужно.
О рисовании прочитал в книге Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus где еще можно почитать как рисовать?
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

Re: Не могу нарисовать на форме и кнопках линию

Сообщение v-t-l » 05.08.2012 11:34:05

Рисовать нужно в обработчике события OnPaint
Код: Выделить всё
procedure TForm1.SpeedButton1Paint(Sender: TObject);
begin
  with (Sender as TSpeedButton) do
  begin
    Canvas.Pen.Color:=clRed;
    Canvas.Line(0,0,Width,Height);
    Canvas.Line(0,Height,Width,0);
  end;
end;
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Не могу нарисовать на форме и кнопках линию

Сообщение BamsikPotapov » 05.08.2012 12:56:42

Спасибо v-t-l.
OnPaint не обязательно, просто холст для такой кнопки можно создать, а я использовал кнопку BitBtn. Сейчас просто перепишу все под другие кнопки. 20 минут копирования и вставки, и я в шоколаде.
Ещё дело в том что в той книге где я прочитал про рисование не написано что кнопки могут холст иметь, вот я и не стал даже смотреть.
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

Re: Не могу нарисовать на форме и кнопках линию

Сообщение v-t-l » 07.08.2012 19:51:54

BamsikPotapov писал(а):OnPaint не обязательно,

Если не перерисовывать нужное в обработчике OnPaint, то при необходимости перерисовки нарисованое может пропасть. :D
BamsikPotapov писал(а): 20 минут копирования и вставки, и я в шоколаде.

Код: Выделить всё
with (Sender as TSpeedButton) do

Один и тот же обработчик можно указать для всех SpeedButton. Не копируя его, а выбрав в инспекторе обектов из выпадающего списка.
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Не могу нарисовать на форме и кнопках линию

Сообщение Light13 » 08.08.2012 07:51:49

v-t-l писал(а):
BamsikPotapov писал(а):
Код: Выделить всё
with (Sender as TSpeedButton) do


Крайне не рекомендую использовать оператор with
Добавит много геморроя.

ИМХО.
Аватара пользователя
Light13
постоялец
 
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Re: Не могу нарисовать на форме и кнопках линию

Сообщение BamsikPotapov » 08.08.2012 22:12:57

Мне зачеркивать нужно было разные кнопки и по разным направлениям, я создал TImage и все сделал как надо.
Я плохой программист и написал такой код что в событии нажатия кнопки у меня должна была зачеркнуться этаже кнопка и еще две соседних, и через две секунды все должно было очиститься, и еще компьютер мог сделать ход. С кодом все в порядке, а вот рисование не пошло так как в событии нажатия кнопки код выполняется и кнопка находится в нажатом состоянии, после завершения события рисунок отображался, ну а то что я писал выше я не смог в одном событии обработать. TImage меня спас.
Теперь я просто осторожней к таким делам подхожу.
Всем спасибо.
Кстати with оператор тоже не перевариваю, но сам не знаю зачем.
Аватара пользователя
BamsikPotapov
новенький
 
Сообщения: 54
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

Re: Не могу нарисовать на форме и кнопках линию

Сообщение B4rr4cuda » 09.08.2012 19:38:40

BamsikPotapov писал(а):Кстати with оператор тоже не перевариваю, но сам не знаю зачем.

Хорошая интуиция))
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Не могу нарисовать на форме и кнопках линию

Сообщение GAMER » 11.08.2012 18:55:57

Интуиция знает, что может быть переменная, а может и поле (свойство, и .т.д.). Как распознать что там хочет быть при with.
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Не могу нарисовать на форме и кнопках линию

Сообщение Brainenjii » 23.08.2012 10:37:20

да вы что? With - одна из самых приятных фич в паскале (в JS её ой как не хватает).
With MyThreadList.LockList Do
Try
For i := 0 To Count - 1 Do
...
Finally
MyThreadList.UnlockList;
End;
превратилось бы в
Var
MyList: TList;
...
MyList := MyThreadList.LockList;
Try
For i := 0 To MyList.Count - 1 Do
...
Finally
MyThreadList.UnlockList;
End;
Да и вообще, удобно, чтобы не создавать "лишние" переменные, нужные один раз, а уж как сокращает количество строк кода символов при вызове методов с большим кол-вом параметров - вообще молчу
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 232

Рейтинг@Mail.ru