powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как запретить редактирование отдельной ячейки в TDBGrid
25 сообщений из 30, страница 1 из 2
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050248
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день,

по определённому условию надо запретить редактирование отдельной ячейки в TDBGrid.
Не всей колонки а именно одной ячейки в ней или на худой конец просто удалить из этой ячейки компонент для редактирования.
Была мысль в DrawColumnCell через DrawFrameControl но не вижу подходяшего флага:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
  { flags for DrawFrameControl }
  {$EXTERNALSYM DFC_CAPTION}
  DFC_CAPTION = 1;
  {$EXTERNALSYM DFC_MENU}
  DFC_MENU = 2;
  {$EXTERNALSYM DFC_SCROLL}
  DFC_SCROLL = 3;
  {$EXTERNALSYM DFC_BUTTON}
  DFC_BUTTON = 4;
  {$EXTERNALSYM DFC_POPUPMENU}
  DFC_POPUPMENU = 5;

  {$EXTERNALSYM DFCS_CAPTIONCLOSE}
  DFCS_CAPTIONCLOSE = 0;
  {$EXTERNALSYM DFCS_CAPTIONMIN}
  DFCS_CAPTIONMIN = 1;
  {$EXTERNALSYM DFCS_CAPTIONMAX}
  DFCS_CAPTIONMAX = 2;
  {$EXTERNALSYM DFCS_CAPTIONRESTORE}
  DFCS_CAPTIONRESTORE = 3;
  {$EXTERNALSYM DFCS_CAPTIONHELP}
  DFCS_CAPTIONHELP = 4;

  {$EXTERNALSYM DFCS_MENUARROW}
  DFCS_MENUARROW = 0;
  {$EXTERNALSYM DFCS_MENUCHECK}
  DFCS_MENUCHECK = 1;
  {$EXTERNALSYM DFCS_MENUBULLET}
  DFCS_MENUBULLET = 2;
  {$EXTERNALSYM DFCS_MENUARROWRIGHT}
  DFCS_MENUARROWRIGHT = 4;

  {$EXTERNALSYM DFCS_SCROLLUP}
  DFCS_SCROLLUP = 0;
  {$EXTERNALSYM DFCS_SCROLLDOWN}
  DFCS_SCROLLDOWN = 1;
  {$EXTERNALSYM DFCS_SCROLLLEFT}
  DFCS_SCROLLLEFT = 2;
  {$EXTERNALSYM DFCS_SCROLLRIGHT}
  DFCS_SCROLLRIGHT = 3;
  {$EXTERNALSYM DFCS_SCROLLCOMBOBOX}
  DFCS_SCROLLCOMBOBOX = 5;
  {$EXTERNALSYM DFCS_SCROLLSIZEGRIP}
  DFCS_SCROLLSIZEGRIP = 8;
  {$EXTERNALSYM DFCS_SCROLLSIZEGRIPRIGHT}
  DFCS_SCROLLSIZEGRIPRIGHT = $10;

  {$EXTERNALSYM DFCS_BUTTONCHECK}
  DFCS_BUTTONCHECK = 0;
  {$EXTERNALSYM DFCS_BUTTONRADIOIMAGE}
  DFCS_BUTTONRADIOIMAGE = 1;
  {$EXTERNALSYM DFCS_BUTTONRADIOMASK}
  DFCS_BUTTONRADIOMASK = 2;
  {$EXTERNALSYM DFCS_BUTTONRADIO}
  DFCS_BUTTONRADIO = 4;
  {$EXTERNALSYM DFCS_BUTTON3STATE}
  DFCS_BUTTON3STATE = 8;
  {$EXTERNALSYM DFCS_BUTTONPUSH}
  DFCS_BUTTONPUSH = $10;

  {$EXTERNALSYM DFCS_INACTIVE}
  DFCS_INACTIVE = $100;
  {$EXTERNALSYM DFCS_PUSHED}
  DFCS_PUSHED = $200;
  {$EXTERNALSYM DFCS_CHECKED}
  DFCS_CHECKED = $400;
  {$EXTERNALSYM DFCS_TRANSPARENT}
  DFCS_TRANSPARENT = $800;
  {$EXTERNALSYM DFCS_HOT}
  DFCS_HOT = $1000;
  {$EXTERNALSYM DFCS_ADJUSTRECT}
  DFCS_ADJUSTRECT = $2000;
  {$EXTERNALSYM DFCS_FLAT}
  DFCS_FLAT = $4000;
  {$EXTERNALSYM DFCS_MONO}
  DFCS_MONO = $8000;




есть какие ещё идеи у кого?

Спасибо!
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050254
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.03.2021 12:41, hlopotun пишет:
> есть какие ещё идеи у кого?

лови событие ДатаСета и прерывай его Абортом
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050259
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
лови событие ДатаСета и прерывай его Абортом
Плохой совет. Так он сможет поймать только Edit или Post. А перемещение по столбцам датасет не отслеживает.

Если уже лепить костыль, то тогда на какой-нибудь TField.OnChange/OnValidate/ReadOnly
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050266
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.03.2021 12:57, _Vasilisk_ пишет:
>
> Если уже лепить костыль, то тогда на какой-нибудь TField.OnChange/OnValidate/ReadOnly

