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