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

Вниз

Руссификация TTabControl   Найти похожие ветки 

 
Piter ©   (2004-07-20 02:07) [0]

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

Насколько я понял, добавление новых Tab"ов происходит в TTabStrings.Insert:

procedure TTabStrings.Insert(Index: Integer; const S: string);
const
 RTL: array[Boolean] of LongInt = (0, TCIF_RTLREADING);
var
 TCItem: TTCItem;
begin
 TCItem.mask := TCIF_TEXT or RTL[FTabControl.UseRightToLeftReading] or
   TCIF_IMAGE;
 TCItem.pszText := PChar(S);
 TCItem.iImage := FTabControl.GetImageIndex(Index);
 if SendMessage(FTabControl.Handle, TCM_INSERTITEM, Index,
   Longint(@TCItem)) < 0 then
   TabControlError(Format(sTabFailSet, [S, Index]));

 FTabControl.TabsChanged;
end;


Особый интерес представляет именно вызов SendMessage, никак не могу отследить кто потом в реальности обрабатывает посланное сообщение. Если это делает windows (ведь TabControl стандартный элемент windows?) - то я вот что думаю - руссифицировать можно. Только использовать надо не TTCItem, а TTCItemW, который почему-то определен в commCtrl. Кстати, почему? Все равно он не используется... но тем лучше для моей идеи. И еще в вызове SendMessage использовать сообщение не TCM_INSERTITEM, а TCM_INSERTITEMW. Я думаю сработает...

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

Написать свой TTabStrings, повторив все методы, кроме этого? А как потом заставить работать с этим новым TTabString класс TTabControl? Переписывать TTabControl что ли тоже, наследуя от TWinControl и повторяя все методы, кроме конструктора, где создавать свой новый TTabString?

Или создать свой TTabString, а потом после создания TTabControl подменить его свойство Tabs на свой TTabString как-нибудь?

P.S. Буду рад любым конструктивным предложениям, посты типа "Не страдай фигней", "Это невозможно" и подобные оставьте, плиз, при себе. Если есть конкретные возражения почему эта схема работать не будет, с объяснение причин - пожалуйста, я с удовольствием прочитаю!


 
Gero ©   (2004-07-20 08:17) [1]

А в чем собственно заключается некорректность работы с русскими буквами?


 
Prohodil Mimo ©   (2004-07-20 10:13) [2]

ещ [1] Gero.
Не отображаются. Вместо них всякая лабуда.
Установка Font.Charset тоже не помогает.

В Д3 такая же гадость с TCheckBox, TRadioButton, TPageControl, TButton.
Хоть бери и переписывай все компоненты под себя.
И когда в Дельфи появится поддержка уникода?


 
Anatoly Podgoretsky ©   (2004-07-20 10:20) [3]

Юникод не поможет, эти органы рисуются системным шрифтом.


 
Prohodil Mimo ©   (2004-07-20 10:23) [4]

Я имел в виду и саму прорисовку.


 
Piter ©   (2004-07-20 14:03) [5]

Anatoly Podgoretsky ©   (20.07.04 10:20) [3]

что значит не поможет? Для всех контролов, где используются строки есть в NT системах (начиная от 2000) аналогичные WinApi функции для управления этими контролами, но с поддержкой Unicode... ПОчему это не поможет?

У кого-нибудь мысли посабжу есть все таки? Как наиболее грамотно переделать TTabControl?


 
Anatoly Podgoretsky ©   (2004-07-20 14:14) [6]

Какой НТ, что то не вижу этого в заголовках.


 
Piter ©   (2004-07-20 17:49) [7]

