Как использовать эту библиотеку переносов в delphi?

Это библиотека расстановки переносов от Synopse delphi с открытым исходным кодом.

Демо представляет собой консольное приложение. Я не знаю, как использовать его в приложении с графическим интерфейсом.

Ниже мой тест, но не работа. Он не отображает слово с дефисом (или разделителем). Библиотеку можно скачать здесь:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, hyphen, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure testhyphenator;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.testhyphenator;
var
  h: THyphen;
  s: string;
  F, L: Integer;
begin
  s := 'hyph_en_US.txt'; //this is from the folder, is that correct to call?
  if FileExists(s) then 
  begin
    F := FileOpen(s, fmOpenRead);
    L := FileSeek(F, 0, soFromEnd);
    if L > 0 then 
    begin
      SetLength(s, L);
      FileSeek(F, 0, soFromBeginning);
      FileRead(F, s[1], L);    
    end;
    FileClose(F);
  end;
  h := THyphen.Create(s);
  h.Execute('pronunciation'); //is this correct?
  ShowMessage(h.filllist); //not display hyphenated word
end;

Он не отображает слово через дефис. В демо я тоже запутался в конструкторе:

H := THyphen.create('ISO8859-1'#10'f1f'#10'if3fa/ff=f,2,2'#10'tenerif5fa');
 writeln('"',H.Execute('SchiffahrT'),'"'); writeln(H.FillList);
 ...

Автор также приложил файл obj. Если я хочу скомпилировать его в один exe, как это сделать?

Не могли бы вы помочь мне понять, как правильно его использовать?

Большое спасибо.


person Warren    schedule 12.04.2012    source источник
comment
Не могли бы вы быть более конкретным ? Не работает — это худшее описание проблемы, которое вы можете использовать. А на ваш вопрос как связать файл *.obj используйте {$LINK 'file.obj'} в вашем блоке.   -  person TLama    schedule 12.04.2012
comment
@TLama, спасибо за ответ. Пожалуйста, смотрите редактирование. Я имею в виду, что он не отображает слово через дефис.   -  person Warren    schedule 12.04.2012
comment
1) Удалось ли вам скомпилировать исходную версию консольного приложения на вашем компьютере? 2) Какая у вас версия Delphi?   -  person menjaraz    schedule 12.04.2012
comment
Почему бы вам не опубликовать свой вопрос на форуме Synopse: synopse.info/forum/viewtopic .php?id=74 Я уверен, что автор программы, Arnaud Bouchez, ответит вам там (если он сначала не ответит вам здесь).   -  person lkessler    schedule 13.04.2012


Ответы (2)


Отказ от ответственности: я использовал не очень свежий дистрибутив Hyphen, возможно, он не синхронизирован с последняя версия.

Вот мои пункты:

Составление дистрибутива

  • Я скомпилировал его под Delphi 7, и он ОК.

Файл hyphen.rc

  • В дистрибутиве нет файла hyph_en_EN.dic. Если вы собираетесь перестраивать hyphen.res, вам может потребоваться исправить hyphen.rc, используя следующие действия:

дефис Текст HYPH_EN_US.dic

  • Я не проверял файл hyphen.res в раздаче, содержит ли он hyph_en_EN.dic и/или hyph_en_US.dic.

*.dic файлы доступны в моем дистрибутиве

  • hyph_it_IT.dic
  • hyph_es_ES.dic
  • hyph_fr_FR.dic
  • hyp_en_US.dic
  • hyp_de_DE.dic

Ответы на комментарии в вашем сниппете

s := 'hyph_en_US.txt'; //this is from the folder, is that correct to call? 

Нет! Правильное расширение файла .dic. Вместо этого вы должны написать:

s := 'hyph_en_US.dic;

Следующее в порядке (вы можете обратиться к определению класса THyphen):

Execute('pronunciation'); // is this correct? 

Следующее нормально (но это не работает, потому что h как экземпляр THyphen не был должным образом инициализирован):

ShowMessage(h.filllist); //not display hyphenated word

Ваша забота о конструкторе

H := THyphen.create('ISO8859-1'#10'f1f'#10'if3fa/ff=f,2,2'#10'tenerif5fa');

Это всего лишь один из правильных способов настроить THyphen (обратитесь к определению класса THyphen среди прочего).

E.g.:

H := THyphen.create('EN');

Использование дефиса в приложении с графическим интерфейсом с использованием Delphi 2007

  • Я могу сказать, что все в порядке, если экземпляр THyphen правильно сконструирован (не забудьте включить файл ресурсов hyphen.res с {$R hyphen.res}, файл hyphen.obj уже связан с модулем hyphen.pas).

Последний по порядку, но не по значимости

  • Не стесняйтесь связаться с Арно Буше, великим человеком, стоящим за Краткий обзор. Он является участником Stackoverflow и всегда готов помочь, лучший delphi пользователь кроме того.
person menjaraz    schedule 12.04.2012
comment
Большое спасибо за ваше подробное объяснение. Я проверил ваш код, теперь все в порядке. Процедура генерирует возможные точки останова в виде дефисов. 'произношение' порождает pro=nun=ci=ation. Может ли он использоваться как определение слога. Если да, то как мне изменить этот dic-файл, чтобы разделить «ation» на «a=tion» и, наконец, получить pro=nun=ci=a=tion? Или вы можете направить меня к ресурсу для дальнейшего изучения? Большое спасибо еще раз. - person Warren; 13.04.2012
comment
Пожалуйста. Я должен признаться вам: я ничего не знаю о переносах, я просто копался в исходном коде и пытался сделать все возможное, чтобы решить ваши проблемы. Я предлагаю вам опубликовать еще один пост и попытаться привлечь внимание автора дефиса, которого я цитировал. - person menjaraz; 13.04.2012

У меня нет под рукой моей установки Delphi, так что поймите, что вам может понадобиться немного настроить это.

Посмотрев на код дефиса, я считаю, что вы используете его неправильно. Параметр конструктора — это язык или набор символов.

h := THyphen.Create('UTF-8');

или (исходя из имени вашего файла, я думаю, вам нужен следующий)

h := THyphen.Create('EN');

Затем «Выполнить» используется для создания версии переданной строки с дефисом. «Выполнить» — это функция, возвращающая новую строку. Вы вызываете его, но ничего не делаете с результатом.

NewStr := h.Execute('correct');

«NewStr» теперь должно равняться «правильному».

Если я правильно прочитал код, функция и процедура «FillList» возвращают список всех возможных вариантов расстановки переносов для последнего слова, которое было выполнено.

person JerseyMike    schedule 12.04.2012
comment
Большое спасибо. Вы правы, я не правильно его использую. Я проверил ваш код. Список заполнения создает список, в каждой строке которого указан один разделитель. Но я не могу разделить принятый ответ. - person Warren; 13.04.2012
comment
Без проблем. Рад, что смог помочь. Важнее, чтобы вы получили то, что вам нужно, чем я получаю баллы за решение. Кроме того, menjaraz смог скомпилировать и протестировать для вас. ;) - person JerseyMike; 13.04.2012