Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.012 c
15-1157716569
Руслан
2006-09-08 15:56
2006.10.01
Запуск *.bat - файла с помощью планировщика


15-1158000666
AntiUser
2006-09-11 22:51
2006.10.01
Сортировка и ORDER BY


15-1158048993
Виталий Панасенко
2006-09-12 12:16
2006.10.01
Turbo Delphi


2-1157964421
031178
2006-09-11 12:47
2006.10.01
Работа с DBComboBox


1-1156149962
MegaVolt
2006-08-21 12:46
2006.10.01
Как сделать чтобы при drag&amp;drop моё приложение оставалось активно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский