Главная страница
    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
4-1118827675
mad0max
2005-06-15 13:27
2005.08.14
Transparent STATIC


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


4-1118400018
Allex
2005-06-10 14:40
2005.08.14
внедрение в системное меню


1-1122384183
John
2005-07-26 17:23
2005.08.14
перерисовка listbox


14-1122230370
Chuvak
2005-07-24 22:39
2005.08.14
Посоветуйте цифровик...





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