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

Вниз

Как DBGridEh сделать запрет на изменение определенных ячеек?   Найти похожие ветки 

 
waw ©   (2003-09-19 16:26) [0]

Как DBGridEh сделать запрет на изменение определенных ячеек?
Точно так же как в Excel. У меня есть признак по которому я поеределяю нужно блокировать ячейку или нет. Но как сообщить об этом DBGridEh ????


 
Stas ©   (2003-09-19 16:33) [1]

Dbgrideh1.columns[0].readOnly:=true;


 
waw ©   (2003-09-19 16:45) [2]

Спасибо конечно. Но мне не колонку нужно болкировать, а одну из ячеек.


 
Stas ©   (2003-09-19 16:55) [3]

Я так понимаю тебе нужно закрывать колонку но в некоторых записях. Можешь на событие DataSet AfterScroll проверять условие и в зависимости от этого закрывать/открывать колонку


 
Sandman25 ©   (2003-09-19 16:56) [4]

В событии OnSelectCell Grid.ReadOnly := True;


 
NAlexey ©   (2003-09-19 16:57) [5]

>Как DBGridEh сделать запрет на изменение определенных ячеек?
А как в любом Grid сделать запрет на изменение определенных ячеек так и в DBGridEh.


 
waw ©   (2003-09-19 17:00) [6]

Sandman25 ©
OnSelectCell - не вижу такого события????
У меня версия EhLib 2.4a, а у тебя какая?


 
NAlexey ©   (2003-09-19 17:06) [7]

Да, какая у тебя?


 
Sandman25 ©   (2003-09-19 17:20) [8]

[6] waw © (19.09.03 17:00)

Извиняюсь, не заметил, что вопрос по DBGridEh. Я про стандартный DBGrid говорил. OnCellClick событие называется.


 
waw ©   (2003-09-19 18:13) [9]

Sandman25 © не срабатывает у меня OnCellClick событие по чему то?????


 
Sandman25 ©   (2003-09-19 18:15) [10]

Не срабатывает при выборе другой (нетекущей) ячейки мышой?


 
waw ©   (2003-09-19 18:19) [11]

Ни мыщкой ни табуляцией. Я поставил точку останова в обработчике этого события и ни разу программа не прервалась.


 
Sandman25 ©   (2003-09-19 18:22) [12]

Попробуйте вместо точки останова поставить ShowMessage("hi").


 
waw ©   (2003-09-19 18:53) [13]

> Sandman25
Разобрался OnCellClick не срабатвает если установлена опция dgAlwaysShowEdit := true

Отключил эту опцию, событие OnCellClick начало срабатывать, но только от клика мышкой на ячейке. Если я попадаю в защищенную ячейку а затем курсором перемещаюсь в НЕ защищенную редактирование становится невозможным. В событиие OnCellClick, передается параметр - Column: TColumnEh, если написать так:
Column.ReadOnly := true;
блокируется вся колонка.


> Stas © (19.09.03 16:55) [3]
> Я так понимаю тебе нужно закрывать колонку но в некоторых
> записях. Можешь на событие DataSet AfterScroll проверять
> условие и в зависимости от этого закрывать/открывать колонку


Событие AfterScroll возникает при изменении записи, а мне необходимо заблокировать ячейку. Если я нахожусь в одной записи тогда все ячейки, при использовании AfterScroll будут заблокированы.

Ну неужели нет механизма отлавливать событие перемещения по ячейкам? Неужели прийдется обрабатывать клавиши перемещения, и события мыши?


 
Sandman25 ©   (2003-09-19 18:56) [14]

> затем курсором перемещаюсь

Так обрабатывайте еще и OnKeyDown


 
Stas ©   (2003-09-22 09:32) [15]

waw © (19.09.03 18:53) [13]

>Событие AfterScroll возникает при изменении записи, а мне >необходимо заблокировать ячейку. Если я нахожусь в одной >записи тогда все ячейки, при использовании AfterScroll будут >заблокированы.

