Главная страница
    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.011 c
4-1117826046
aga
2005-06-03 23:14
2005.08.14
принцип отбора в панель задач


4-1118755242
AndreyProg
2005-06-14 17:20
2005.08.14
Как восстановить расположение ярлыков на Рабочем столе?


3-1120638031
Колобок
2005-07-06 12:20
2005.08.14
Посчитать максимальное?


1-1122449272
Codec
2005-07-27 11:27
2005.08.14
Кодирование в UUE


3-1120461930
Draught
2005-07-04 11:25
2005.08.14
suser_id()





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