Пришлось переписать все таки VCL, жаль что в Delphi нету понятия дружественных классов :(

Итак, моя реализация:

procedure TTabStrings.Insert(Index: Integer; const S: string);
const
 RTL: array[Boolean] of LongInt = (0, TCIF_RTLREADING);
var
 TCItem: TTCItemW;
 wideS: PWideChar;
 wideSize: integer;
begin
 TCItem.mask := TCIF_TEXT or     RTL[FTabControl.UseRightToLeftReading] or
   TCIF_IMAGE;
 wideSize := MultiByteToWideChar(3, 0, PChar(s), -1, wideS, 0);
 GetMem(wideS, wideSize*SizeOf(WideChar));
 try
   MultiByteToWideChar(3, 0, PChar(s), -1, wideS, wideSize);
   TCItem.pszText := wideS;
   TCItem.iImage := FTabControl.GetImageIndex(Index);
   if SendMessage(FTabControl.Handle, TCM_INSERTITEMW, Index,
     Longint(@TCItem)) < 0 then
     TabControlError(Format(sTabFailSet, [S, Index]));
   FTabControl.TabsChanged;
 finally
   FreeMem(wideS);
 end;
end;


Даже если по умолчанию стоит английский язык - все отображается по русски без проблем.

Осталась только проблема если изменять существующую запись (то есть, проблема должна быть, я еще не проверял правда). Но это я переделаю тем же способом, пока сделал только на Insert.

У кого какие мнение по этому поводу? Подводные камни?

P.S. Код актуален для D7, для других версий не знаю, может там немного по другому что-нибудь.

P.S.S. вот еще русифицирую MainMenu и совсем будет зашибись :)


 
Piter ©   (2004-07-20 17:50) [8]

Anatoly Podgoretsky ©   (20.07.04 14:14) [6]
Какой НТ, что то не вижу этого в заголовках


а-а-а,мы решили к словам цепляться... очень даже в духе...

понятное дело NT, если говорим про Unicode


 
Anatoly Podgoretsky ©   (2004-07-20 17:51) [9]

Нет не понятно, у меня на 98 с успехом используется юникод, практически во всех микрософтоских продуктах


 
Piter ©   (2004-07-20 18:30) [10]

Anatoly Podgoretsky ©   (20.07.04 17:51) [9]

и как же он там используется, интересно?


 
Anatoly Podgoretsky ©   (2004-07-20 20:05) [11]

Нормально он там используется, можешь поставить IE/WORD/EXCEL и сам посмотреть.


 
Piter ©   (2004-07-21 01:38) [12]

Anatoly Podgoretsky ©   (20.07.04 20:05) [11]

а на что там смотреть? Расскажите мне, я не знаю, честное слово. Где там Unicode используется?


 
wnew ©   (2004-07-21 02:56) [13]


> Piter ©   (21.07.04 01:38) [12]
> Anatoly Podgoretsky ©   (20.07.04 20:05) [11]
>
> а на что там смотреть? Расскажите мне, я не знаю, честное
> слово. Где там Unicode используется?

Документы можно создавать на любых языках.
И даже проводник Windows работает на UNICODE, но если из Delphi работать с файловой системой Windows, даже при этом, используя ActiveX элементы Windows, вся способность виндовс корректно отображать имена файлов и какталогов на любых языках идёт коту под хвост. Не знаю, как седьмая Дельфи, но 5 и 6 не могут работать с UNICODE. И, вообще, есть такой неприятный момент - на винде с не русской локализацией в дельфийском редакторе кода вместо русских букв отображаются ?????.


 
Anatoly Podgoretsky ©   (2004-07-21 07:40) [14]

Клавиша QuickInfo


 
Piter ©   (2004-07-21 13:42) [15]

wnew ©   (21.07.04 2:56) [13]
Документы можно создавать на любых языках.
И даже проводник Windows работает на UNICODE, но если из Delphi работать с файловой системой Windows, даже при этом


ты говоришь про win9x? Мы с Анатолием говорим про них...


 
Piter ©   (2004-07-21 13:43) [16]

Anatoly Podgoretsky ©   (21.07.04 7:40) [14]
Клавиша QuickInfo


думаю, я задам логичный вопрос - что QuickInfo?


 
Anatoly Podgoretsky ©   (2004-07-21 13:57) [17]

Ищи на экране такую клавишу


 
wnew ©   (2004-07-21 14:09) [18]


> Piter ©   (21.07.04 13:42) [15]

Любой Windows, начиная с 98SE работает с UNICODE.
  Но ещё раз замечу, что невозможно отображать меню, да и вообще все контролы на языках отличных от локализации системы: именно здесь Windows не работает с UNICODE. Windows загружает при старте шрифт *.fon, который имеет только одну кодовую таблицу.


 
Piter ©   (2004-07-21 17:12) [19]

Anatoly Podgoretsky ©   (21.07.04 13:57) [17]

Ладно, все, мне надоело. Оставайтесь при своих знаниях и можете никому не рассказывать. То, что вы круты все знают.

wnew ©   (21.07.04 14:09) [18]
Любой Windows, начиная с 98SE работает с UNICODE


