Здравствуйте
Может кому пригодится. В 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