Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

Multilanuage или Я ХОЧУ ЗАМОЧИТЬ БОРЛАНДОВЦЕВ !!!   Найти похожие ветки 

 
BlackTiger   (2002-12-03 21:27) [0]

Пытаюсь сделать много-язычное приложение...
Наступил на ТАААААААКИЕ грабли, что готов взять базуку и ... к бененой маме их всех!

Оказалось, что стандартные компоненты (кнопки, чек-боксы и пр.) НЕ ПОНИМАЮТ СМЕНЫ "Font.Charset".

Имею кнопку с надписью "Close". Создаю Resourcs DLL. Полет нормальный.
В русском варианте интерфейса даю ей надпись "Закрыть".
Запускаю. Переключаюсь на русский язык (при этом системная локаль совсем не Russian - так надо). И !... Имею в качестве надписи полную ахинею.

Беру в качестве кнопки дельфийскую кнопку (TBitBtn) - все отлично.
Беру стандартное TMainMenu - облом.
Беру TRxMainMenu (с собственной прорисовкой) - все отлично.
Беру стандартный Label - все отлично.
Беру стандартные TCheckBox - облом.
Пытаюсь быстро найти ему замену - ан нету!

Может кто знает, как мне заставить стандартные компоненты понимать смену Charset"а? Может можно как-то через API?
Проект-то уже написан, я хочу добавить ему фишку! А по всему проекту менять компоненты - НЕ ХОЧУ!!!!


 
Оливейра ©   (2002-12-03 22:37) [1]

1) Попросить Игоря Шевченко еще раз дать ссылку на библиотеку Юникодовых компонентов ( я ее про..ал :-)
2) Делать HTML-интерфейс, очень модно.


 
BlackTiger   (2002-12-04 00:47) [2]

Хммммм...
"Юникодовые компоненты" это не ElPack (Eldos) случайно? Или что-то другое?


 
Игорь Шевченко ©   (2002-12-04 09:34) [3]

http://home.ccci.org/wolbrink/tntmpd/delphi_unicode_controls_project.htm

В FAQ ?



 
BlackTiger   (2002-12-04 13:46) [4]

ПРИКОЛ!!!
Я ХОЧУ УЖЕ ВЗЯТЬ ДВЕ БАЗУКИ И ТАНК!!!

Все дело в том, что Unicode-компоненты - это не выход.
Если пользоваться встроенной в Д6 много-язычностью интерфейса, то НУЖНЫ КОМПОНЕНТЫ, ДОПУСКАЮЩИЕ СМЕНУ CHARSET"А, А НЕ UNICODE!

Или имеющие открытый метод прорисовки.
Может быть в Д есть charset для unicode, типа UNICODE_CHARSET?


 
BlackTiger   (2002-12-04 14:45) [5]

Неужели никто не подскажет как переназначить метод прорисовки надписи на кнопке? Да так, что бы не терялась поддержка стилей XP.
TBitBtn - наследник от TGraphicControl, а не от TButton, по-этому в нем все работает. А я хочу сделать наследника от TButton со своим методом прорисовки надписи - КАК?!?!?


 
Игорь Шевченко ©   (2002-12-04 15:19) [6]

BS_OWNERDRAW, но стиль XP при этом может пропасть.


 
BlackTiger   (2002-12-04 17:05) [7]

Ндааааа, борландовцы козлы!
Нафига внедрять многоязычность, если она реально не работает как надо.

Ну с кнопками кое-как разобрался, надписи меняет, но XP-стили теряет нафиг (как бы запустить inherited прорисовку, а надпись - самому?).
Ну а как быть с другими контролами (TCheckBox, TMainMenu и пр.).
Для TMainMenu есть альтернатива - TRxMainManu.
Как сделать CheckBox в стиле OwnerDraw?


 
Arioch   (2002-12-04 17:35) [8]

TRxCheckBox? Или такого нету? TRxCheckboxList точно есть.

Вот поэтому я и сижу на D5.
На D7 м.б. и перейду, но не на D6 :-)
Кстати, ServicePack для D6 ставил? Там ен пофиксили?

>> НЕ ПОНИМАЮТ СМЕНЫ "Font.Charset".
Это что значит? Property меняется, но реально шрифт используется старый?

Если да, то тут такая мысль - глядим в иссходники VCL как перерисовывается компонент при изменении например Font.Size

Вообще то это относится к D5, в D6 & D7 может быть по другому.

TFont.SetSize выдает событие Font.OnChange, которое у компонета снимает какой-то флажок типа FontIsValidAndReadyToBeUsedNowTwoyuMat

Далее вызывается Invalidate от компонента. (вот за что я бы убил Борланд - за то что нельзя вызвать Invalidate на ЧАСТЬ компонента, а только целиком. Обойти через WinAPI можно, но неприятно)

