Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.012 c
14-1121785921
Profi
2005-07-19 19:12
2005.08.14
Могу ли я использовать JVCL в Shareware?


4-1118573861
Juk
2005-06-12 14:57
2005.08.14
Обработка WM_NCACTIVATE.


8-1112887933
3DiMaN
2005-04-07 19:32
2005.08.14
выделение из BMP массива пикселов


6-1115251033
Программович
2005-05-05 03:57
2005.08.14
Поддержка TIdHTTPServer ом cgi приложений


4-1119532527
Толян
2005-06-23 17:15
2005.08.14
Работа с BIOS в Windows из своего приложения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский