cxLocalizer и dxSpellChecker из dll
От: axiv  
Дата: 03.12.09 08:49
Оценка:
Здравствуйте

Может кому пригодится. В DevExpress'е аналогично с подключением скинов из dll сделал подключение файла локализации для cxLocalizer и русского словаря ISpell для dxSpellChecker.
1. Готовим .rc файл
LOCAL TEXTDATA  "rus.ini"  // файл локолизации
RUSDIC TEXTDATA  "dic.txt"    // словарь русских слов для ISpell
RUSGRAMMAR TEXTDATA  "grammar.aff"  // файл построения словоформ


2. Компилируем .res
3. Делаем пустую .dll с подключением .res
4. Если cxLocalizer умеет загружать символьные строки из потока, то dxSpellChecker умеет подключать словари только из файлов. Пришлось немного править исходник.

TdxAffixCompressionDictionary = class(TdxCustomSpellCheckerDictionary)
  private
    ...
    FLoadType:TLoadDicType;
    FLoadDicStream:TStream;
    FLoadGrammarStream:TStream;
    ...
  public
    ...
    property LoadDicStream:TStream read FLoadDicStream write FLoadDicStream;
    property LoadGrammarStream:TStream read FLoadGrammarStream write FLoadGrammarStream;
  published
    ...
    property LoadType:TLoadDicType read FLoadType write FLoadType;
  end;

procedure TdxAffixCompressionDictionary.LoadWordBase(
  AWordBase: TdxSpellCheckerStrings);
begin
  case FLoadType of
    ltFile:   AWordBase.LoadFromFile(DictionaryPath);
    ltStream: AWordBase.LoadFromStream(FLoadDicStream);
  end;
end;

procedure TdxAffixCompressionDictionary.LoadGrammar(
  ADecompressor: TdxCustomAffixDecompressor);
begin
  case FLoadType of
    ltFile:   ADecompressor.LoadFromFile(GrammarPath);
    ltStream: ADecompressor.LoadFromStream(FLoadGrammarStream);
  end;
  UpdateByDecompressor(ADecompressor);
end;


Может это и коряво, но работает:
procedure TMainForm.FormCreate(Sender: TObject);
var DicRS,GrammarRS,LocalRus:TResourceStream;
begin
  SkinInstance := LoadLibrary('SpellCheckerRusLocalize.dll'); //изготовленная .dll
  DicRS:=TResourceStream.Create(SkinInstance,'RUSDIC','TEXTDATA');
  GrammarRS:=TResourceStream.Create(SkinInstance,'RUSGRAMMAR','TEXTDATA');
  if (DicRS <> nil)and(GrammarRS<>nil) then
    begin
      ADictionaryItem := dxSpellChecker1.DictionaryItems.Add;
      ADictionaryItem.DictionaryTypeClass := TdxISpellDictionary;
      TdxISpellDictionary(ADictionaryItem.DictionaryType).LoadType:=ltStream;
      TdxISpellDictionary(ADictionaryItem.DictionaryType).LoadDicStream:=DicRS;
      TdxISpellDictionary(ADictionaryItem.DictionaryType).LoadGrammarStream:=GrammarRS;
      dxSpellChecker1.LoadDictionaries;
      FreeAndNil(DicRS);
      FreeAndNil(GrammarRS);
    end;
  with dxSpellChecker1 do
    begin
      AutoCorrectOptions.Active:=true;
      CheckAsYouTypeOptions.Active:=true;
    end;
  LocalRus:=TResourceStream.Create(SkinInstance,'LOCAL','TEXTDATA');
  if LocalRus<>nil then
    begin
      cxLocalizer1.LoadFromStream(LocalRus);
      cxLocalizer1.Locale:=1049;
      cxLocalizer1.Active:=true;
      FreeAndNil(LocalRus);
    end;
end;



Наблюдения:
Запущенная форма с cxMemo,dxSpellChecker,cxLocalizer с неподключенными словарями и файлом локализации съедает около 5 Мбайт памяти (смотрев в Диспечере задач).
После подключения словаря и файла локализации съедаемая память увеличивается до 69 Мбайт !!! (Подклечение все того же традиционным способом через указания путей к файлам — 67 Мбайт). Отключение словаря и файла локализации — снижение до 12 Мбайт, выгружаем dll — снижение до 10 Мбайт. Где потери непойму, может у кого будут соображения или это нормально?

Словарь ISpell брал здесь — ftp://scon155.phys.msu.su/pub/russian/ispell/rus-ispell.tar.gz
В той же папке на ftp есть под разные кодировки русского, но я не разбирался, взял этот, единственное что пришлось сделать — это перекодировать в win1251
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.