И вот тут интересно - метод рисующий компонент, проверяет несколько флагов, типa FontIsValidAndReadyToBeUsedNowTwoyuMat, CanvasIsValidAndReadyToBeUsedNowTwoyuMat, BrushIsValidAndReadyToBeUsedNowTwoyuMat и т.д.
(точнее вызывается спец. метоод, который это проверяет) и если Font или что-то там не готово - то старый font убивается (не как объект VCL, а как объект Windows) и создается заново, с новыми значениями.

Смысл этой бодяги - чтобы в тексте типа
Form1.Font.Size := 100;
Form1.Font.Style := [fsbold];
Form1.Font.Name := "Arial Black";

не перестраивать шрифт дцать раз, а дождаться когда программер наиграется и все изменения одним махом.

И если при этом в TFont.SetCharset или где еще забыть выдавать OnChange или сбрасывать флажок - получится именно это.

И скорее всего найти и поправить это место в VCL не трудно. Трудно потом перекомпилировать эту VCL и спасаться от несовместимостей.

Поэтому предлагаю найти этот флажок и снимать его руками после изменения CharSet.
Сам флажок правда наверняка не public, но вытащить его наружу можно без особых проблем.
Например вытягивание наружу protected-свойств TSizeConstraints - см. в моем Property Editor для них (на Торри)
См.


 
BlackTiger   (2002-12-04 18:01) [9]

Насколько я понимаю, это косяк VCL. И при этом очень старый.

Берем стандартный TMainMenu. У него свойства Font нет в принципе (а надо бы!). Тут все понятно, что все плохо и нужна собственная прорисовка, которой тоже нет в стандартном исполнении. В TRxMainMenu хотя бы вытащен наружу метод для изменения прорисовки.

Берем стандартный TButton. Свойство Font есть и даже происходит его смена и изменения размера шрифта. НО (!) не происходит смены "Font.Charset" при его изменении. Косяк, действительно, где-то в отслеживании смены шрифта, но хрен его знает где это происходит - исходников на TButton я что-то не видел.

Ну и с остальными СТАНДАРТНЫМИ ( кроме TLabel, что интересно) компонентами та же самая фигня.

Я уверен, что ошибка именно внутри VCL (хммммм, надо бы попробовать использовать CLX), так как видел приложение, написанное на C, в котором меняется язык интерфейса "налету" и при этом все нормально отображается с сохранением стилей XP во всех элементах управления.

З.Ы.: Борландовцы - козлы! Даешь исходники VCL! Даешь OpenVCL!


 
Игорь Шевченко ©   (2002-12-04 18:36) [10]

BlackTiger (04.12.02 18:01)

Ты конечно извини, но косяк ты явно не там ищещь...рекомендую в зеркале.
Заодно рекомендую подучить матчасть относительно Standard controls. Исходник TButton есть - в StdCtrls.pas


 
BlackTiger   (2002-12-04 18:53) [11]

Про StdCtrls.pas спасибо - теперь знаю, почему в TLabel все нормально, оно же наследник от TGraphicControl, как и TBitBtn.

Хорошо, но куда бы засунуть обработку смены Charset"a так, чтобы не рушилась поддержка XP?

Может есть где-нибудь статейки про "как создавать элементы управления с поддержкой стилей XP в Delphi" или что-то вроде того?

З.Ы.: Есть конечно возможность делать свою многоязычность на unicode-компонентах плюс ini-файлы, но мне вот вперлось! Хочу добить встроенную возможность. Очень уж удобно!


 
Ketmar ©   (2002-12-04 20:16) [12]

это с каких же пор TBitBtn - наследник TGraphicControl"а???

Satanas Nobiscum! 04-Dec-XXXVII A.S.


 
Arioch   (2002-12-04 20:54) [13]

Про XP статья есть. Акжан Абдуллин кадется писал.
И кажется как раз на Королевстве Дельфи :-)


 
BlackTiger   (2002-12-04 21:53) [14]

2Ketmar: пардон, ошибочка вышла. Не туда смотрел.

Прикол - в Д7 даже TBitBtn разучивается понимать смену charset"а!
Хотя в Д6 все менялось (ессесно без этих несчастных стилей).

З.Ы.:
Майкросовтовцы тоже козлы. Взяли бы и сделали отдельную библиотеку стандартных компонентов, сохранив стандартную, и не парили бы людям мозги со своим манифестом. Кстати в "Visual Studio 6" тоже не работает в стандартных компонентах. В .NET еще не проверял - лень ставить.


 
HiEx   (2002-12-04 22:01) [15]

