![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Замена двух, трёх символов на один [D7, XP]
mobwar © (2009-01-30 11:46:00)Добрый вам день.
Застрял на самом интересном месте.
Имею проблему с русской раскладкой и давно написал программу по типу транслита ру (на ней я и набираю в данный момент текст). Проблема в том что я использовал функцию OnKeyUp и StringReplace.
В данном случае, сделав опечатку я не имею возможности корректировать слово не стерев его, ибо при отпускании кнопки, каретка уходит в конец слова.
Сейчас заменил на такую функцию:
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if key='G'then key:='Г';
end;
Всё супер, но как сделать замену двух или трёх символов типа ja=я ju=ю,
на лету и при этом не гнать каретку в конец написанного.
Зарание спасибо за варианты.
Anatoly Podgoretsky (2009-01-30 14:31:00) [1]> mobwar (30.01.2009 14:23:05) [5]
KeyUp не возвращает символов (букв)
mobwar (2009-01-30 14:23:00) [2]третий день уже не слезаю с компа :)
Мыслю уже плоско, может можно отследить предыдущую букву и нажимая следующую просто заменить?
Например если стоит буква йнажимая на апросто менялось на я...
Брр.. во всяком случае спасибо, есть информация к размышлению..
KSergey (2009-01-30 13:08:00) [3]Вообще-то по классике для подмены символов надо обрабатывать TWinControl.OnKeyPress.
Но раз стоит задача подменять не по одному символу, т.е. придется и длину строки и положение каретки корректировать, то лично я бы, чтобы ничего не напортачить и не искать обходные пути, сделал бы так: в OnKeyPress слал сам себе юзерской сообщение через PostMessage, а уже в нем фактически имея уже готовый полностью текст для подмен смотрел на положение каретки (SelStart) и левее нее любым желаемым образом менял символы в Memo. Во всяком случае тут уже руки будут полностью развязаны, в отличии от обработки стандартных сообщений, на которые система иногда затачивается реагировать определенным образом.
clickmaker (2009-01-30 12:52:00) [4]> memo1.SelStart:=length(memo1.Text);
PrevSelStart := memo1.SelStart;
...
memo1.SelStart:=PrevSelStart + корректировка на длину замененного текста
Anatoly Podgoretsky (2009-01-30 11:51:00) [5]> mobwar (30.01.2009 11:46:00) [0]
Delete/Insert
mobwar (2009-01-30 11:51:00) [6]Ах да, забыл вам изначальный вариант показать, может кто посоветует...
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if GetKeyState(VK_SHIFT) < 0 then
Memo1.Text:= StringReplace(Memo1.Text, 'ЙО', 'Ё',
[rfReplaceAll, rfIgnoreCase])
else
Memo1.Text:= StringReplace(Memo1.Text, 'jo', 'ё',
[rfReplaceAll, rfIgnoreCase]);
memo1.SelStart:=length(memo1.Text);
memo1.SetFocus;
end;