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

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

Грабли по имени UpCase [D5, Win95/98]


Иван61 ©   (2002-07-28 20:02:00) 

Необходимо при вводе текста в TEdit получить первый символ заглавным. Делаю так:
procedure TForm1.Edit1Change(Sender: TObject);
Function UpString (stInp:String):String;
var k:integer;
begin
Result:=StInp;
for k:=1 to 1 do
begin
Result[k]:=UpCase(Result[k]);
if Result[k]>="а" then
Result[k]:=Chr(ord("А")+ord(Result[k])-ord("а"));
if Result[k]="ё" then
Result[k]:="Ё";
end;
end;
begin
try
Edit1.Text:=UpString(Edit1.Text);
Edit1.SelStart := Length(Edit1.Text); // Перевод курсора в конец слова
except
end;
end;

Пока всё нормально. Но как только попытаться редактировать слово, то курсор сразу стаёт в конец слова (выполняется Edit1.SelStart := Length(Edit1.Text); ), а без него курсор после преобразования становится в начало строки. Как быть, чтобы при редактировании курсор оставался на месте и не переводился в конец? Может есть более простой вариант?
Заранее спасибо.


Юрий Зотов   (2002-07-28 20:36:00) [1]

В первом варианте Вы забыли поставить [1].

А второй вариант тоже плохой. Он ОЧЕНЬ плохой, поверьте. Там целое море лишних операций. Выкиньте обработчик OnChange совсем и обрабатывайте OnKeyPress - это НАМНОГО лучше.


Иван61   (2002-07-28 20:30:00) [2]

Юрий Зотов © (28.07.02 20:24)

Юрий, спасибо Вам большое. Второй Ваш вариант как раз то, что надо!!!


Иван61   (2002-07-28 20:25:00) [3]

Юрий Зотов © (28.07.02 20:15)

В Вашем варианте все символы вводятся заглавными и курсор всегда в начале. Заглавным должен быть только первый символ.
Как быть?


Юрий Зотов   (2002-07-28 20:24:00) [4]

Стоп... сюда нужно сделать добавление:

procedure TForm1.Edit1Change(Sender: TObject);
var
S: string;
P, L: integer;
begin
Edit1.OnChange := nil;
try
P := Edit1.SelStart;
L := Edit1.SelLength;
S := Edit1.Text;
S[1] := AnsiUpperCase(S[1])[1];
Edit1.Text := S;
Edit1.SelStart := P;
Edit1.SelLength := L
finally
Edit1.OnChange := Edit1Change
end
end;

А еще лучше менять регистр в Edit1.OnKeyPress:
if Edit1.Text = "" then ... // Меняем регистр Key


object pascal   (2002-07-28 20:21:00) [5]

Только лучше
if S<>"" then S[1] := AnsiUpperCase(S[1])[1];


Юрий Зотов   (2002-07-28 20:15:00) [6]

Угу, есть более простой вариант.

procedure TForm1.Edit1Change(Sender: TObject);
var
S: string;
begin
Edit1.OnChange := nil;
try
S := Edit1.Text;
S[1] := AnsiUpperCase(S)[1];
Edit1.Text := S
finally
Edit1.OnChange := Edit1Change
end
end;


Наверх

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