Консультация № 186451
18.07.2012, 12:29
105.73 руб.
0 21 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Склонение фамилий с использованием 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отсюда.

Обсуждение

давно
Посетитель
352040
133
18.07.2012, 13:54
общий
Для проверки написал приложение склонения фамилий. Все необходимое в архиве.
Прикрепленные файлы:
406d35c55b7e286fa2d877b8b3af28fe.rar
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
18.07.2012, 14:24
общий
Адресаты:
Извините, за вопрос - а зачем такие сложности?
Просто найдите первый пробел и "отрежьте" инициалы, а потом верните.


procedure TForm12.ComboBox2Chenge(Sender: TObject);
begin
Fio:=ComboBox2.Text;
F:=LeftStr(ComboBox2.Text; PosEx(" ", ComboBox2.Text));
io:=RightStr(ComboBox2.Text; PosEx(" ", ComboBox2.Text));

...
работа dll
...

Edit3.Text:=F+io;
end;

? или что-то надо другое?
давно
Посетитель
352040
133
18.07.2012, 14:30
общий
Да в принципе можно и так попробовать сделать. Просто в описани к dll было написанно что умеет склонять фамилии с инициалами. Вот я и пытался. Попробую сейча по вашему методу.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
18.07.2012, 14:38
общий
Ругается на точку с запятой F:=LeftStr(ComboBox2.Text;; PosEx(" ", ComboBox2.Text));
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
18.07.2012, 14:46
общий
Адресаты:
Извините, еще раз.
У меня сейчас под рукой нет Delphi будет только вечером... если подождете сделаю рабочий пример. Функции писал по памяти - конечно, не должно быть ";":

procedure TForm12.ComboBox2Chenge(Sender: TObject);
begin
Fio:=ComboBox2.Text;
F:=LeftStr(ComboBox2.Text, PosEx(" ", ComboBox2.Text));
io:=RightStr(ComboBox2.Text, PosEx(" ", ComboBox2.Text));

P.S. Просто если работает без инициалов... мне кажется легче изменить строку чем арзобраться почему с ними не работает...
давно
Посетитель
352040
133
18.07.2012, 15:08
общий
18.07.2012, 15:09
Если Вас не затрудит исправить код, я подожду до вечера. Сейчас пытался вставить то что Вы исправили, опять ругается на строку F:=LeftStr(ComboBox2.Text, PosEx(" ", ComboBox2.Text));. Не нравится ему пробел в кавычках (" "). В вопросе в прикрепленном файле рабочий вариант только без инициалов.

P.S. Заранее благодарю за помощь.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
18.07.2012, 15:46
общий
18.07.2012, 15:53
Разобрался с кавычками ( " ), нужны одинарные ковычки( ' ). Но теперь другая проблема, предложенный Вами вариант работает так- выбираю в комбобоксе "Иванов И.И." получаю на выходе "Ивановуов И.И.". То есть он еще добавляет "ов" к окончанию слова.
Код:
procedure TForm1.ComboBox1Chenge(Sender: TObject);
begin
F:=LeftStr(ComboBox1.Text, PosEx(' ',ComboBox1.Text));
io:=RightStr(ComboBox1.Text, PosEx(' ', ComboBox1.Text));

Sex:=True;
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;


P.S.
Попробовал поменять падежи, к окончанию всегда добавляет "ов". Написал Пушкин К.М. вообще галиматья получилась. Не ожидал что от попытки склонения такая проблема получится.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
18.07.2012, 16:25
общий
Мда, вот что значит пару лет не брать в руки "шашки" ...
куча детских ошибок эээх...

Код:

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;
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;


Всё исправлено, всё работает.
Проверил:

Пушкин А.С.
Лермонтов М.Ю.
Махно Н.И.
Блок А.А.
Дзержинский Ф.Э.
Неизвестный
18.07.2012, 16:27
общий
Адресаты:
Причем искать будет ПЕРВЫЙ пробел.
Т.е. не важно "В.В." или "В. В."...
Но Василий... склонятся не будет.
давно
Посетитель
352040
133
18.07.2012, 17:03
общий
Благодарю за быстрый ответ. Все работает как нужно. Единственное что с женскими фамилиями ерунда получается, но это не критично, у меня будут использоватся только мужские. Еще раз благодарю за помощь. Вопрос можно закрывать.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
19.07.2012, 09:39
общий
это ответ
Здравствуйте, Владимир!

Изменить 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;
Неизвестный
19.07.2012, 09:45
общий
Адресаты:
Оппс. Нашел еще один Ваш вопрос на эту же тему... :).
Проверил - Конь Светлана и Конь Сергей тоже склоняются правильно (я например про такую фамилию и не знал...). Так что Вы нашли отличную dll.
давно
Мастер-Эксперт
680
2811
19.07.2012, 11:43
общий
Вообще-то в фамилиях могут быть пробелы.
Неизвестный
19.07.2012, 12:23
общий
19.07.2012, 12:25
Адресаты:
Например?
Федосеева-Шукшина ??? Тире.

