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

по определённому условию надо запретить редактирование отдельной ячейки в 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
03.03.2021, 12:50
    #40050254
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить редактирование отдельной ячейки в TDBGrid
03.03.2021 12:41, hlopotun пишет:
> есть какие ещё идеи у кого?

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

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

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

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

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


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

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

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

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

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

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

да.

Тогда - хардкор. Зовём 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
03.03.2021, 19:34
    #40050434
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить редактирование отдельной ячейки в TDBGrid
03.03.2021 19:24, ъъъъъ пишет:

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

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


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

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

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

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

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

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

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

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

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

+ grid.SelectedField
...
Рейтинг: 0 / 0
04.03.2021, 14:15
    #40050660
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить редактирование отдельной ячейки в TDBGrid
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
04.03.2021, 14:31
    #40050671
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как запретить редактирование отдельной ячейки в TDBGrid
_Vasilisk_
Не тормози

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


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