powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DisableControls не работает
25 сообщений из 25, страница 1 из 1
DisableControls не работает
    #39550573
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
Добрый день,
Есть TDbGridEh с прицепленным TIBQuery
почему-то данный код заставляет скролл грида перемещаться:
Код: pascal
1.
2.
3.
4.
5.
6.
IBQMatch.DisableControls;
for I := 0 to selectedIds.Count-1 do
begin
      IBQMatch.Locate('id',selectedIds.GetValueByIdx(i),[]);
end;
IBQMatch.EnableControls;



Почему?
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550597
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hug,

Все правильно. DisableControls - приостанавливает отрисовку визуальных компонент. EnableControls - восстанавливает отрисовку. Но между ними у вас Locate, который перемещает курсор датасета. Вот и получается, вы заморозили набор, потом переместили курсор, и в момент, когда разморозили набор, курсор в гриде переместился.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550598
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dataset.Bookmark надо сохранить и потом восстановить еще
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550616
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hug,

разве IBQMatch - визуальный компонент? С точки зрения вашей логики надо грид замораживать, а перед его "разморозкой" восстанавливать букмарки, как советовал JaDi
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550632
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокHug,

разве IBQMatch - визуальный компонент? С точки зрения вашей логики надо грид замораживать, а перед его "разморозкой" восстанавливать букмарки, как советовал JaDiНу вот:( А зачем у IBQMatch.DisableControls метод такой по-вашему?
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550636
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокHug,

разве IBQMatch - визуальный компонент? С точки зрения вашей логики надо грид замораживать, а перед его "разморозкой" восстанавливать букмарки, как советовал JaDiIBQMatch.DisableControls внезапно замораживает все связаные с IBQMatch визуальные контролы.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550668
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatДокHug,

разве IBQMatch - визуальный компонент? С точки зрения вашей логики надо грид замораживать, а перед его "разморозкой" восстанавливать букмарки, как советовал JaDiIBQMatch.DisableControls внезапно замораживает все связаные с IBQMatch визуальные контролы.

Ну, точнее визуальные контролы он не трогает - просто перестаёт DataSource дёргать.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550695
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic HunterНу вот:( А зачем у IBQMatch.DisableControls метод такой по-вашему?
наверное, лучше спросить у разработчика?

зы. имхо, на всякий случай приделали ;)
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550698
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatBQMatch.DisableControls внезапно замораживает все связаные с IBQMatch визуальные контролы.
дело хозяйское...
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550748
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45DisableControls - приостанавливает отрисовку визуальных компонент. EnableControls - восстанавливает отрисовку.

Это не совсем так. DisableControls вовсе не столь всемогуще, и отрисовку компонент полностью не убирает.
Точнее, это зависит от конкретных компонентов.

Простой эксперимент:
- сажаем на форму ClientDataset, создаем в нем поле типа Memo.
- добавляем DataSource, DBMemo, связываем это все.

выполняем код

cds.DisableControls;
cds.Append;
cds.FieldByName('TEXT').AsString := 'строка данных';
cds.Post;
// EnableControls не делаем

И на форме видим добавленную строку в DBMemo.

Уже внутри cds.Post, несмотря на DisabledControls, DBMemo заглатывает и отображает эту строку. Стек такой:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
StdWndProc(460418,12,0,29442060) // обработка WM_SETTEXT
TMemoStrings.SetTextStr('... строка...
TDBMemo.LoadMemo
TDBMemo.DataChange($1BF3EE0)
TFieldDataLink.RecordChanged(nil)
TFieldDataLink.SetField($1BF46B4)
TFieldDataLink.UpdateField
TFieldDataLink.DataEvent(deDisabledStateChange,1)
TDataSource.NotifyLinkTypes(deDisabledStateChange,1,True)
TDataSource.NotifyDataLinks(deDisabledStateChange,1)
TDataSource.DataEvent(deDisabledStateChange,1)
TDataSet.DataEvent(deDisabledStateChange,1)
TCustomClientDataSet.DataEvent(deUpdateState,0)
TDataSet.SetState(dsBrowse)
TDataSet.Post
TCustomClientDataSet.Post
TForm1.Button1Click(???)



То есть VСL при DisabledControls не обрывает обработку события deUpdateState DataSet, а только вырабатывает особое событие, deDisabledStateChange. А TFieldDataLink все равно вызывает по нему UpdateField, и дальше идет обычная подгрузка данных в визуальный контрол. Это ясно видно в TDataSet.DataEvent:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TDataSet.DataEvent(Event: TDataEvent; Info: Longint);

  case Event of
    deUpdateState:
      if ControlsDisabled then
      begin
        Event := deDisabledStateChange;
        Info := Integer(State <> dsInactive);
        NotifyDataSources := True;
        FEnableEvent := deLayoutChange;
      end;
  end;

  if NotifyDataSources then
  begin
    for I := 0 to FDataSources.Count - 1 do
      TDataSource(FDataSources[I]).DataEvent(Event, Info);
    if FDesigner <> nil then FDesigner.DataEvent(Event, Info);
  end;


Вообще, у DisableControls для стандартных VCL-компонентов довольно узкая сфера действия: он влияет только на DBGrid и на Detail-датасеты в Master-Detail - связках. Когда он установлен, то при сканировании по датасету DBGrid умеет не делать лишних обновлений, и в связке Master-Detail, Detail'ы не дергаются.

Чтобы все же отключить визуальные компоненты от датасета, можно использовать DataSource.Enabled := False.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550830
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
Добавил букмарки:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
IBQMatch.DisableControls;
bm:=IBQMatch.GetBookmark;
for I := 0 to selectedIds.Count-1 do
begin
      IBQMatch.Locate('id',selectedIds.GetValueByIdx(i),[]);
      dateString:=dateString+QuotedStr(DateToStr(IBQMatch.FieldByName('match_date').AsDateTime,formatSettings))+',';
end;
IBQMatch.GotoBookmark(bm);
IBQMatch.FreeBookmark(bm);
IBQMatch.EnableControls;



все равно грид мотает
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550833
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugвсе равно грид мотает
Отвязывать нужно от datasource перед пробежками по датасету.
Не помню точно, но вроде все наследники от стандартного грида этим страдают.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550845
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanОтвязывать нужно от datasource перед пробежками по датасетуэто ж надо запоминать к чему привязан был
а вот так:
Cane Cat FisherЧтобы все же отключить визуальные компоненты от датасета, можно использовать DataSource.Enabled := Falseможет быть достаточно статус сменить
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550849
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Встречал серьезные проблемы с TDbGridEh + MemTableEh(TreeList) +FireDAC+ + Bookmark
Была задача выделенное в гриде обработать. Обходил по списку букмарков.
Но после успешного окончания обхода, грид просто бесился и фактически не мог работать.
Не удалось залечить ни Locatе-ом ни DisableControls/EnableControls.
Только переоткрытие обоих датасетов и локейт.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550864
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Багрепорт, не?
...
Рейтинг: 0 / 0
DisableControls не работает
    #39550875
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatБагрепорт, не?
В эмбаркадеру? Ну лет через 10 может и исправят.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551102
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По опыту моих багов - реально где-то 6-12 месяцев.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551103
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя просто поныть на форуме - это конечно "разумная альтернатива".
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551139
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatПо опыту моих багов - реально где-то 6-12 месяцев.И в итоге "покупайте новую версию"
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551225
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_rgreatПо опыту моих багов - реально где-то 6-12 месяцев.И в итоге "покупайте новую версию"
Покупайте Support&Maintance.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551492
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
LSVТолько переоткрытие обоих датасетов и локейт.

не могу переоткрывать датасет, так как есть калькулирумые поля
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551496
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  IBQMatch.DisableControls;
  bm:=IBQMatch.GetBookmark;
  grVisit.DataSource:=nil;
  dsMatch.Enabled:=false;
  for I := 0 to selectedIds.Count-1 do
  begin
      IBQMatch.Locate('id',selectedIds.GetValueByIdx(i),[]);
  end;
  IBQMatch.GotoBookmark(bm);
  IBQMatch.FreeBookmark(bm);
  IBQMatch.EnableControls;
  dsMatch.Enabled:=true;
  grVisit.DataSource:=dsMatch;



все равно в каких-то случаях происходит перемотка грида(скрола), запись которая визуально была 3 в окне отображения, ставноится первой (происходит "дерганье")
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551502
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TDBGridEh.SaveBookmark\TDBGridEh.RestoreBookmark.
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551551
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugвсе равно в каких-то случаях происходит перемотка грида(скрола), запись которая визуально была 3 в окне отображения, ставноится первой (происходит "дерганье")
Это нормально (букмарк работает для датасета). Необходимо перед обновлением запомнить порядковый номер строки и восстановить на нее фокус после обновления. Про стандартный грид подсказать не могу -- но может есть какое свойства типа grid.FirstVisibleIndex
...
Рейтинг: 0 / 0
DisableControls не работает
    #39551584
Hug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Hug
Гость
Michael LongneckTDBGridEh.SaveBookmark\TDBGridEh.RestoreBookmark.

Спасибо

1) Дисейбл\Енайбл контролс
2) Букмарк датасета
3) Букмарке грида

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


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