а вот мне и интересно что значит работает с UNICODE? То, что вызов Unicode версий WinApi функций невозможен - это еще Рихтер писал. А в чем тогда состоит работа? Что внутри он работает с Unicode? Что у него ВСЕ контролы свои, ибо если они были бы стандартные, то он не смог с ними общаться через WinApi по Unicode...

Но ещё раз замечу, что невозможно отображать меню, да и вообще все контролы на языках отличных от локализации системы: именно здесь Windows не работает с UNICODE. Windows загружает при старте шрифт *.fon, который имеет только одну кодовую таблицу.


если ты это распространяешь на системы win2000 и выше - то глубоко заблуждаешься. Читай мой новый топик.

И что значит невозможно? Да посмотри на объявленный функции - ты думаешь напрасно объявлены такие функции как InsertMenuW и подобные? Не знаю каких вы книг начитались, но факты говорят совсем о другом.


 
Anatoly Podgoretsky ©   (2004-07-21 20:00) [20]

Piter ©   (21.07.04 17:12) [19]
То что ты не умеешь пользоваться справочной системой это твоя проблема, зато мастер наезжать.


 
Piter ©   (2004-07-22 21:46) [21]

пользоваться справочной системой? Вы, наверное, имеете в виду, что я не читал всю справку? ДА, каюсь, не читал... как то недосуг было, знаете ли. Или вы указываете, что намекали мне посмотреть в справку? Что-то этого я не вижу... посоветовали мне поставить Word, Excel... ну они у меня стоят. Win2000 + Office XP. Что дальше? Они работают с Unicode? Не сомневаюсь... только тема вроде не об этом, а о win9x.
Ну даже я поставлю win9x, поставлю офис... что дальше? Что, при запуске маййкрософтского продукта прямо таки видно, что там используется unicode? Он там по экрану что ли ползает?
Вы все время о чем-то намекаете, только вот хрен разберешь о чем.

Да вы только и делаете, что намекаете. Не только здесь, в этой ветке, а вообще в этом форуме. Ваши посты не несут никакой информации, в лучшем случае один пост из пяти что-то говорит. Остальное - намеки.
Зная правильный ответ вы его не говорите. Вы намекаете... причем так, что тот, кто знает ответ - он поймет ваш намек. Но тот, кто ответа не знает (вопрошающий) - не поймет... а нафига тогда ему такой ответ? Зачем ответы, которые поймет только человек, который и так знает ответ на вопрос.

Часто наблюдаю такую картину с вами... и просто не знаю, что подумать. У меня стойкое убеждение, что вы таким образом доказываете свою значимость. ну да, я тоже не понимаю зачем вам это - но других объяснение не вижу.
А иначе почему бы просто и честно не ответить на вопрос? Нафига подходить к этому делу через черный ход? Вы намекате - вопрошающий намека, естественно, не понимает, переспрашивает, тревожится "неужели я такой дурак", мне ответили, а я не понял. И вы тут типа спускаетесь с олимпа "а,-а-а не знаешь, ламерок. Ну так уж быть... может сейчас я тебе расскажу".

При этом я НИ разу не видел чтобы вы принимали обсуждение в серьезных вопросах. Ну не былот такого. Вот ветка Зотова с приведенными им тестами, там многие мастера отметились, ветка интересная с интересными вопросами, многие признавались, что на кое-чего ответов не знают. Не было вас там (может, конечно, пару раз что-то написали, но явно не по тесту). Вообще,  ветка возникала два раза. В первый раз на самый сложный вопрос (по компонентам) правильно ответил один - vuk. Он тогда мастером не был, но я его запомнил. Конечно, не участие в одной ветке ни о чем не говорит, но я просто для примера привел. Ни в одном таком так сказать серьезном обсуждении вы участия не принимаете...

Говорите, что вам не нравится уровень этого форума, тем не менее вы сами ничем не занимаетесь, кроме того, что новичков гоняете.
Вот такое мое ИМХО.


зато мастер наезжать


ну хоть в чем-то мастер :)



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

Форум: "Потрепаться";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.029 c
3-1089317574
genek84
2004-07-09 00:12
2004.08.08
Подключение к БД


14-1090165889
вразлет
2004-07-18 19:51
2004.08.08
Доклад ООН о развитии человека за 2004 год


3-1089795423
User_OKA
2004-07-14 12:57
2004.08.08
Упаковка dbf


3-1089608096
DENpro
2004-07-12 08:54
2004.08.08
BackUp Interbase


1-1090510591
glGLU
2004-07-22 19:36
2004.08.08
Timer





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский