-
Евгений (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;
Т.е. если в данный момент мы находимся в столбце который запрещаем, то разрешать выделять в нем,
но стоит выбрать другой, то уже в него не вернутся.... Можно и другой вариант придумать,
например принудительный выход с заблокированного столбца.... но это сам думай)
Код написан на коленке, так что могут быть и еще всякие гадкие нюансы :(
:)
ЗЫ: И "подмена" компонента - это не совсем "красивый" вариант решения, был тут спор по этому поводу...
Я же этот способ использовал только ради "быстрого примера"....