Идёт загрузка страницы...

htp://aptem.net.ru





Ошибка в 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 then
begin
if Style <> csDropDown then
begin
Redraw := (Style <> csSimple) and HandleAllocated;
if Redraw then SendMessage(Handle, WM_SETREDRAW, 0, 0);
try
//------ ADD --------------------------------------------------------------------------------
if ItemIndex = -1 then
begin
Text := '';
Exit;
end;
//----------------------------------------------------------------------------------------------
if Value = '' then I := -1 else I := Items.IndexOf(Value);
ItemIndex := I;
finally
if Redraw then
begin
SendMessage(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 и заменить старый. Но может быть есть другие варианты.

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