Главная страница
    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
3-1120734847
Ирина
2005-07-07 15:14
2005.08.14
ADOTable


14-1121802945
JohnJ
2005-07-19 23:55
2005.08.14
не проигрывается музыка


4-1118401293
Андрей Жук
2005-06-10 15:01
2005.08.14
Неверный результат работы функции


1-1122272734
tttyu
2005-07-25 10:25
2005.08.14
Проблемы с запуском Delphi


4-1119508902
Grief
2005-06-23 10:41
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский