Приветствую Вас Гость | RSS

Delphi заготовки

Вторник, 26.11.2024, 23:38
Главная » 2012 » Май » 15 » Использование функции ReplaceStr в Delphi / пример склонения месяца по падежам
07:55
Использование функции ReplaceStr в Delphi / пример склонения месяца по падежам
System.StrUtils.ReplaceStr

Delphi

function ReplaceStr(const AText, AFromText, AToText: string): string;

C++

extern PACKAGE System::UnicodeString __fastcall ReplaceStr(const System::UnicodeString AText, const System::UnicodeString AFromText, const System::UnicodeString AToText)/* overload */;

Описание
Заменяет все вхождения подстроки в строку, используя поиск с учетом регистра.
Используйте ReplaceStr чтобы заменить все вхождения подстроки
AFromText со строкой AToText, в строке AText.
ReplaceStr возвращает строку, полученные после замены.
Используйте ReplaceText сделать без учета регистра замены.

    Примечание: Рекурсивные замена подстрок не поддерживается. Это означает, что если замена AToText результаты в новом матче за AFromText, что матч не будет заменен.


для  Delphi 7 код

function ReplaceStr(const AText, AFromText, AToText: string): string;
{замена подстроки в строке}
var
  I: Integer;
  Source: string;
begin
  Source := AText;
  Result := '';
  repeat
    I := Pos(AFromText, Source);
    if I >
    0 then
    begin
      Result := Result + Copy(Source, 1, I - 1) + AToText;
      Source := Copy(Source, I + Length(AFromText), MaxInt);
    end
    else
      Result := Result + Source;
  until I<= 0;
end;



далее  идет пример функции преобразования месяца по падежам

массив
type
     TRusCase = (rcImn, rcRod, rcDat, rcVin, rcTvr, rcPrd);

TWordDec=set of char; // разделители слов

из наших функций

получить слово номер

Function GetPosIndex(s:string;index:integer;bkend:TWordDec;len:integer=0):Tpoint;
var y,x:integer;
    s2:string;
begin
  y:=0;
  s2:='';
  result.X:=1;
  result.y:=0;
  for X:=1 to length(s) do begin
if (ord(s[x])<33) or (s[x] in bkend) or (x=length(s)) then
                       begin
                       if (s2<>'') and ((len=0) or (length(s2)>=len))  then begin
                             y:=y+1;
                             if y=index then begin
                               result.y:=x-result.X;
                               exit;
                             end
                             end;
                             s2:='';
                          end
                          else begin
                          if s2='' then result.X:=x;
                          s2:=s2+s[x];

                          end;


  end;

end;

Function GetSlovoIndex(s:string;index:integer;bkend:TWordDec;len:integer=0):string;
var pr:Tpoint;
begin
    pr:=GetPosIndex(s,index,bkend,len);
    if pr.X>0 then
    if pr.y>0 then result:=copy(s,pr.x,pr.y);

end;


и собственно сама функция

function RusCaseMonthName(const Num: Integer; RusCase: TRusCase = rcImn): String;
  // function result is russion name of month, corresponding number
  // (Num parameter). You may change Case of Month Name by RusCase parameter
  // Возвращает русское название месяца по его номеру. Необязательный параметр
  // RusCase - падеж в котором возвращается результат. По умолчанию именительный
  // ExtractWord - функция из StrUtils библиотеки RxLibrary, лень было переписывать хорошо работающую функцию.
const
  RootWord: array [1..12] of string = ('Январ', 'Феврал', 'Март', 'Апрел',
                                       'Ма', 'Июн', 'Июл', 'Август','Сентябр',
                                       'Октябр', 'Ноябр', 'Декабр');

  AddEnd: array [0..5] of String  = ('#-а-у-#-ом-е',
                                      'ь-я-ю-ь-ем-е',
                                      'й-я-ю-й-ем-е',
                                      'ь-я-ю-ь-ем-е',
                                      'ь-я-ю-ь-ем-е',
                                      '#-а-у-#-ом-е');
  StdEnd: array [1..6] of String = ('ь','я','ю', 'ь', 'ём', 'е');
begin
  if (Num < 3) or (Num > 8) then
   Result := RootWord[Num] + StdEnd[Ord(RusCase)+1]
   else

    Result := ReplaceStr(RootWord[Num] + GetSlovoIndex(AddEnd[Num-3],Ord(RusCase)+1, ['-']), '#', '');
end;



пример

procedure TForm1.Button1Click(Sender: TObject);
begin
   edit1.texT:=RusCaseMonthName(3,rcDat); // Марту
end;







Просмотров: 7058 | Добавил: NetSoftWare | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: