Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Промогите решить проблему   Найти похожие ветки 

 
_Гость_   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
1-1156082705
igsi
2006-08-20 18:05
2006.10.01
помогите с установкой компанентов


2-1157870054
F1rst
2006-09-10 10:34
2006.10.01
Вопрос по clipboard???


15-1157997353
Nic
2006-09-11 21:55
2006.10.01
Visual Studio


15-1157884524
Проггер из библиотеки
2006-09-10 14:35
2006.10.01
Формат mp3 (не ID3 тегов!!!)


15-1158054448
комар
2006-09-12 13:47
2006.10.01
кодировка