Конференция "Основная" » Сделать недоступным столбец в DBGrid [D7, WinXP]
 
  • Евгений (11.12.07 00:39) [0]
    Добрый вечер.
    Попытался сделать недоступным столбец в DBGrid, но варианты закончились быстро ;)
    Кто поделится советом, мыслью - буду признателен.
    С ув. Евгений.
  • Плохиш © (11.12.07 00:43) [1]
    Visible|Enabled := false
  • Германн © (11.12.07 00:58) [2]
    +
    TDBGrid.Columns.Items[].ReadOnly:=False
  • Юрий Зотов © (11.12.07 01:09) [3]
    > Евгений   (11.12.07 00:39)

    Посмотрите внимательно - разве в Инспекторе Объектов при редактировании свойств колонки не появляется свойство ReadOnly?
  • Евгений (11.12.07 01:39) [4]
    Вероятно я не совсем точно сформулировал. Я хочу, чтобы поля этого столбца не выделялись, т.е. что-то типа TControl(DBGrid1).Enabled := false, но это не работает.
  • Евгений (11.12.07 01:40) [5]
    Я хотел сказать TControl(DBGrid1.Columns.Items[0]).Enabled := false
  • {RASkov} © (11.12.07 01:42) [6]
    > [4] Евгений   (11.12.07 00:39)

    Как вариант добавить к TDBGrid'у свойство типа OnSelectCell - TStringGrid'a....
    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, DB, DBTables, Grids, DBGrids;

    type
     TMySelectCellEvent = procedure (Sender: TObject; AColumn: TColumn; var CanSelect: Boolean) of object;

     TMyDBGr = class(TDBGrid)
     private
       FOnSelectCell: TMySelectCellEvent;
     protected
       function SelectCell(ACol, ARow: Longint): Boolean; override;
       property OnSelectCell: TMySelectCellEvent read FOnSelectCell write FOnSelectCell;
     end;
     TDBGrid = class(TMyDBGr);

     TForm1 = class(TForm)
       DBGrid1: TDBGrid;
       DataSource1: TDataSource;
       Table1: TTable;
       procedure FormCreate(Sender: TObject);
     private
       procedure GridSelectCell(Sender: TObject; AColumn: TColumn; var CanSelect: Boolean);
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    { TMyDBGr }

    function TMyDBGr.SelectCell(ACol, ARow: Integer): Boolean;
    begin
     Result := True;
     if Assigned(FOnSelectCell) then FOnSelectCell(Self, Columns[ACol-IndicatorOffset], Result);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
     DBGrid1.OnSelectCell:=GridSelectCell;
    end;

    procedure TForm1.GridSelectCell(Sender: TObject; AColumn: TColumn; var CanSelect: Boolean);
    begin
     CanSelect:=AColumn.Index<>3;
    end;

    end.

  • Евгений (11.12.07 02:15) [7]
    Спасибо огромное!
    Буду пробовать, но уже завтра.
  • {RASkov} © (11.12.07 02:50) [8]
    > [7] Евгений   (11.12.07 02:15)

    Вот заметил фичу одну неприятную, если столбец в данный момент выбран
    и мы внешне запрещаем выбор этого столбца, т.е. меняем условие в GridSelectCell,
    то получается неприятный скролл....
    Оно может реально тебе и не понадобится(т.е. менять "запрещенные" столбцы во время выполнения), но все же...
    Я проверял вот так:

    procedure TForm1.FormCreate(Sender: TObject);
    var N: Integer;
    begin
     DBGrid1.OnSelectCell:=GridSelectCell;
     ComboBox1.Items.Clear;
     for N:= 0 to Table1.Fields.Count-1 do ComboBox1.Items.Add(Table1.Fields[N].FieldName);
     ComboBox1.ItemIndex:=DBGrid1.SelectedIndex;
    end;

    procedure TForm1.GridSelectCell(Sender: TObject; AColumn: TColumn; var CanSelect: Boolean);
    begin
     CanSelect:=AColumn.FieldName<>ComboBox1.Text;
    end;



    Частично(а может и полностью) можно решить проблему так:
    function TMyDBGr.SelectCell(ACol, ARow: Integer): Boolean;
    begin
     Result := True;
     if Assigned(FOnSelectCell) then FOnSelectCell(Self, Columns[ACol-IndicatorOffset], Result);
     if not Result then Result:=SelectedIndex=ACol-IndicatorOffset;
    end;



    Т.е. если в данный момент мы находимся в столбце который запрещаем, то разрешать выделять в нем,
    но стоит выбрать другой, то уже в него не вернутся.... Можно и другой вариант придумать,
    например принудительный выход с заблокированного столбца.... но это сам думай)
    Код написан на коленке, так что могут быть и еще всякие гадкие нюансы :(
    :)

    ЗЫ: И "подмена" компонента - это не совсем "красивый" вариант решения, был тут спор по этому поводу...
    Я же этот способ использовал только ради "быстрого примера"....
 
Конференция "Основная" » Сделать недоступным столбец в DBGrid [D7, WinXP]
Есть новые Нет новых   [134481   +26][b:0][p:0.001]