тоже криво.
по-хорошему нужно плодить наследника и перекрывать в нём function CreateEditor: TInplaceEdit; override;

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050271
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
Мимопроходящий
лови событие ДатаСета и прерывай его Абортом
Плохой совет. Так он сможет поймать только Edit или Post. А перемещение по столбцам датасет не отслеживает.

Если уже лепить костыль, то тогда на какой-нибудь TField.OnChange/OnValidate/ReadOnly


С ReadOnly уже пробовал, он всю колонку делает ReadOnly
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050273
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.03.2021 13:15, hlopotun пишет:
> С ReadOnly уже пробовал, он всю колонку делает ReadOnly

о! ысчо одна идея-костыль возникла:
лови AfterScroll, анализируй нужные тебе поля и выставляй/сбрасывай ReadOnly
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050275
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

сделал в onValidate но из некрасивостей осталось сама возможность ввода текста в это поле, хоть он потом и удаляется.
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050281
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. ColEnter, ColExit и играй с ReadOnly.
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050407
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun
С ReadOnly уже пробовал, он всю колонку делает ReadOnly
Само собой. Его нужно устанавливать или снимать в DataSet.AfterScroll. Ели еще лучше в BeforeEdit/BeforeInsert
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050409
Фотография Sergey1979
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно проверять условие в событии DataChange нужного DataSource и уже по условиям выставлять и снимать ReadOnly нужному столбцу в наборе данных.
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050413
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.03.2021 18:29, Sergey1979 пишет:
> Можно проверять условие в событии DataChange нужного DataSource и уже по условиям выставлять и снимать ReadOnly нужному столбцу в наборе данных.

оно реагирует на любой чих.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050425
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotun
есть какие ещё идеи у кого?

У TDataSet есть "процедурное" свойство BeforeEdit. Навесь на него процедуру-событие.
В процедуре проверяй свое условие, и, если редактировать "нельзя" - вызывай Abort.
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050426
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.03.2021 19:07, ъъъъъ пишет:
> У TDataSet есть "процедурное" свойство BeforeEdit. Навесь на него процедуру-событие.
> В процедуре проверяй свое условие, и, если редактировать "нельзя" - вызывай Abort.

он может начать редактирование в "дозволенном" поле, а потом перейти в "запретное", не дёргая Post
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050431
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий,

да.

Тогда - хардкор. Зовём Abort в OnKeyPress грида. Например:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
  
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (DBGrid1.SelectedField.Index = 1)
  and (DBGrid1.DataSource.DataSet.Fields[0].AsInteger = 2)
   then
   Abort


Работает... почти... ещё события мышки отловить:)
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050434
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.03.2021 19:24, ъъъъъ пишет:

> Работает... почти... ещё события мышки отловить:)

лучше я пойду портвейну жахну!
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050465
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что вы здесь развели? Какие Abort? Какие события мышки? Ведь все просто же
Код: pascal
1.
2.
3.
4.
procedure TForm1.DataSetAfterEdit(DataSet: TDataSet);
begin
  DataSet.FieldByName('ReadOnlyFields').ReadOnly := CalcReadOnly(DataSet);
end;


Всё!
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050468
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

зашибись .
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050546
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Ведь все просто же

То есть после редактирования?
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050552
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
_Vasilisk_
Ведь все просто же

То есть после редактирования?
AfterEdit происходит не после редактирования, а сразу после того, как датасет перешел в состояние редактирования (dsEdit).
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050556
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
wadman
пропущено...

То есть после редактирования?
AfterEdit происходит не после редактирования, а сразу после того, как датасет перешел в состояние редактирования (dsEdit).

И работает?
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050560
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman

И работает?
Способ _Vasilisk_ ? Не знаю.
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050562
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
wadman

И работает?
Способ _Vasilisk_ ? Не знаю.

В том и дело, что запрещать редактирование стоит ДО редактирования.
А его предложение позволяет отредактировать ячейку. Как минимум один раз.
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050565
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
См. ColEnter, ColExit и играй с ReadOnly.

+ grid.SelectedField
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050660
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
В том и дело, что запрещать редактирование стоит ДО редактирования.
Не тормози

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
procedure TDataSet.Edit;
begin
  if not (State in [dsEdit, dsInsert]) then
    if FRecordCount = 0 then Insert else
    begin
      CheckBrowseMode;
      CheckCanModify;
      DoBeforeEdit;
      CheckParentState;
      CheckOperation(InternalEdit, FOnEditError);
      GetCalcFields(ActiveBuffer);
      SetState(dsEdit);
      DataEvent(deRecordChange, 0);
      DoAfterEdit;
    end;
end;

procedure TDataSet.DoBeforeEdit;
begin
  if Assigned(FBeforeEdit) then FBeforeEdit(Self);
end;

procedure TDataSet.DoAfterEdit;
begin
  if Assigned(FAfterEdit) then FAfterEdit(Self);
end;
...
Рейтинг: 0 / 0
Как запретить редактирование отдельной ячейки в TDBGrid
    #40050671
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Не тормози

Проверь в рантайме.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как запретить редактирование отдельной ячейки в TDBGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]