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

Вниз

заглавная буква после точки.   Найти похожие ветки 

 
Max4   (2005-07-22 12:42) [0]

Есть задача - сабж.

Получается только для первой встретившийся точки в тексте - после неё заглавная становится. Остальные игнорируются.
Не могу правильно организовать рекурсию.

Код далее.


procedure TForm1.SetUpper(var value: String);
var
 s1: String;

 function SetUpperCaseAfter(value: String): String;
 var
   j: Integer;
   s: String;
 begin
   for j := 1 to Length(value) - 1 do
   if value[j] <> " " then
   begin
     s := value[j];
     s := AnsiUpperCase(s);
     value[j] := s[1];
     Break;
   end;
   Result := value;
 end;

begin
 if Pos(".", value) = 0 then
   Exit;
 s1 := copy(value, Pos(".", value) + 1, Length(value) - Pos(".", value));
 s1 := SetUpperCaseAfter(s1);
 value := copy(value, 0, Pos(".", value)) + s1;
 SetUpper(s1);
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
var
 s: String;
 i: Integer;
begin
 i := Edit1.SelStart;
 s := Edit1.Text;
 SetUpper(s);
 Edit1.Text := s;
 Edit1.SelStart := i;
end;


 
Alx2 ©   (2005-07-22 12:51) [1]

Сложности какие...
Встретилась точка и несущественный мусор после - устанавливаем флаг.
Встретилась буква и флаг установлен - меняем букву на загланвую.
Сбрасываем флаг.


 
Antonn ©   (2005-07-22 12:52) [2]

потому что Pos


 
TUser ©   (2005-07-22 12:52) [3]

procedure SetUpper(var S: string);
var i: integer;
   f: boolean;
   c: char;
begin
 f:=true;
 for i:=1 to length(S) do begin
   if f then begin
     c:=upcase(S[i]); // ansi ??
     if c <> S[i] then begin
       f:=false;
       S[i]:=c;
       end;
     end;
   f:=S[i]=".";
   end;
end;


 
Max4   (2005-07-22 12:59) [4]

Вот,что получилось


procedure TForm1.SetUpper2(var value: String);
var
 s1: String;
 i: Integer;
 flag: Boolean;

begin
 flag := False;
 for i := 0 to Length(value) - 1 do
 begin
   if flag and (value[i] <> " ") then
   begin
     s1 := AnsiUpperCase(value[i]);
     value[i] := s1[1];
     flag := False;
   end;
   if value[i] = "." then
     flag := True;
 end;
end;


 
TUser ©   (2005-07-22 13:02) [5]

[4] есть еще переводы строки и прочая муть. Поэтому [3] универсальнее, имхо.


 
Max4   (2005-07-22 13:11) [6]

imho в [3] необходимо всё таки флаг выставлять в true только в случае если текущий символ ".",а не при каждом проходе. Т.к. если после точки будет пробел например, то логика будет нарушена.
ЗЫ хотя это и так ясно.

спасибо за подсказки



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
14-1122129270
}{eRsOn
2005-07-23 18:34
2005.08.14
Копирование повреждённого CD!


1-1122356559
rentgen
2005-07-26 09:42
2005.08.14
Выбор ячейки в DBGrid


10-1098969514
Oleg_
2004-10-28 17:18
2005.08.14
COM сервер


4-1119514963
Amid
2005-06-23 12:22
2005.08.14
Как узнать права доступа к папке


3-1120826005
DriveIS
2005-07-08 16:33
2005.08.14
Access+Delphi+форматированный текст