StringGrid.CellRect возвращает нули

faustrash
Дата: 18.06.2009 16:46:08
Привет, всем!
Такое дело: в цикле создаю объекты на всех строках StringGrid'a и до 20-ой строки все обекты созданы. Как только дохожу до 20-ой строки - CellRect возвращает нули( Почему так происходит и как с этим бороться??
Кроик Семён
Дата: 18.06.2009 17:18:25
Range 0...N-1 ???
faustrash
Дата: 19.06.2009 11:19:49
ну практически, от 1 до n-1
faustrash
Дата: 19.06.2009 13:34:56
Значит никто не расскажет в чем может быть дело?((
scorpyx
Дата: 19.06.2009 13:44:37
faustrash
Значит никто не расскажет в чем может быть дело?((

Ну почему же поведаю тебе я эту страшную тайну))), короче все ячейки которые в данный момент не отображены имеют Rect равный 0, для размещения видимых обьектов в стринг гриде тебе необходимо создать потомка от стринг грида в котором напишеш свою процедуру отображения и скрытия обьектов, эту процедуру повесиш на обработчики событий OnTopLeftChanged и OnResize, также требуется перегрузка метода:
    procedure ColWidthsChanged; override;
в которой после inherited нужно прописать вызов процедуры изменений, например так:
procedure TUnitsCustomGrid.RepaintCheckBox(Sender: TObject);
var
  i: Integer;
  ARect: TRect;
begin
  for i := 1 to RowCount - 1 do
    if not(Objects[0, i] = nil) then
    begin
      ARect := CellRect(0, i);
      if ARect.Right = ARect.Left then
      begin
        TCheckBox(Objects[0, i]).Visible := False;
        Continue;
      end
      else
        TCheckBox(Objects[0, i]).Visible := True;
      TCheckBox(Objects[0, i]).Left := ARect.Left;
      TCheckBox(Objects[0, i]).Top := ARect.Top;
      TCheckBox(Objects[0, i]).Width := ARect.Right - ARect.Left;
      TCheckBox(Objects[0, i]).Height := ARect.Bottom - ARect.Top;
    end;
end;
только будь окуратен, большое количество обьектов очень сильно тормозит
faustrash
Дата: 19.06.2009 14:01:25
Спасибо Огромное!!)