Советы по Delphi

       

Ошибка в TDBComboBox или особенность работы?


Форма предназначена для ввода новой информации и работает с двумя таблицами – master и detail. Необходимо, чтобы все компоненты формы (DBEdit, DBComboBox) при открытии отображали пустые строки. Информация из таблицы детализации содержится в DBComboBox. Список создается стандартным способом - DBComboBox.Items.Add(Fields[1].AsString. Если DBComboBox.ItemIndex := -1, то должна отображаться пустая строка. При открытии формы в DBComboBox отображается информация последней записи таблицы детализации. Почему последняя строка– надеюсь понятно. Если заменить в процедуре инициализации списка DBComboBox.ItemIndex := -1 на DBComboBox.Text := ''; то появляется другая странность: Пользователь раскрывает список и, ничего не выбрав, переходит на другой компонент – в DBComboBox вновь появляется информация последней записи таблицы детализации. Исправить это поведение DBComboBox можно так - если в модуле DBCTRLS.PAS изменить SetComboText:

procedure TDBComboBox.SetComboText(const Value: string);
var
I: Integer;Redraw: Boolean;begin
if
Value <> GetComboText thenbeginif Style <> csDropDown thenbeginRedraw := (Style <> csSimple) and HandleAllocated;if Redraw then SendMessage(Handle, WM_SETREDRAW, 0, 0);try//------ ADD --------------------------------------------------------------------------------
if ItemIndex = -1 thenbeginText := '';Exit;end; //----------------------------------------------------------------------------------------------
if Value = '' then I := -1 else I := Items.IndexOf(Value);ItemIndex := I;finallyif Redraw thenbeginSendMessage(Handle, WM_SETREDRAW, 1, 0);Invalidate;end;end;if I >= 0 then Exit;end;if Style in [csDropDown, csSimple] then Text := Value;end;end;

После этого откомпилировать модуль DBCTRLS.PAS и заменить старый. Но может быть есть другие варианты.

С уважением, . [000911]



Содержание раздела