Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.008 c
14-51937
Shved
2002-11-25 00:31
2002.12.16
Как перенести базу данных на другой компьютер?


1-51827
Tundra
2002-12-05 14:17
2002.12.16
Нужно в StringGrid организовать CheckBox


4-52036
NT
2002-11-05 07:33
2002.12.16
опрос по копированию


8-51846
halt
2002-09-02 21:26
2002.12.16
как проиграть audio сидюк с конкретного cd-привода


14-51931
Axis_of_Evil
2002-11-25 15:32
2002.12.16
Lyrics





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский