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

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

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

Ответить
Аватара пользователя
BamsikPotapov
новенький
Сообщения: 55
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

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

Сообщение BamsikPotapov »

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

Если я подхожу к этой проблеме совершенно неправильно, то подскажите как быть.
Сразу менять кнопки на TImage не хочу, думаю что кто-нибудь знает как сделать то, что мне нужно.
О рисовании прочитал в книге Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus где еще можно почитать как рисовать?
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение v-t-l »

Рисовать нужно в обработчике события 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;
Аватара пользователя
BamsikPotapov
новенький
Сообщения: 55
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

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

Сообщение BamsikPotapov »

Спасибо v-t-l.
OnPaint не обязательно, просто холст для такой кнопки можно создать, а я использовал кнопку BitBtn. Сейчас просто перепишу все под другие кнопки. 20 минут копирования и вставки, и я в шоколаде.
Ещё дело в том что в той книге где я прочитал про рисование не написано что кнопки могут холст иметь, вот я и не стал даже смотреть.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение v-t-l »

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

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

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

with (Sender as TSpeedButton) do

Один и тот же обработчик можно указать для всех SpeedButton. Не копируя его, а выбрав в инспекторе обектов из выпадающего списка.
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

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

Сообщение Light13 »

v-t-l писал(а):
BamsikPotapov писал(а):

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

with (Sender as TSpeedButton) do


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

ИМХО.
Аватара пользователя
BamsikPotapov
новенький
Сообщения: 55
Зарегистрирован: 31.12.2011 19:30:39
Откуда: Меня в капусте нашли

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

Сообщение BamsikPotapov »

Мне зачеркивать нужно было разные кнопки и по разным направлениям, я создал TImage и все сделал как надо.
Я плохой программист и написал такой код что в событии нажатия кнопки у меня должна была зачеркнуться этаже кнопка и еще две соседних, и через две секунды все должно было очиститься, и еще компьютер мог сделать ход. С кодом все в порядке, а вот рисование не пошло так как в событии нажатия кнопки код выполняется и кнопка находится в нажатом состоянии, после завершения события рисунок отображался, ну а то что я писал выше я не смог в одном событии обработать. TImage меня спас.
Теперь я просто осторожней к таким делам подхожу.
Всем спасибо.
Кстати with оператор тоже не перевариваю, но сам не знаю зачем.
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

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

Сообщение B4rr4cuda »

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

Хорошая интуиция))
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

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

Сообщение GAMER »

Интуиция знает, что может быть переменная, а может и поле (свойство, и .т.д.). Как распознать что там хочет быть при with.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

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

Сообщение Brainenjii »

да вы что? 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;
Да и вообще, удобно, чтобы не создавать "лишние" переменные, нужные один раз, а уж как сокращает количество строк кода символов при вызове методов с большим кол-вом параметров - вообще молчу
Ответить