Самый простой способ : просто переименовать в ручную
------------------
procedure SetCharSet(Obj : TComponent; CharSet : byte);
var
i1 : integer;
begin
if (Obj is TForm)
then (Obj as TForm).Font.Charset := CharSet;
if (Obj is TLabel)
then (Obj as TLabel).Font.Charset := CharSet;
if (Obj is TMemo)
then (Obj as TMemo).Font.Charset := CharSet;
if (Obj is TToolBar)
then (Obj as TToolBar).Font.Charset := CharSet;
if (Obj is TEdit)
then (Obj as TEdit).Font.Charset := CharSet;
if (Obj is TComboBox)
then (Obj as TComboBox).Font.Charset := CharSet;
if (Obj is TGroupBox)
then (Obj as TGroupBox).Font.Charset := CharSet;
if (Obj is TDrawGrid)
then (Obj as TDrawGrid).Font.Charset := CharSet;
if (Obj is TButton)
then (Obj as TButton).Font.Charset := CharSet;
if (Obj is TCheckListBox)
then (Obj as TCheckListBox).Font.Charset := CharSet;
if (Obj is TCheckBox)
then (Obj as TCheckBox).Font.Charset := CharSet;
if (Obj is TTabSheet)
then (Obj as TTabSheet).Font.Charset := CharSet;
if (Obj is TRadioGroup)
then (Obj as TRadioGroup).Font.Charset := CharSet;
if (Obj is TListBox)
then (Obj as TListBox).Font.Charset := CharSet;
if (Obj is TSpeedButton)
then (Obj as TSpeedButton).Font.Charset := CharSet;
if (Obj is TRichEdit)
then (Obj as TRichEdit).Font.Charset := CharSet;

if Obj.ComponentCount>0 then
for i1:=0 to Obj.ComponentCount-1 do
SetCharSet(Obj.Components[i1], CharSet);
end;
----------------------
- Вызываешь для каждого окна и все. Может немного криво, ну дк ведь "позно пить Баржоми, когда почки сели".


 
Antonius ©   (2002-12-04 22:06) [16]

2BlackTiger:
TButton.font.color тоже не работает. Хотя TButton.font.style - ok.

а последнее что я помню про локализацию - это при удалении контрола из русской версии формы - его надо удалить из английской версии. Так же с добавлением и вроде вообще - с любым изменением свойств. Получается - делаешь 2-е независимые формы. Кайф видимо в том, что механизм переключения языков уже присутствует - самому делать не надо.


 
BlackTiger   (2002-12-04 22:24) [17]

2HiEx: весь-то прикол как раз в том, что это НЕ РАБОТАЕТ в стандартных TMainMenu, TButton, TCheckBox и, наверное, других.

2Antonius: вот и я говорю - косяки в VCL. Прикольно, но в CLX вроде как работает, но я пока не передалал загрузку ресурсов под CLX-приложение. А с локализацией все просто - пересоздаешь resource DLL, меняешь что надо и пересобираешь всю группу проектов. Если этого не сделать, то у приложения "де жа ву" начинается :-).

Блин, как бы так извратиться, чтобы по-меньше извращаться.
Unicode в этот DLL не залезают...


 
Игорь Шевченко ©   (2002-12-05 09:39) [18]

BlackTiger (04.12.02 22:24)

Ну и сколько еще надо убеждать, что в VCL косяков нету ? Почему бы не прочитать наконец о том, как работают стандартные контролы у Windows, оберткой вокруг которых являются TButton и иже с ними.
В CLX все работает только потому, что рисование CLX-контролов происходит вручную, а не средствами стандартных контролов Windows.

Вместо того, чтобы козлов искать, взял бы, да написал свою отрисовку нужных контролов, в которых поддерживал бы и XP стили, и LongHorn и разные оболочки Linux до кучи.



 
Anatoly Podgoretsky ©   (2002-12-05 09:45) [19]

Нечего на зеркало пенять и причислять к другому роду


 
BlackTiger   (2002-12-05 12:33) [20]

"Ну и сколько еще надо убеждать, что в VCL косяков нету ?"
--------------------------------
странно, и почему я этому не верю...

"Вместо того, чтобы козлов искать, взял бы, да написал свою отрисовку нужных контролов, в которых поддерживал бы и XP стили, и LongHorn и разные оболочки Linux до кучи."
--------------------------------
Вот когда появится много свободного времени - сяду и напишу. В данный момент мне нужно БЫСТРОЕ и РАБОЧЕЕ решение. Вот только интересно про Longhorn - с каких это пор это стало новым стилем конролом? Догда уж Plex, но это просто доработанная Luna.


 
NailS ©   (2002-12-05 13:14) [21]


> BlackTiger


см. \Delphi6\Demos\RichEdit



Страницы: 1 вся ветка

Текущий архив: 2002.12.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
1-51700
Gari
2002-12-05 09:24
2002.12.16
Заточка приложения под XP


3-51615
Shaman
2002-11-26 17:06
2002.12.16
Автоинкрементные поля - как с ними работать ч-з TSimpleDataSet


1-51744
Tundra
2002-12-06 15:46
2002.12.16
не работает Canvas для Jpeg


14-51925
Anatoly Podgoretsky
2002-11-25 07:56
2002.12.16
Именинники 25 ноября


3-51566
Rustik
2002-11-26 14:55
2002.12.16
Требуется сфорировать отчет в Excel по гостовому шаблону