Сама Windows не позволяет это сделать, но я нашел как это обойти с помощью одной хитрости, и, похоже, это классно работает (надеюсь вы получите даже больше, чем вы хотите :).
Сначала я добавляю к моей форме свойство (и соответствующие переменные и процедуры), наподобие этому:
private FinsertMode: boolean; procedure SetInsertMode(value: boolean); public property insertMode: boolean read FinsertMode write SetInsertMode; |
В обработчике создания события формы я инициализирую его:
procedure TForm1.FormCreate(Sender: TObject); begin {инициализация} insertMode := True; end; |
Также для этого свойства я создаю процедуру SetInsertMode, которая с помощью TPanel с именем Panel1 извещает пользователя о текущем режиме работы:
procedure TForm1.SetInsertMode(value: boolean); begin FinsertMode := value; if FinsertMode then Panel1.Caption := 'ВСТАВКА' else Panel1.Caption := 'ПЕРЕЗАПИСЬ'; end; |
Затем я добавляю три обработчика событий (OnKeyDown, OnKeyPress, OnEnter) для каждого моего DBEdit (можно при наличии нескольких компонентов создать один общий обработчик для всех):
procedure TForm1.DBEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_INSERT) then
insertMode := not insertMode;
end;
procedure TForm1.DBEditKeyPress(Sender: TObject; var Key: Char); begin if (not insertMode) and (Sender is TDBEdit) then (Sender as TDBEdit).SelLength := 1 else (Sender as TDBEdit).SelLength := 0; end; procedure TForm1.DBEditEnter(Sender: TObject); begin insertMode := True; end; |
Банзай! Похоже это работает, хотя я и не имел достаточного времени протестировать это. Естественно, вы можете изменить это по просьбе вашего заказчика (например, я всегда сбрасывал режим во вставку при перемещении к другому компоненту DBEedit). Все вышесказанное должно также работать без проблем и с компонентами Edit.
- Denis Sarrazin [001049]