Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Промогите решить проблему [D7, WinXP]


Страницы:   1 2

_Гость_ ©   (2006-09-10 20:57:00) 

Привет всем! Ситуация значить такая: При вводе в Edit должно происходить следуще:
Если вводится символ " (двойные кавычки), то он заменяется на '' (две одинарные кавычки).
Помогите реализовать плиз!


default   (2006-09-12 18:45:00) [1]

novill ©   (12.09.06 17:44) [25]
ну конечно


novill   (2006-09-12 17:44:00) [2]

ставим stringreplace на OnExit и всё


default   (2006-09-12 17:30:00) [3]

Германн ©   (12.09.06 17:13) [21]
лучше выделить память под строку длиной с две длины строки в едите
вручную заполнить строку и урезать длину насколько нужно


default   (2006-09-12 17:26:00) [4]

или Pos использовать


default   (2006-09-12 17:24:00) [5]

Германн ©   (12.09.06 17:13) [21]
ну чтобы понять, что его не надо вызывать надо пробежаться по тексту в едите на предмет наличия символов ", а по ходу пробега можно уже сделать и работу за StringReplace
можно, конечно, писать и типа if (Text <> StringReplace(Text, '"', '''''', [rfReplaceAll])) then //заменяем текст в едите


Германн   (2006-09-12 17:13:00) [6]

2 default ©   (12.09.06 09:33) [20]

> например, используя его строка в едите заменяется при каждом
> изменении текста в едите, даже если при этом изменении нету
> в едите никаких символов ", это может вызывать моргание
> при быстрых манипуляциях в едите

Дык а что мешает выполнять StringReplace только тогда, когда нужно?


default   (2006-09-12 09:33:00) [7]

Германн ©   (12.09.06 02:48) [19]

> А вот об этом - поподробнее, пожалуйста! Что есть - "вручную
> без StringReplace "?

всмысле реализовать функциональность StringReplace самому
например, используя его строка в едите заменяется при каждом изменении текста в едите, даже если при этом изменении нету в едите никаких символов ", это может вызывать моргание при быстрых манипуляциях в едите
реализуя вручную, мы, как минимум, будет производить замену текста в едите когда в нём будут символы "
да и собственная реализация пошустрее будет...но данный код, думаю, не критичен по скорости, это уж так, забавы ради


Германн   (2006-09-12 02:48:00) [8]


> default ©   (12.09.06 00:10) [18]
>
> Германн ©   (11.09.06 02:06) [17]
...
> не думаете ли Вы, что код в [10] равносилен коду

Не пытаюсь даже думать, поскольку не знаюдетально, реализацию SelStart. Это для меня "перебор"!
Если "очень понадобится" мне,  тогда попробую подумать!


> интересней было бы вручную без StringReplace сделать - это
> оптимальней

А вот об этом - поподробнее, пожалуйста! Что есть - "вручную без StringReplace "?


default   (2006-09-12 00:10:00) [9]

Германн ©   (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-11 02:06:00) [10]

Хм. И никто не пришёл "по-буквоедствовать" :-(
Придётся самому. :-)
2 default ©   (11.09.06 00:46) [10]
Переменная p - явно лишняя.
Вместо with Edit1 do begin, имхо стоит писАть with TEdit(Sender) do begin.


Германн   (2006-09-11 01:23:00) [11]


> Гость_   (11.09.06 01:02) [14]
>
> SelStart!? не сталкивался!
>

Так столкнись, то бишь нажми F1 :-)
Там всего-то 5 строчек с информацией (по-крайней мере в Д6).


Плохиш   (2006-09-11 01:14:00) [12]

Мда, вот и начались лабораторные.

> _Гость_

Обрати внимание, здесь есть конференция "Начинающим".


_Гость_   (2006-09-11 01:02:00) [13]

SelStart!? не сталкивался!


Германн   (2006-09-11 01:01:00) [14]


> Спасибо Герман очень помог!!!
>

Да соссно не за что. Вариант default ©   (11.09.06 00:46) [10], имхо более широкий, чем мой.


> А код можешь прокоментировать?)

А что тут комментировать? Что вызывает у тебя вопросы?


_Гость_   (2006-09-11 00:57:00) [15]

Спасибо Герман очень помог!!!
А код можешь прокоментировать?)


Германн   (2006-09-11 00:49:00) [16]


> _Гость_   (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;

Только вот щас опять придёт кто-нибудь, чтоб по-буквоедствовать :-)


default   (2006-09-11 00:46:00) [17]

вот так

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;


default   (2006-09-11 00:32:00) [18]

вот, неоптимально и за ошибки ответ не несу

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;


_Гость_   (2006-09-11 00:25:00) [19]

Первый вариант работает, тоько После Key:=#0 надо вернуться на конец строки без вскяких SelStart)?


Loginov Dmitry   (2006-09-11 00:22:00) [20]

> Спасибо, а как вернуться на конец строки?)


SelStart


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо