Есть frmMeasurement, на ней два ComboBox с ForeignKey и FieldName, также они завязаны при помощи Increm. Search на две скрытые визуально кнопки с действием "Поиск". Кроме того, имеется видимая кнопка Reset с действием "Поиск", которая "отменяет" действие ComboBox'ов и приводит таблицу tgMeasurement в "исходное" состояние (на момент первичного открытия frmMeasurement). Собственно, вся диспозиция.
Код приведен выше, его я специально даю абстрактно, без привязки к конкретным именам форм и компонентов формы, однако повторюсь и здесь:
var tgSQLQuery: string;
...
procedure frm_tg_OnChange (Sender: TObject); // таблица, в куда выводится результат ComboBox'ов и кнопки Reset
begin
// при первом показе frm получим исходный SQL-запрос
if tgSQLQuery = '' then tgSQLQuery := frm.tg.dbGetSqlStatement;
end;
procedure frm_btnReset_OnClick (Sender: TObject; var Cancel: boolean);
begin
frm.tg.dbItemID := -1;
frm.tg.dbFilter := '';
if frm.cb1.dbItemID <> -1 then frm.cb1.dbItemID := -1;
if frm.cb2.dbItemID <> -1 then frm.cb2.dbItemID := -1;
end;
procedure frm_cb2_OnChange (Sender: TObject); // связанный через Increm. Search с скрытой кнопкой btn2 с действием "Поиск"
begin
if frm.cb2.dbItemID = -1 then
frm.tg.dbGetSqlStatement := tgSQLQuery;
end;
procedure frm_cb1_OnChange (Sender: TObject); // связанный через Increm. Search с скрытой кнопкой btn1 с действием "Поиск"
begin
if frm.cb1.dbItemID = -1 then
frm.tg.dbGetSqlStatement := tgSQLQuery;
end;
...
begin
tgSQLQuery := '';
end.
Собственно, проблема как раз и состоит в том, что если не выделить в таблице на форме какую-нить строку, то все взаимодействует как и задумывалось - нажатие кнопки Reset возвращает таблицу на форме в "исходное" состояние, то же происходит и при выборе пустых значений в обоих ComboBox'ах.
НО стоит только выделить строку в таблице - так нажатие кнопки Reset приводит лишь к отображению выделенной строки в таблице. При этом установка в выпадающих списках пустого значения тоже работает лишь по настройке связанных с ComboBox'ами кнопками с действием "Поиск".
Не смотря на весь приведенный код, где строками
frm.tg.dbItemID := -1;
frm.tg.dbFilter := '';
я пытаюсь снять выделение строки в таблице и очистить фильтры, если таковые имеются, чтобы они не влияли на SQL-запрос кнопки Reset.
UPD1. Такое впечатление, что код
procedure frm_tg_OnChange (Sender: TObject);
begin
// при первом показе frm получим исходный SQL-запрос
if tgSQLQuery = '' then tgSQLQuery := frm.tg.dbGetSqlStatement;
end;
срабатывает каждый раз при изменении таблицы на форме при помощи ComboBox'ов, хотя такое не должно быть, так как во второй и последующие события OnCnange таблицы переменная tgSQLQuery не пустая.
UPD1.1. Да, переменная tgSQLQuery меняет свое значение КАЖДЫЙ раз при наступлении OnChange таблицы на форме. Решение - ввод дополнительного флага булевского типа:
var tgSQLQuery_Flag: boolean;
...
procedure frm_tg_OnChange (Sender: TObject);
begin
// при первом показе frm получим исходный SQL-запрос ПО ЗАДУМКЕ!!!
if not tgSQLQuery_Flag then
begin
tgSQLQuery := frmMeasurement.tgMeasurement.dbGetSqlStatement;
tgSQLQuery_Flag := True;
end;
end;
...
begin
tgSQLQuery_Flag := False;
...
end.
но это не решает проблему работы кода не так, как задумывается, при выделенной строке в таблице на форме...
UPD2. Вижу проблему некорректной работы кода (не так, как хотелось бы, как задумывалось) в том, что не снимается выделение со строки в таблице на форме. Попробовал изменить код так:
procedure frm_cb2_OnChange (Sender: TObject);
begin
if frm.cb2.dbItemID = -1 then
begin
frm.tg.dbItemID := -1;
frm.tg.dbGetSqlStatement := tgSQLQuery;
end;
end;
procedure frm_cb1_OnChange (Sender: TObject);
begin
if frm.cb2.dbItemID = -1 then
begin
frm.tg.dbItemID := -1;
frm.tg.dbGetSqlStatement := tgSQLQuery;
end;
end;
и результата - ноль... Все та же работа не так, как задумывалось. Как убрать выделение строки в таблице?
UPD3. Понял, что дурак... Переделал код так:
procedure frm_btnReset_OnClick (Sender: TObject; var Cancel: boolean);
begin
frm.tg.dbItemID := -1;
frm.tg.dbFilter := '';
if frm.cb1.dbItemID <> -1 then frm.cb1.dbItemID := -1;
if frm.cb2.dbItemID <> -1 then frm.cb2.dbItemID := -1;
end;
procedure frm_cb2_OnChange (Sender: TObject);
begin
if frm.cb2.dbItemID = -1 then
begin
frm.tg.ClearRows;
frm.btnReset.Click;
end;
end;
procedure frm_cb1_OnChange (Sender: TObject);
begin
if frm.cb1.dbItemID = -1 then
begin
frm.tg.ClearRows;
frm.btnReset.Click;
end;
end;
Во-первых, избавили от события OnChange таблицы на форме, во-вторых, избавились от переменных tgSQLQuery и tgSQLQuery_Flag. При этом установка ComboBox'ов в пустое значение работает даже при выделенной строке в таблице, что и требовалось. Осталось лишь заставить нормально работать кнопку Reset при выделенной строке в таблице, ибо продолжается некорректная работа Reset при выделенной строке в таблице.