Форум: "Основная";
Текущий архив: 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