Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10941
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Мастер-Эксперт
Рейтинг: 7235
∙ повысить рейтинг »
Гусятинер Леонид aka lamed
Статус: Академик
Рейтинг: 5799
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Delphi и Lazarus

Номер выпуска:1635
Дата выхода:21.07.2012, 13:00
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:127 / 86
Вопросов / ответов:1 / 1

Консультация # 186451: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Склонение фамилий с использованием Padeg.dll. В комбобокс грузится список фамилий с инициалами, скажем Иванов П.П. Сидоров А.С. и т.д.. Подскажите как сделать так, если я выбрал в комбобоксе Иванов П.П. то в едит1 будет Иванову П.П., соответсвенно если выбран Сидоров А.С. то ...


Консультация # 186451:

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Склонение фамилий с использованием Padeg.dll. В комбобокс грузится список фамилий с инициалами, скажем Иванов П.П. Сидоров А.С. и т.д.. Подскажите как сделать так, если я выбрал в комбобоксе Иванов П.П. то в едит1 будет Иванову П.П., соответсвенно если выбран Сидоров А.С. то Сидорову А.С..В приведенном ниже коде работает склонение если нет инициалов. Если выбираю в комбобоксе "Иванов" в едите выдает "Иванову". Проблема в том что не хочет склонять если с фамилией идут инициалы (Иванов И.И.).
У меня padeg.dll находится в папке с программой.

Код :
  public
    { Public declarations }
  end;
 
var
 
  DllHandle : HMODULE;
  GetFIOPadeg   : function (pLastName, pFirstName, pMiddleName: PChar;
                           bSex: Boolean; nPadeg: LongInt; pResult: PChar;
                           var nLen: LongInt): Integer; stdcall;
 
 
  Form2: TForm2;
  Sex:boolean;
  nLen:LongInt;
  pResult:PChar;
  pVar:integer;
  FPadeg:Boolean;
  Fio,nName,SName:string;
 
implementation
 
procedure TForm2.ComboBox2Chenge(Sender: TObject);
begin
    Fio:=ComboBox2.Text;
 
    Sex:=True;
    if Assigned(GetFIOPadeg) then
      begin
        nLen := Length(FIO)+10;
        pResult:=StrAlloc(nLen);
        try
           pVar:=GetFIOPadeg(PChar(Fio),'','',Sex,3, pResult, nLen);
           Edit3.Text:=pResult;
        finally
           StrDispose(pResult);
    end;
   end;
  end;procedure TForm12.ComboBox2Chenge(Sender: TObject);
begin
    Fio:=ComboBox2.Text;
 
    Sex:=True;
    if Assigned(GetFIOPadeg) then
      begin
        nLen := Length(FIO)+10;
        pResult:=StrAlloc(nLen);
        try
           pVar:=GetFIOPadeg(PChar(Fio),'','',Sex,3, pResult, nLen);
           Edit3.Text:=pResult;
        finally
           StrDispose(pResult);
    end;
   end;
  end;
 
 
initialization
   DllHandle := LoadLibrary('padeg.dll');
   FPadeg:=True;
   if DllHandle <> 0 then
     Begin
       @GetFIOPadeg := GetProcAddress(DllHandle, 'GetFIOPadeg');
     end
   else
     FPadeg:=False;
finalization
   FreeLibrary(DllHandle);
end.

Вот в таком варианте без инициалов склонение происходит. Взял примеры Королевство Delphiотсюда.

Дата отправки: 18.07.2012, 12:29
Вопрос задал: Владимир (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует LanK (Профессионал):

Здравствуйте, Владимир!

Изменить dll невозможно, а вот изменить Ваш код можно.
Фамилии при использовании этой dll изменяются правильно - мешают инициалы...
Для этого разделим ФИО на Ф и ИО.

Стандартная задача - найти первый пробел (так как в фамиилии не может быть пробела) и "вырезать" фамилию.
После преобразования - "вернуть" то что было после пробела.

Все необходимые изменения в Вашем коде выделены зеленым.

Код :
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, INIFiles, StdCtrls, StrUtils;
.....
.....
.....
  Fio, F, io, nName,SName:string;
.....
.....
.....

procedure TForm1.ComboBox1Chenge(Sender: TObject);
begin
    Fio:=ComboBox1.Text;

    F:=LeftStr(Fio, PosEx(' ', Fio));
    io:=RightStr(Fio, Length(Fio)-PosEx(' ', Fio));

    Sex:=True;  //если поменять здесь т.е. использовать какой нибудь еще ComboBox - то будут склоняться женские фамилии при Sex:=False;
    if Assigned(GetFIOPadeg) then
      begin
        nLen := Length(F)+10;
        pResult:=StrAlloc(nLen);
        try
           pVar:=GetFIOPadeg(PChar(F),'','',Sex,3, pResult, nLen);
           Edit1.Text:=pResult+' '+ io;
        finally
           StrDispose(pResult);
    end;
   end;
  end;

Консультировал: LanK (Профессионал)
Дата отправки: 19.07.2012, 09:39
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное