Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

Сделать недоступным столбец в DBGrid   Найти похожие ветки 

 
Евгений   (2007-12-11 00:39) [0]

Добрый вечер.
Попытался сделать недоступным столбец в DBGrid, но варианты закончились быстро ;)
Кто поделится советом, мыслью - буду признателен.
С ув. Евгений.


 
Плохиш ©   (2007-12-11 00:43) [1]

Visible|Enabled := false


 
Германн ©   (2007-12-11 00:58) [2]

+
TDBGrid.Columns.Items[].ReadOnly:=False


 
Юрий Зотов ©   (2007-12-11 01:09) [3]

> Евгений   (11.12.07 00:39)

Посмотрите внимательно - разве в Инспекторе Объектов при редактировании свойств колонки не появляется свойство ReadOnly?


 
Евгений   (2007-12-11 01:39) [4]

Вероятно я не совсем точно сформулировал. Я хочу, чтобы поля этого столбца не выделялись, т.е. что-то типа TControl(DBGrid1).Enabled := false, но это не работает.


 
Евгений   (2007-12-11 01:40) [5]

Я хотел сказать TControl(DBGrid1.Columns.Items[0]).Enabled := false


 
{RASkov} ©   (2007-12-11 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.


 
Евгений   (2007-12-11 02:15) [7]

Спасибо огромное!
Буду пробовать, но уже завтра.


 
{RASkov} ©   (2007-12-11 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;


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

ЗЫ: И "подмена" компонента - это не совсем "красивый" вариант решения, был тут спор по этому поводу...
Я же этот способ использовал только ради "быстрого примера"....



Страницы: 1 вся ветка

Текущий архив: 2008.08.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
15-1215459610
Артур Пирожков
2008-07-07 23:40
2008.08.24
Как обмениваться информацией между офисом и пр-ом?


4-1194943868
Niki
2007-11-13 11:51
2008.08.24
ListBox


2-1216283877
Zhekson
2008-07-17 12:37
2008.08.24
Как распечатать изображение с реальными размерами(мм.)?


15-1215576445
Slider007
2008-07-09 08:07
2008.08.24
С днем рождения ! 9 июля 2008 среда


15-1215492465
homm
2008-07-08 08:47
2008.08.24
Интеграция .reg-файла в реестр