Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 bit: TBitmap;
begin
 bit:=TBitmap.Create;
 bit.LoadFromFile('c:\1.BMP');
 Rect:= Form1.StringGrid1.CellRect(3, 3);
 Form1.StringGrid1.Canvas.Brush.Bitmap:= bit;
 Form1.StringGrid1.Canvas.FillRect(Rect);
end;

Автор: Александра 28.2.2005, 15:13
а вот и пример, только, конечно про загрузку картинки в обработчике Фокс пошутил ;)

Автор: Guest 28.2.2005, 15:46
smile
не-е-е-е... картинка не пойдёт.

Проясняю ситуацию:
StringGrid должен представлять собой большую принципиальную электросхему, собираемую их "кирпичиков" - отдельных элементов, которые выбираются из меню и ставятся в определённую ячейку.
Так вот, как только я начинаю её (схему, Грид) прокручивать, то, что было нарисовано уходит за край, а при обратной прокрутке стирается.
А она нужна мне ЦЕЛИКОМ!!!!

Ох! smile вроде пояснил, ЧЕГО я хочу! smile

Автор: Александра 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]
нужный объект (создай или возьми из пула),

а при рисовании ячейки дай ему себя нарисовать:

Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var elem: TElem;
begin
  elem := TElem((Sender as TStringGrid).Objects[ACol, ARow]);
  if elem <> nil then
    elem.Draw( (Sender as TStringGrid).Canvas, Rect);
end;


Ну потом при закрытии не забудь уничтожить эти объекты

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)