Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.02;
Скачать: [xml.tar.bz2];

Вниз

Как 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
1-3845
Pre_AlFa
2003-09-19 09:09
2003.10.02
Перевод C++ исходников на Delphi


6-4009
DimaK
2003-07-25 15:57
2003.10.02
Сообщение по сети


1-3916
WondeRu
2003-09-22 10:03
2003.10.02
Шо за месаг такой в winNTs 0B000h и 0B001h


14-4071
jack128
2003-09-16 00:10
2003.10.02
Именинники 16 сентября


1-3937
Sergiy
2003-09-21 13:45
2003.10.02
Блокировка перевода времени





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский