| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Рисование в StringGrid |
| Автор: Гость_Михаил 28.2.2005, 14:51 |
| Есть StringGrid размером 20х20. На форме видно 10х10. Рисую кусочки схемы в каждой ячейку (Canvas.MoveTj и LineTo). НО!!! при прокрутку Грида нарисованное стирается. ВОПРОС: Как сделать, чтобы нарисованное изображение оставалось при прокрутке? Размеры ячеек, их количество менять НЕЛЬЗЯ. |
| Автор: Александра 28.2.2005, 14:54 |
| Михаил, а вы где рисуете? Рисуйте в обработчике события OnDrawCell |
| Автор: ~FoX~ 28.2.2005, 15:06 | ||
|
| Автор: Александра 28.2.2005, 15:13 |
| а вот и пример, только, конечно про загрузку картинки в обработчике Фокс пошутил ;) |
| Автор: Guest 28.2.2005, 15:46 |
| не-е-е-е... картинка не пойдёт. Проясняю ситуацию: StringGrid должен представлять собой большую принципиальную электросхему, собираемую их "кирпичиков" - отдельных элементов, которые выбираются из меню и ставятся в определённую ячейку. Так вот, как только я начинаю её (схему, Грид) прокручивать, то, что было нарисовано уходит за край, а при обратной прокрутке стирается. А она нужна мне ЦЕЛИКОМ!!!! Ох! |
| Автор: Александра 28.2.2005, 15:54 |
| не, не понятно! Фоксик тебе пример привел, как рисовать в одной ячейки и чтобы оно не стиралось! так смотри что у тебя в какой ячейки и рисуй свои "кирпичики"! Все верно! |
| Автор: Guest 28.2.2005, 15:58 |
| Я же писал в первом сообщении-вопросе: я рисую LineTo, Ellipse и MoveTo ! а ячкйка выбирается (становится активной) щелчком мышки, по которому в ней И ДОЛЖЕН ПОЯВИТЬСЯ ФРАГМЕНТ СХЕМЫ. |
| Автор: ningen 28.2.2005, 16:00 |
| ты должен хранить в ячейке (например, в массиве Objects, или в самом тексте Cells) информацию о том, какой элемент схемы в какой ячейке рисуется, и использовать эту информацию при рисовании ячейки. procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var bmpIdx: Integer; bmp: TBitmap; begin bmpIdx := (Sender as TStringGrid).Objects[ACol, ARow]; bmp := МассивЭлементовСхемыСозданныйЗаранее[bmpIdx]; (Sender as TStringGrid).Canvas.Draw(Rect.X, Rect.Y, bmp); end; |
| Автор: Александра 28.2.2005, 16:24 |
| Какая разница как вы рисуете, вам просто НУЖНО рисовать в этом обработчике события и все!!! |
| Автор: ningen 28.2.2005, 16:35 | ||
| если рисуешь LineTo и тп, сделай абстрактный объект TElem = class public procedure Draw(Canvas: TCanvas; Rect: TRect); virtual; abstract; end; от него напиши кучу наследников для разных элементов схемы. При клике на ячейку заноси в (Sender as TStringGrid).Objects[ACol, ARow] нужный объект (создай или возьми из пула), а при рисовании ячейки дай ему себя нарисовать:
Ну потом при закрытии не забудь уничтожить эти объекты |