Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как в колонку DBGridEh вставить другой компонент


Автор: Sponger 7.4.2006, 12:20
В библиотеке Jedi есть такой компонент как LED.

У меня есть поле мемо. Соответственно когда оно пустое LED = FALSE, а если не пустое LED = TRUE

Как его вставить в колонку DBGridEh чтобы он был виден во всех записях и на каждую запись принимал нужное значение.


Автор: sexton 7.4.2006, 18:16
А может лучше туда класть не компонент а изображения (глифы)?

Автор: Sponger 10.4.2006, 13:36
тогда каким образом отображать картинки. Я никогда не делал этого.

Автор: sexton 11.4.2006, 12:56
RTFM!
1.
Цитата

Bitmap в StringGrid ячейке.

В обработчике события OnDrawCell элемента StringGrid поместите следующий код:

    with (Sender as TStringGrid) do 
    with Canvas do 
        begin 
        {...} 
        Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic); 
        {...} 
        end; 


Используйте метод Draw() или StretchDraw() класса TCanvas. Image1 - это TImage с предварительно загруженным в него bitmap-ом.


2.

Цитата

Помещение компонентов в StringGrid
Автор: Neil Rubenking

Некоторое время тому назад такой вопрос уже ставился: возможно ли поместить элемент управления, например, CheckBox или ComboBox внутрь компонента ...Grid. Я сегодня помозговал и нашел неплохую, на мой взгляд, технологию. Это работает! Вот решение для тех, кто этим интересуется:

При создании компонента (в обработчике OnCreate), создайте его объекты Objects[C,R], например TCheckBox.Create(Self). Имейте в виду, что вы должны присвоить ячейкам Cells[C,R] какие-либо значения прежде, чем чем вы сможете иметь доступ к Objects[C,R]. Установите у вновь созданного компонента свойство Visible в FALSE, а свойство parent в SELF. Осуществите другую необходимую инициализацию. Имейте в виду, что вы должны внести необходимые модули в список uses, если создаете тип компонента, которого нигде кроме как на форме нет.

Создайте процедуру, берущую координаты колонки/строки и правильно позиционирующую соотвествующий объект в пределах прямоугольника ячейки, например:
Код

procedure TForm1.FixObjPosn(vCol, vRow: LongInt); 
{Размещаем содержимое компонента в области прямоугольника ячейки} 
var 
  R: TRect; 
begin 
  R := StringGrid1.CellRect(vCol, vRow); 
  if StringGrid1.Objects[vCol, vRow] is TControl then 
    with TControl(StringGrid1.Objects[vCol, vRow]) do 
      if R.Right = R.Left then {прямоугольник ячейки невидим} 
        Visible := False 
      else 
      begin 
        InflateRect(R, -1, -1); 
        OffsetRect(R, StringGrid1.Left + 1, StringGrid1.Top + 1); 
        BoundsRect := R; 
        Visible := True; 
      end; 
end; 


смещение позиции необходимо, поскольку CellRect расчитывается относительно верхнего левого угла строки сетки, и родителем компонента является форма).

В обработчике события сетки OnSelectCell проверьте, располагается ли элемент Objects в текущей колонке Col и строке Row TControl - если так, установите его свойство visible в FALSE. Теперь вызовите процедуру установления координат из шага 2 для *НОВЫХ* Col и Row, передавая их из параметров обработчика события в параметры функции.

В обработчике OnTopLeftChanged просто вызовите FixObjPosn

В обработчике события OnDrawCell во-первых, если ячейка выбрана, EXIT. Если элемент ячейки Objects не TControl, также EXIT. В противном случае вам нужно создать код, обеспечивающий отрисовку "фасада" каждого типа элемента управления, которого вы разместили в сетке.

Обратите внимание на то, что если вы делаете что-либо с элементом управления, на который влияют ДРУГИЕ элементы управления (например, изменение статуса какой-либо радиокнопки из группы, или операции enable/disable), вы должны вызвать метод сетки Refresh.

Опс! Это звучит немного запутанно, но это работает. Успехов!


© drkb


Автор: Sponger 11.4.2006, 13:15
Спасибо я уже сделал. В Delphi World есть вот такой пример

Код

procedure TForm1.DBGridEh2DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumnEh;
  State: TGridDrawState);
var
  Im1: TBitmap;
begin
  Im1 := TBitmap.Create;
  if Column.FieldName = 'Glyph' then
    with DBGridEh2.Canvas do begin
      FillRect(Rect);
      if length(Form1.main.FieldValues['TranslateAList']) = 0 then 
        ImageList1.GetBitmap(0, Im1)
      else 
        ImageList1.GetBitmap(1, Im1);
      Draw(round((Rect.Left + Rect.Right - Im1.Width) / 2), Rect.Top + 2, Im1);
    end;
end;


В принципе это похоже на первую цитату

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