Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизПромогите решить проблему Найти похожие ветки
← →
_Гость_ (2006-09-10 20:57) [0]Привет всем! Ситуация значить такая: При вводе в Edit должно происходить следуще:
Если вводится символ " (двойные кавычки), то он заменяется на "" (две одинарные кавычки).
Помогите реализовать плиз!
← →
Германн © (2006-09-10 21:18) [1]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #34 then begin
Edit1.Text:=Edit1.Text+#39#39;
Key:=#0;
end;
end;
← →
Anatoly Podgoretsky © (2006-09-10 22:28) [2]Так ведь не обязательно в конце и должно учитываться выставленное выделение. SelText := #39#39;
← →
default © (2006-09-10 22:37) [3]Anatoly Podgoretsky © (10.09.06 22:28) [2]
как мне напомнило это ветку про запрет ввода пробелов в едит:)
← →
Германн © (2006-09-10 22:42) [4]
> Anatoly Podgoretsky © (10.09.06 22:28) [2]
>
> Так ведь не обязательно в конце и должно учитываться выставленное
> выделение. SelText := #39#39;
Так ведь просили только чтоб из крана не капало! А про то, что после ремонта нужно пользоваться водой ничего не говорили :-)
← →
Loginov Dmitry © (2006-09-11 00:06) [5]Без учета текущего выделения:
procedure TForm1.Edit1Change(Sender: TObject);
begin
Edit1.OnChange := nil;
Edit1.Text := StringReplace(Edit1.Text, """, """""", [rfReplaceAll]);
Edit1.OnChange := Edit1Change;
end;
← →
_Гость_ (2006-09-11 00:18) [6]Спасибо, а как вернуться на конец строки?)
← →
Loginov Dmitry © (2006-09-11 00:22) [7]> Спасибо, а как вернуться на конец строки?)
SelStart
← →
_Гость_ (2006-09-11 00:25) [8]Первый вариант работает, тоько После Key:=#0 надо вернуться на конец строки без вскяких SelStart)?
← →
default © (2006-09-11 00:32) [9]вот, неоптимально и за ошибки ответ не несу
procedure TForm1.Edit1Change(Sender: TObject);
var
i, c, p: Integer;
begin
with Edit1 do begin
c := 0;
for i := 1 to SelStart do
if Text[i] = """ then Inc(c,2);
p := SelStart + c;
OnChange := nil;
Text := StringReplace(Text, """, """""", [rfReplaceAll]);
OnChange := Edit1Change;
SelStart := p;
SelLength := 0;
end;
end;
← →
default © (2006-09-11 00:46) [10]вот так
procedure TForm1.Edit1Change(Sender: TObject);
var
i, c, p: Integer;
begin
with Edit1 do begin
c := 0;
for i := 1 to SelStart do
if Text[i] = """ then Inc(c);
p := SelStart + c;
OnChange := nil;
Text := StringReplace(Text, """, """""", [rfReplaceAll]);
OnChange := Edit1Change;
SelStart := p;
end;
end;
← →
Германн © (2006-09-11 00:49) [11]
> _Гость_ (11.09.06 00:25) [8]
>
> Первый вариант работает, тоько После Key:=#0 надо вернуться
> на конец строки без вскяких SelStart)?
Чем тебе не угодил SelStart?procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Key = #34 then begin
Edit1.SelText:=#39#39;
Edit1.SelStart:=Length(Edit1.Text);
Key:=#0;
end;
end;
Только вот щас опять придёт кто-нибудь, чтоб по-буквоедствовать :-)
← →
_Гость_ (2006-09-11 00:57) [12]Спасибо Герман очень помог!!!
А код можешь прокоментировать?)
← →
Германн © (2006-09-11 01:01) [13]
> Спасибо Герман очень помог!!!
>
Да соссно не за что. Вариант default © (11.09.06 00:46) [10], имхо более широкий, чем мой.
> А код можешь прокоментировать?)
А что тут комментировать? Что вызывает у тебя вопросы?
← →
_Гость_ (2006-09-11 01:02) [14]SelStart!? не сталкивался!
← →
Плохиш © (2006-09-11 01:14) [15]Мда, вот и начались лабораторные.
> _Гость_
Обрати внимание, здесь есть конференция "Начинающим".
← →
Германн © (2006-09-11 01:23) [16]
> Гость_ (11.09.06 01:02) [14]
>
> SelStart!? не сталкивался!
>
Так столкнись, то бишь нажми F1 :-)
Там всего-то 5 строчек с информацией (по-крайней мере в Д6).
← →
Германн © (2006-09-11 02:06) [17]Хм. И никто не пришёл "по-буквоедствовать" :-(
Придётся самому. :-)
2 default © (11.09.06 00:46) [10]
Переменная p - явно лишняя.
Вместоwith Edit1 do begin
, имхо стоит писАтьwith TEdit(Sender) do begin
.
← →
default © (2006-09-12 00:10) [18]Германн © (11.09.06 02:06) [17]
TEdit(Sender) можно добавить для универсальности
p тоже можно убрать, но это всё мелочи, интересней было бы вручную без StringReplace сделать - это оптимальней
кстати, у меня закралось сомнение
не думаете ли Вы, что код в [10] равносилен коду
procedure TForm1.Edit1Change(Sender: TObject);
var
i, c: Integer;
begin
with Edit1 do begin
c := 0;
for i := 1 to SelStart do
if Text[i] = """ then Inc(c);
OnChange := nil;
Text := StringReplace(Text, """, """""", [rfReplaceAll]);
OnChange := Edit1Change;
SelStart := SelStart + c;
end;
end;
?
← →
Германн © (2006-09-12 02:48) [19]
> default © (12.09.06 00:10) [18]
>
> Германн © (11.09.06 02:06) [17]
...
> не думаете ли Вы, что код в [10] равносилен коду
Не пытаюсь даже думать, поскольку не знаю детально, реализацию SelStart. Это для меня "перебор"!
Если "очень понадобится" мне, тогда попробую подумать!
> интересней было бы вручную без StringReplace сделать - это
> оптимальней
А вот об этом - поподробнее, пожалуйста! Что есть - "вручную без StringReplace "?
← →
default © (2006-09-12 09:33) [20]Германн © (12.09.06 02:48) [19]
> А вот об этом - поподробнее, пожалуйста! Что есть - "вручную
> без StringReplace "?
всмысле реализовать функциональность StringReplace самому
например, используя его строка в едите заменяется при каждом изменении текста в едите, даже если при этом изменении нету в едите никаких символов ", это может вызывать моргание при быстрых манипуляциях в едите
реализуя вручную, мы, как минимум, будет производить замену текста в едите когда в нём будут символы "
да и собственная реализация пошустрее будет...но данный код, думаю, не критичен по скорости, это уж так, забавы ради
← →
Германн © (2006-09-12 17:13) [21]2 default © (12.09.06 09:33) [20]
> например, используя его строка в едите заменяется при каждом
> изменении текста в едите, даже если при этом изменении нету
> в едите никаких символов ", это может вызывать моргание
> при быстрых манипуляциях в едите
Дык а что мешает выполнять StringReplace только тогда, когда нужно?
← →
default © (2006-09-12 17:24) [22]Германн © (12.09.06 17:13) [21]
ну чтобы понять, что его не надо вызывать надо пробежаться по тексту в едите на предмет наличия символов ", а по ходу пробега можно уже сделать и работу за StringReplace
можно, конечно, писать и типа if (Text <> StringReplace(Text, """, """""", [rfReplaceAll])) then //заменяем текст в едите
← →
default © (2006-09-12 17:26) [23]или Pos использовать
← →
default © (2006-09-12 17:30) [24]Германн © (12.09.06 17:13) [21]
лучше выделить память под строку длиной с две длины строки в едите
вручную заполнить строку и урезать длину насколько нужно
← →
novill © (2006-09-12 17:44) [25]ставим stringreplace на OnExit и всё
← →
default © (2006-09-12 18:45) [26]novill © (12.09.06 17:44) [25]
ну конечно
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.015 c