P.S. Просто для самообразования так сказать, чтобы знать :).
давно
Посетитель
352040
133
19.07.2012, 13:28
общий
GetFIOPadegFSAS

Функция предназначена для склонения ФИО, заданных одной строкой, род которых неизвестен. Определение рода осуществляется по окончанию отчества. Функция корректно обрабатывает отчества, имеющие признак рода: Оглы (сын) или Кызы (дочь). Признак рода может записываться через дефис (Аскер-Оглы) или пробел (Аскер Оглы).
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
19.07.2012, 14:54
общий
19.07.2012, 14:54
Адресаты:
Речь идёт об отчестве:
Функция корректно обрабатывает отчества, имеющие признак рода: Оглы (сын) или Кызы (дочь).

В Вашей же задаче была Фамилия и сокращенное "И.О." т.е. отчества мы не знаем (по задаче). Мне таки кажется, что в фамилии не бывает пробелов :(.

Ну приведите хоть одну?

Мамин-Сибиряк ... тире.
давно
Посетитель
352040
133
19.07.2012, 15:10
общий
Прошу прощения, это я для Сучковой Т. М. хотел отправить. А для моей задачи вполне хватает уже приведенного Вами решения.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
680
2811
19.07.2012, 15:32
общий
19.07.2012, 15:33
Обычно это нерусские фамилии. Мартинес Санчес, Фитцджеральд Кеннеди, Ди Каприо, Дос Пасос.
У нас был ученик по фамилии Че Юнь Лин. Именно такая была фамилия, имя было другое.
Правда, в России такие фамилии (китайские, вьетнамские), если их носители интегрировались, могут со временем обзавестись дефисами.
Но если речь идет об иностранцах, то всегда сохраняют написание раздельное.
давно
Посетитель
352040
133
19.07.2012, 15:48
общий
Адресаты:
Как я уже писал, у меня проще. Приложение для работы с документами на предприятии. В этом мне легче, работают только мужчины, и большинство русские. В королевстве делфи мне попалась статья про склонение, там кстати и прокитайские и вьетнамские фамилии, выше я приводил ссылку. И про Фитцджеральд Кеннеди там тоже было А вообще интересная тема получилась. Не ожидал...
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
19.07.2012, 16:08
общий
Адресаты:
Заинтересовали однако...
Пошел искать правила склонения фамилий ...

УЖОС какой то.

Спасибо за вопрос :).
Стал чуточку умнее :).
давно
Мастер-Эксперт
680
2811
21.07.2012, 13:15
общий
Адресаты:

Да, действительно, кошмар.
Мы используем программы для заполнения аттестатов. Там на одном листе ФИО должны быть в родительном падеже. Хорошо, у нас программа, которая позволяет заполнять поля вручную, если варианты не подходят. Коллеги жаловались, в программах от других производителей такое не предусмотрено - так им для одного человека пришлось делать разметку в Word.
Также лишних проблем добавляет буква Ё. Точнее, ее фактическое превращение в Е. Так, у девочки с фамилией Королева пришлось выяснять, как выглядит фамилия папы. Он был Иван Королев, значит, аттестат Ирины Королевой. Если бы он был Иван Королева (есть же фамилии такого типа, например, Пятница, Сорока), то в аттестате надо было бы писать аттестат Ирины Королевы.
Форма ответа