Не могу нарисовать на форме и кнопках линию
Модератор: Модераторы
- BamsikPotapov
- новенький
- Сообщения: 55
- Зарегистрирован: 31.12.2011 19:30:39
- Откуда: Меня в капусте нашли
Не могу нарисовать на форме и кнопках линию
Мне нужно нарисовать линию, а вернее зачеркнуть три кнопки. Это нужно для игры крестики-нолики.
Просто нарисовать линию у меня получилось.
Нарисовать на кнопках ее нельзя, но если я ее рисую на тех координатах где кнопки с крестиками и ноликами то она естественно рисуется под ними.
Вопросов несколько:
можно ли рисовать на кнопках, вроде того чтобы карандаш работал поверх всех объектов формы?
Как легко отменить то что нарисовал? свойство clear конечно не подходит, может можно перед рисованием линии как-то запомнить состояние, а потом выполнить clear и восстановить canvas(я имел ввиду холст, надеюсь правильно пояснил) моей основной формы.
Если я подхожу к этой проблеме совершенно неправильно, то подскажите как быть.
Сразу менять кнопки на TImage не хочу, думаю что кто-нибудь знает как сделать то, что мне нужно.
О рисовании прочитал в книге Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus где еще можно почитать как рисовать?
Просто нарисовать линию у меня получилось.
Нарисовать на кнопках ее нельзя, но если я ее рисую на тех координатах где кнопки с крестиками и ноликами то она естественно рисуется под ними.
Вопросов несколько:
можно ли рисовать на кнопках, вроде того чтобы карандаш работал поверх всех объектов формы?
Как легко отменить то что нарисовал? свойство clear конечно не подходит, может можно перед рисованием линии как-то запомнить состояние, а потом выполнить clear и восстановить canvas(я имел ввиду холст, надеюсь правильно пояснил) моей основной формы.
Если я подхожу к этой проблеме совершенно неправильно, то подскажите как быть.
Сразу менять кнопки на TImage не хочу, думаю что кто-нибудь знает как сделать то, что мне нужно.
О рисовании прочитал в книге Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus где еще можно почитать как рисовать?
Рисовать нужно в обработчике события 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
- Откуда: Меня в капусте нашли
Спасибо v-t-l.
OnPaint не обязательно, просто холст для такой кнопки можно создать, а я использовал кнопку BitBtn. Сейчас просто перепишу все под другие кнопки. 20 минут копирования и вставки, и я в шоколаде.
Ещё дело в том что в той книге где я прочитал про рисование не написано что кнопки могут холст иметь, вот я и не стал даже смотреть.
OnPaint не обязательно, просто холст для такой кнопки можно создать, а я использовал кнопку BitBtn. Сейчас просто перепишу все под другие кнопки. 20 минут копирования и вставки, и я в шоколаде.
Ещё дело в том что в той книге где я прочитал про рисование не написано что кнопки могут холст иметь, вот я и не стал даже смотреть.
BamsikPotapov писал(а):OnPaint не обязательно,
Если не перерисовывать нужное в обработчике OnPaint, то при необходимости перерисовки нарисованое может пропасть.
BamsikPotapov писал(а): 20 минут копирования и вставки, и я в шоколаде.
Код: Выделить всё
with (Sender as TSpeedButton) doОдин и тот же обработчик можно указать для всех SpeedButton. Не копируя его, а выбрав в инспекторе обектов из выпадающего списка.
v-t-l писал(а):BamsikPotapov писал(а):Код: Выделить всё
with (Sender as TSpeedButton) do
Крайне не рекомендую использовать оператор with
Добавит много геморроя.
ИМХО.
- BamsikPotapov
- новенький
- Сообщения: 55
- Зарегистрирован: 31.12.2011 19:30:39
- Откуда: Меня в капусте нашли
Мне зачеркивать нужно было разные кнопки и по разным направлениям, я создал TImage и все сделал как надо.
Я плохой программист и написал такой код что в событии нажатия кнопки у меня должна была зачеркнуться этаже кнопка и еще две соседних, и через две секунды все должно было очиститься, и еще компьютер мог сделать ход. С кодом все в порядке, а вот рисование не пошло так как в событии нажатия кнопки код выполняется и кнопка находится в нажатом состоянии, после завершения события рисунок отображался, ну а то что я писал выше я не смог в одном событии обработать. TImage меня спас.
Теперь я просто осторожней к таким делам подхожу.
Всем спасибо.
Кстати with оператор тоже не перевариваю, но сам не знаю зачем.
Я плохой программист и написал такой код что в событии нажатия кнопки у меня должна была зачеркнуться этаже кнопка и еще две соседних, и через две секунды все должно было очиститься, и еще компьютер мог сделать ход. С кодом все в порядке, а вот рисование не пошло так как в событии нажатия кнопки код выполняется и кнопка находится в нажатом состоянии, после завершения события рисунок отображался, ну а то что я писал выше я не смог в одном событии обработать. TImage меня спас.
Теперь я просто осторожней к таким делам подхожу.
Всем спасибо.
Кстати with оператор тоже не перевариваю, но сам не знаю зачем.
BamsikPotapov писал(а):Кстати with оператор тоже не перевариваю, но сам не знаю зачем.
Хорошая интуиция))
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
да вы что? 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;
Да и вообще, удобно, чтобы не создавать "лишние" переменные, нужные один раз, а уж как сокращает количество строк кода символов при вызове методов с большим кол-вом параметров - вообще молчу
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;
Да и вообще, удобно, чтобы не создавать "лишние" переменные, нужные один раз, а уж как сокращает количество строк кода символов при вызове методов с большим кол-вом параметров - вообще молчу