ВСЕ ячеки в одной колонке, а когда ты перейдешь на другую запись(которую иожно редактировать), то все ячейки в данной колонке разблокируются.
Если тебе нужно отловить событие перемещения по колонкам, то OnColExit и OnColEnter


 
VAleksey ©   (2003-09-22 10:33) [16]

При чем тут вообще грид, когда работать нужно с набором данных?
PS
Любите книги, источник знаний.
PPS
Есть у DataSet-а замечательное событие BeforeEdit называется ;-). Достаточно просто сказать в нем "Abort" по определенному условию.


 
Hooch ©   (2003-09-22 10:45) [17]

я делаю так: у TDBGridColumnEh есть событие OnGetCellParams
(Sender: TObject; EditMode: Boolean; Params: TColCellParamsEh)

if EditMode and (TDBGridColumnEh(Sender).Field.AsInteger < 0 ) then
TDBGridColumnEh(Sender).Grid.EditorMode := False

и будет сказка


 
waw ©   (2003-09-22 13:46) [18]


> VAleksey © (22.09.03 10:33) [16]
> При чем тут вообще грид, когда работать нужно с набором
> данных?

Причем тут DataSet, мне нужно не допустить до вознакновения события редактирования! Мне в гриде нужно запретить саму возможность входа в режим редактирования. Хотя это тоже решение вопроса. Подскажите где взять процедуру "Abort"?

> Hooch © (22.09.03 10:45) [17]
> я делаю так: у TDBGridColumnEh есть событие OnGetCellParams
> .... и будет сказка


Спасибо за дельный совет. Попробую, только до конца я не понял как это сделать.


 
waw ©   (2003-09-22 13:56) [19]

Спасибо всем. Hooch © вы помогли решить проблему окончательно!


 
alex_raider ©   (2003-09-22 14:42) [20]

А я бы тебе посоветовал вообще, никогда не редактировать данные в гриде. Сделай его ReadOnly := true;
Много проблем уйдет...

Делай модальные диалоги, расставляй на них DBEdit`ы (унаследуйся от формы-темплейта, которую я сейчас тебе дам).

и пиши на обработчиках своего Dataset.AfterEdit() Dataset.AfterEdit() такой код:

procedure TDataModule.OrdersAfterInsert(DataSet: TDataSet);
begin
f_e_orders.ShowModal(Dataset);
end;

а темплейт вот такой:
--------------------------------

unit e_dlg_template;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, DB;

type
Tf_dlg_template = class(TForm)
paBottom: TPanel;
bOK: TBitBtn;
bCancel: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
public
FDataSet: TDataSet;
function ShowModal(Dataset: TDataset): Integer;
end;

//var
// f_dlg_template: Tf_dlg_template;

implementation

{$R *.dfm}

procedure Tf_dlg_template.FormCreate(Sender: TObject);
var
SysMenu: HMenu;
begin
BorderStyle := bsDialog;
BorderIcons := [biSystemMenu];
Position := poScreenCenter;
SysMenu := GetSystemMenu(Handle, False);
Windows.EnableMenuItem(SysMenu, SC_CLOSE, MF_DISABLED or MF_GRAYED);
end;

procedure Tf_dlg_template.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := false;
if modalresult = mrOK then FDataset.Post
else FDataset.Cancel;
CanClose := true;
end;

function Tf_dlg_template.ShowModal(Dataset: TDataset): Integer;
begin
FDataSet := Dataset;
Result := inherited ShowModal;
end;

end.


 
waw ©   (2003-09-22 15:32) [21]

Спасибо
> alex_raider ©
Это я тоже пробовал, но все равно огромное спасибо за помощь. Твоим вариантом я тоже обязательно воспользуюсь.



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

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

Наверх




Память: 0.52 MB
Время: 0.021 c
3-3732
AndrewK
2003-09-12 12:50
2003.10.02
Как работать с параметрами в TADOQuery?


1-3817
Rif
2003-09-17 15:03
2003.10.02
как отправить письмо незаметно


3-3760
denis24
2003-09-11 19:29
2003.10.02
Преобразовать строку в дату


1-3929
Санёк
2003-09-21 19:06
2003.10.02
Добрый день мастера!


14-4053
andre
2003-09-14 22:56
2003.10.02
Смайлы.