Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели (http://forum.oszone.net/showthread.php?t=145085)

Drongo 14-07-2009 12:46 1167247

[решено] Кирилица в WIN32 GUI приложениях независимо от настроек в контрольной панели
 
Вложений: 1
Доброго всем здоровья. Нужна ваша помощь. :) Возникла необходимость написать программку, чтобы она работала на Windows XP и Widnwows Vista (если будет работать на Windows 7, будет вообще здорово, но проверить негде... Нет знакомых с семёркой). На ХР работает как часики, а на Vista не совсем. Не отображаются правильно русские символы. Скриншот приложу.



Проверял на Windows Vista Home Premium (SP1). Версия русская.

Получается следующее, интерфейс на русском, и некоторые записи (описания в GroupBox) не отображают правильно кирилицу, а некоторые, на кнопках и переключателях нормально отображают, что сделать - не знаю совсем. Прошу помощи. Английский интерфейс это не вариант потому что там ещё будет ComboBox (при выборе локализации "русская Windows") в котором будет выбор текста на русском, по другому нельзя. Архив проекта прикрепляю, там находится также и исполнимый файл. Программная среда в которой разрабатывается приложение:
Цитата:

Цитата из своего профиля
Borland C++ Builder 6.0 Enterprise Suite


Dmitrijan 14-07-2009 15:32 1167403

Drongo, Кое что могу подсказать. Я тоже как-то разрабатывл програмку (правда на Delphi)
и столкнулся с такой же проблемкой.Из под Виста-кракозябры, из под XP все гуд.Правда не все надписи.Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET).Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы.
P.S. Глянул вашу програмку из под семерки все гуд (все на русском)! :)

Drongo 14-07-2009 17:24 1167516

Цитата:

Цитата Dmitrijan
Оказалось надо было в свойствах шрифтов выставить CharSet: RUSSIAN_CHARSET.А те которые отображали кракозябры было (ANSI_CHARSET). »

Сейчас проверим. :) Да, действительно, настройка есть, изменил, сейчас попробуем на Vista, отпишусь. А эти настройки не будут влиять на отображение символов в семёрке?
Цитата:

Цитата Dmitrijan
Глянул вашу програмку из под семерки все гуд (все на русском)! »

А если не затруднит, посмотрите, в поле Edit появляется имя учётной записи?

Цитата:

Цитата Dmitrijan
Но это опять же Delphi, но думаю свойства шрифтов во всех языках одинаковы. »

Всё верно. :yes:


Dmitrijan 14-07-2009 17:44 1167537

Цитата:

Цитата Drongo
А эти настройки не будут влиять на отображение символов в семёрке? »

Только что запустил семерку, проверил свою прогу все Ok :) Значит и из под Vista и из под Seven настройка работает одинаково - положительно.
Цитата:

Цитата Drongo
А если не затруднит, посмотрите, в поле Edit появляется имя учётной записи? »

Все нормально, имя учетной записи есть (правда у меня учетная запись на англ. "Dmitrijan") :)

Drongo 14-07-2009 18:04 1167556

Цитата:

Цитата Dmitrijan
(правда у меня учетная запись на англ. "Dmitrijan") »

Проверили - русская учётка работает, определяется.
Протестировали на Vista, по вашему совету изменил в свойствах Font -> Charset - значение с DEFAULT_CHARSET на RUSSIAN_CHARSET и всё заработало правильно:



Dmitrijan, Спасибо!!! :yahoo: :Beer: :up: :hi: Вопрос успешно решён.

P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато?

Dmitrijan 14-07-2009 18:22 1167571

Цитата:

Цитата Drongo
P.S. А всё-таки, почему при значении - DEFAULT_CHARSET на семёрке всё ок, а на висте кривовато? »

В принципе я не знаю почему так происходит, но думаю в Viste по дефолту стоит другая кодировка, отличающаяся от дефолтной Seven. Но это только мое мнение.
P.S. Очень рад, что у вас все получилось!!! :)

Drongo 17-07-2009 10:47 1170291

Здравствуйте, это снова я, но уже с несколько другим вопросом. Вот с русской Windows всё в порядке, а если эту же программу с русским интерфейсом запустить на английской версии? Мне кажется вместо русских символов будут знаки вопроса "?????". Я так понял, что нужно русские шрифты загрузить в проект в ресурсы и использовать шрифт из внутренних ресурсов программы? Но я не знаю как это сделать. Покажите на примере кому не трудно.

читать дальше »
AddFontResource
int AddFontResource(LPCTSTR lpszFilename);
Возвращаемое значение
В случае успешного завершения функции возвращается количество добавленных шрифтов, в противном случае возвращается нулевое значение. В Windows NT более подробную информацию об ошибке можно получить, вызвав функцию GetLastError.
Аргументы
lpszFilename - указатель на заканчивающуюся нулем текстовую строку, содержащую корректное имя файла шрифта. Имя файла шрифта имеет расширение .fon для файлов ресурса шрифта, расширение .fnt для файлов шрифта, содержащих битовые образы символов, расширение ttf для файлов шрифтов TrueType и расширение .fot для файлов ресурсов шрифтов TrueType.


В гугле кое-что нашёл

Описание Функция AddFontResource позволяет добавить ресурсы шрифта из указанного файла в системную таблицу шрифтов. После этого данный шрифт может быть использован для вывода текста любым приложением Win32. Любые приложения, добавляющие или удаляющие шрифты из системной таблицы шрифтов, извещают об этом другие приложения посылкой сообщения WM_FONTCHANGE всем окнам верхнего уровня в операционной системе. Для посылки этого сообщения приложение должно использовать функцию SendMessage, в аргументе hWnd которой должно стоять значение HWND_BROADCAST. Как только приложение перестает использовать ресурс шрифта, загруженный функцией AddFontResource, оно должно удалить его функцией RemoveFontResource.

Только я всё равно не пойму, как добавить, встроить? шрифт в программу.

Dmitrijan 17-07-2009 17:49 1170741

Drongo, Возможно при установке значения шрифта RUSSIAN_CHARSET, шрифт включится в проект автоматически при компиляции.
В Delphi шрифты включал, помню как, а вот СИ++ извеняйте не работал в нем, могу написать как в Delphi если надо :)

Drongo 17-07-2009 18:30 1170776

Цитата:

Цитата Dmitrijan
В Delphi шрифты включал, помню как, а вот СИ++ извеняйте не работал в нем, могу написать как в Delphi если надо »

Конечно надо. :) Во всяком случае можно будет хоть попробовать понять. Если можно с комментариями.

Dmitrijan 17-07-2009 19:35 1170820

Drongo, Вот я включал шрифт по такой инструкции:

Включение шрифта в ваш EXE:

Создайте в текстовом редакторе файл с расширением *.rc , описывающий шрифт:

MY_FONT ANYOL1 "Bauhs93.ttf"

Первые два параметра могут быть любыми. Они будут использоваться в программе
позже.

Затем для создания *.res файла используйте компилятор командной строки BRCC32.EXE, поставляемый с Delphi. Если ваш файл на этапе 1 был назван MyFont.rc, командная строка в сеансе DOS должна выглядеть так:

BRCC32 MyFont

Программа добавит в компилируемый файл созданный ресурс .rc и создаст файл с тем же именем, за исключением расширения, которое будет .res: MyFont.res

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

{$R MyFont.res}

Правильным будет разместить его в секции реализации после строчки {$R *.DFM}.

Добавьте процедуру создания файла из ресурса, делающим шрифт доступным для использования. Пример:

procedure TForm1.FormCreate(Sender: TObject);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));
Res.SavetoFile('Bauhs93.ttf');
Res.Free;
AddFontResource(PChar('Bauhs93.ttf'));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;

программное удаление шрифта:

procedure TForm1.FormDestroy(Sender: TObject);
begin
RemoveFontResource(PChar("Bauhs93.ttf"))
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;

Извените, но больше сегодня не смогу написать, конец рабочего дня

Drongo 18-07-2009 16:52 1171383

Цитата:

Цитата Dmitrijan
Вот я включал шрифт по такой инструкции: »

К сожалению, неполучилось... Хотя за попытку помочь, благодарю.
Вчера вечером почти весь вечер делал и почти пол ночи искал инфу, на Delphi\Pascal есть, на C++ практически ничего внятного не нашёл или пропустил по незнанию.
Консольный компилятор есть bcc32.exe. Создавал я файл MyFont.rc, но в MyFont.res такой командой ничего не скомпилилось.
Код:

bcc32.exe MyFont.rc
Возможно программисты на Cи помогут? Хотелось бы... :unsure:

ganselo 19-07-2009 13:58 1171870

Цитата:

Цитата Drongo
Drongo »

Я так понял, что у вас не получилось добавить шрифт в *.res файл? Если так, то:
берёте какой нибуть редактор ресурсов и с помощью его добавляете ваш шрифт в *.res файл программы и дальше пишите код приведённый
Цитата:

Цитата Dmitrijan
Dmitrijan »

.

Drongo 20-07-2009 14:47 1172776

Цитата:

Цитата ganselo
берёте какой нибуть редактор ресурсов и с помощью его добавляете ваш шрифт в *.res файл программы »

Хорошо, у меня Restorator открыл в этой программе файл Project1.res. Создал ресурс "Шрифт", что выбирать дальше и как собственно добавлять сам шрифт? Хотелось бы подробное описание, а не общий совет...


ganselo 20-07-2009 15:55 1172827

Drongo
Берёте текстовый файлик . Пишите туда "MY_FONT ANYOL1 "Bauhs93.ttf" " и сохраняете как 1.rc, например . Далее в Builder'e: Проект->Добавить к проекту->выбираете тип файла *.rc->находите файл 1.rc и компилите проект. Файл Bauhs93.ttf должен лежать вместе с 1.rc. Ну и пишите код приведённый Dmitrijan.

Drongo 20-07-2009 18:11 1172925

Вложений: 1
ganselo, Вооот! Другое дело :yes: Что-то получается, только некоторые части не могу перевести с Delphi на C++.

Delphi
Код:

procedure TForm1.FormCreate(Sender: TObject);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));
Res.SavetoFile('Bauhs93.ttf');
Res.Free;
AddFontResource(PChar('Bauhs93.ttf'));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;

C++ как и что у меня получилось (потом, когда и если всё получится, детально опишу последовательность действий). Не могу эту часть правильно перевести. Переменная TResourceStream Res; вроде бы создаю, а потом присвоить ей что-то я не пойму как? По ходу нужно использовать оператор new, но на простых типах умею, а вот на таких не приходилось. Думаю с кодом после begin разобрался бы, мне только правильно перевести эту строку - Res : TResourceStream;
Код:

// Для своего использования шрифта - Delphi
//  Res : TResourceStream; // Объявляем переменную
//  begin
//  Res := TResourceStream.Create(hInstance, 'MY_FONT', Pchar('ANYOL1'));
//  Res.SavetoFile('Bauhs93.ttf');
//  Res.Free; // освобождение ресурсов - деструктор.
  // Работает только эта часть-----------------------------
  AddFontResourceA("verdana.ttf");
  SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);

Проект с включенным в него ресурсом для шрифта скомпилился, только без тех строк, что закоментированы. В FormCreate

ganselo 23-07-2009 14:22 1175564

Drongo
Я с Dephi тоже мало знаком... кажись должно быть так:
Код:

TResourceStream *res = new TResourceStream(Application->Handle, "MY_FONT", "ANYOL1");
res->SaveToFile("Bauhs93.ttf");

AddFontResourceA("Bauhs93.ttf");
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

Но я не тестил...

Drongo 23-07-2009 16:46 1175709

Немного не скомпилилось, ошибка в этой строке
Цитата:

Цитата ganselo
Код:

TResourceStream *res = new TResourceStream(Application->Handle, "MY_FONT", "ANYOL1");
»

Цитата:

[C++ Ошибка] Unit1.cpp(40): E2285 Could not find a match for 'TResourceStream::TResourceStream(void *,char *,char *)'
Но я тут поискал в гугле правильный синтаксис TResourceStream(void *,char *,char *). Нашёл в первых строках гугла ссылку 1 и ссылку 2. Изменил на такой вариант:

Код:

...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  TResourceStream *res = new TResourceStream((int)HInstance, "MY_FONT", "ANYOL1");
  res->SaveToFile("verdana.ttf");

  AddFontResourceA("verdana.ttf");
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}...

Скомпилилось без проблем. Теперь нужно проверить на английской версии Windows. :) Как проверю, сразу же отпишусь, у меня правда знакомых нет с английской Windows, придётся диск у друга брать. Так что некоторое время займёт.

ganselo, Спасибо за помощь. :up:

Drongo 28-07-2009 17:35 1179928

Проверил на английской Windows, к сожалению с таким кодом ничего не получилось
Код:

...
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  TResourceStream *res = new TResourceStream((int)HInstance, "MY_FONT", "ANYOL1");
  res->SaveToFile("verdana.ttf");

  AddFontResourceA("verdana.ttf");
  SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}
...

всё равно русские символы выводит вопросительными знаками. Как же всё-таки включить русский шрифт в программу? Что я не так делаю или пропускаю? :dont-know

Admiral 01-10-2009 22:02 1232312

В ходе личной переписки выяснили, версия ОС не причём.
Автору был дал совет использовать Юникод в программе. Однако как выяснилось, мой пример оказался не до конца Юникодным, по этому, его корректное отображение зависело от того, что указанно в Контрольной панели в Региональных настройках. Как оказалось, мало использовать wchar_t вместо char, нужно и саму функцию входа в программу использовать соответственную: вместо WinMain - wWinMain.
К сожалению для консольных версий прог использование wmain вместо main не даёт независимость от того что установлено в Контрольной панели в Региональных настройках. Консоль не использует Юникод вывод.

P.S. Хотелось бы дать рекомендацию по самой программе.

Вместо того что б предлагать выбор по определению языковой версии, лучше её определять. Например считывая атрибуты файла kernel32.dll проверять что там написано: Корпорация Мискрософт или Microsoft Corporation.
Не исключаю, что патчи, которые сообщают что они "не предназначены для данной языковой версии", проверяют это как-то по-другому, в этом случаи APIMonitor поможет определить как именно.

Drongo 02-10-2009 12:49 1232675

Admiral, Спасибо за помощь и проявленный интерес к проблеме.
Цитата:

Цитата Admiral
нужно и саму функцию входа в программу использовать соответственную: вместо WinMain - wWinMain. »

Я сравнивал ваш исходник для MultiBoot Configurator'a, но как использовать эту функцию в своей, не имею представления, там ведь проект .bpr. Функции WinMain вроде как только в файле - Project1.cpp - коммент 15.

Я добавил перед функцией WinMain - символ - wWinMain. Попробовал откомпилировать, ошибка компоновщика. Что WinMain ссылается на COW32.OBJ
Код:

[Компоновщик Ошибка] Unresolved external 'WinMain' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0W32.OBJ
Код:

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI wWinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                Application->Initialize();
                Application->CreateForm(__classid(TForm1), &Form1);
                Application->Run();
        }
        catch (Exception &exception)
        {
                Application->ShowException(&exception);
        }
        catch (...)
        {
                try
                {
                        throw Exception("");
                }
                catch (Exception &exception)
                {
                        Application->ShowException(&exception);
                }
        }
        return 0;
}
//---------------------------------------------------------------------------

По wWinMain нашёл статью - Точка входа в программу, но мне ничего это не дало.


Цитата:

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

Я тоже об этом думал. :yes:
Цитата:

Цитата Admiral
Например считывая атрибуты файла kernel32.dll проверять что там написано: Корпорация Мискрософт или Microsoft Corporation. »

Так?
Код:

FileGetAttr(C:\\windows\\system32\\kernel32.dll)
Установить атрибуты могу: Архивный, сктрытый и т.д.

Ещё поискал в гугле, подумал, может нужно эту функцию использовать - GetFileAttributesW ? Хотя никогда использовать её не приходилось.

Admiral 02-10-2009 14:03 1232727

Drongo погуглив (другим участникам напомню, в настоящие время не использую среду разработки от Борланда) вышел на то, что в Борланде возможно пройдёт такой код extern "C"int WINAPI wWinMain
В настройка проекта где-то должен быть пункт про использования Юникода. Так же в параметрах передачи линковщику, если есть присутствующий WinMain, должен быть заменён на wWinMain (что-то на подобии /ENTRY:wWinMain), кроме этого bcc должен быть передан параметр -WU.
Borland WinMain patch (Англ.)
Help please with UNICODE linking (Англ.)


Борландская функция FileGetAttr как и Win32 APIшная GetFileAttributes определяет общие характеристики файла, как было замечено: Архивный, скрытый и т.д.
Для определения CompanyName нужно использовать тандем сразу трёх функций GetFileVersionInfoSize, GetFileVersionInfo, VerQueryValue
Неплохой пример лежит здесь GetFileVersion
Вместо TEXT("\\") вероятно нужно использовать TEXT("\\CompanyName ") или что-то наподобие.
Хочу ещё раз заметить, что патчи могут использовать более простой алгоритм определения языка системы (сильно не копал в этом направлении, может через System Metrics?).

Ну, а вместо передачи абсолютного адреса лучше его определять для текущей системы. Пример здесь.
Так как в ХР данная папка легко меняется (в файле ответов Winnt.sif секция [Unattended] параметр TargetPath), в Висте и выше с помощью файла ответов AutoUnattend.xml(секция <DiskConfiguration> пример) можно переназначит диск, ну а с папкой сейчас разбираются.
A и W в конце имени функций стоит использовать в случаях, когда параметры могут передаваться только в одном виде, во всех остальных случаях их подстановку стоит регулировать определением (#define UNICODE| #define _UNICODE) или не определением Юникода.

Drongo 02-10-2009 15:22 1232783

Цитата:

Цитата Admiral
В настройка проекта где-то должен быть пункт про использования Юникода. »

Не поверите, не нашёл ничего в настройках по поводу Юникода.
Цитата:

Цитата Admiral
вышел на то, что в Борланде возможно пройдёт такой код extern "C"int WINAPI wWinMain »

Да, спасибо, но это не решило проблему, возможно я не так делаю, вот код. Ошибка та же.
Код:

#include <vcl.h>
#pragma hdrstop
#include <windows.h>

#ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

#if !(defined(_UNICODE) | defined(UNICODE))
#error no Unicode!
#endif

//---------------------------------------------------------------------------
USEFORM("Test1.cpp", Form1);
//---------------------------------------------------------------------------
extern "C" int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{
        try
        {
                Application->Initialize();
                Application->CreateForm(__classid(TForm1), &Form1);
                Application->Run();
        }
        catch (Exception &exception)
        {
                Application->ShowException(&exception);
        }
        catch (...)
        {
                try
                {
                        throw Exception("");
                }
                catch (Exception &exception)
                {
                        Application->ShowException(&exception);
                }
        }
        return 0;
}
//---------------------------------------------------------------------------

Параллельно заглянул в обучение, по статьям которым я начинал изучать C++Builder 6.0 - Шаг 90 - Исправление ошибок, связанных с настройками проектов. Так же не помогло.

В гугле ищу по этой ошибке, сообщений много, большая часть на английском, но все какие-то не понятные.

Наверное придётся отложить до лучших времён этот вопрос, боюсь, что я его сам не осилю.

Admiral 02-10-2009 23:20 1233122

Drongo, а что если к параметрам функции присмотреться
Цитата:

в обычной WinMain параметр LPSTR, а в wWinMain - LPTSTR >>
Может дело в этом?
Когда только переводил с WinMain на wWinMain среда от Микрософт кажись ругнулся на него.
На мысль подтолкнула эта тема Перенос проекта из 6 в 2009, WinMain -> wWinMain
Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) или попробовать компилить с консоли, быть может там найдётся подходящий параметр.

Drongo 03-10-2009 12:08 1233359

Цитата:

Цитата Admiral
Может дело в этом? »

Увы, в моём случае, нет. Изменения в параметрах не устранили ошибку.

Цитата:

Цитата Admiral
Ещё вариант: открыть пустой проект (в Борланде есть такой проект: не консольный и не GUI?) »

Пустой проект это обычный cpp файл, который не компилируется? Если да, то такой есть, хотя формы куда размешать кнопки и др. компоненты, нету.

Drongo 07-10-2009 13:24 1236740

В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009. :)

Помечаю вопрос как решённый, но если кто-то что-то откопает, милости прошу, отписывайтесь, буду признателен. :yes:

Drongo 14-10-2009 14:25 1242604

Вложений: 1
Цитата:

Цитата Drongo
В общем, вопрос с Кириллицей в WIN32 GUI приложениях отчасти решился переходом на C++ Builder 2009. »

Итак, отчаявшись найти решение, задал вопрос ещё на нескольких форумах. Вопросов было два:

1. Иногда при выполнении какой-либо операции в программе, нужно на метку (Label, GroupBox и т.д) вывести другой текст, не тот, который был изначально.
2. Сохранение русского текста содержащегося в Memo в файл, чтобы сохранился нормальный русский текст, а не знаки вопросов.

Первый вопрос:
1-е решение:
Добавляем параметр "L"
Код:

...
  GroupBox1->Caption = L"Выбрали "+ ComboBox1->Text;;
  Button1->Caption = L"Вернуть";
...

2-е решение:
Немного сложнее, используем
reconst.pas

Код:

unit ReConst;

interface

uses Windows;

resourcestring
  TEXTGroupBox1 = 'Выбрали';
  TEXTButton1 = 'Вернуть';
  TitleError = 'Внимание: Ошибка!';
  TEXTError1 = 'Неправильное значение!';
  TEXTError2 = 'Выберите пункт меню.';
//--------------------------------------------------
implementation

end.


ReConst.hpp

Как мне сказали, редактировать ReConst.hpp без смысла, т.к. Borland его генерирует по reconst.pas, но его нужно подключать:
Код:

...
#include "ReConst.hpp"
...

Код:

// CodeGear C++Builder
// Copyright (c) 1995, 2008 by CodeGear
// All rights reserved

// (DO NOT EDIT: machine generated header) 'Reconst.pas' rev: 20.00

#ifndef ReconstHPP
#define ReconstHPP

#pragma delphiheader begin
#pragma option push
#pragma option -w-      // All warnings off
#pragma option -Vx      // Zero-length empty class member functions
#pragma pack(push,8)
#include <System.hpp>        // Pascal unit
#include <Sysinit.hpp>        // Pascal unit
#include <Windows.hpp>        // Pascal unit

//-- user supplied -----------------------------------------------------------

namespace Reconst
{
//-- type declarations -------------------------------------------------------
//-- var, const, procedure ---------------------------------------------------
extern PACKAGE System::ResourceString _TEXTGroupBox1;
#define Reconst_TEXTGroupBox1 System::LoadResourceString(&Reconst::_TEXTGroupBox1)
extern PACKAGE System::ResourceString _TEXTButton1;
#define Reconst_TEXTButton1 System::LoadResourceString(&Reconst::_TEXTButton1)
extern PACKAGE System::ResourceString _TitleError;
#define Reconst_TitleError System::LoadResourceString(&Reconst::_TitleError)
extern PACKAGE System::ResourceString _TEXTError1;
#define Reconst_TEXTError1 System::LoadResourceString(&Reconst::_TEXTError1)
extern PACKAGE System::ResourceString _TEXTError2;
#define Reconst_TEXTError2 System::LoadResourceString(&Reconst::_TEXTError2)
}        /* namespace Reconst */
using namespace Reconst;
#pragma pack(pop)
#pragma option pop

#pragma delphiheader end.
//-- end unit ----------------------------------------------------------------
#endif        // ReconstHPP

К проекту подключаем (Project -> Add to Project <Shift + 11>) - reconst.pas.

Файл .cpp

Код:

...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  GroupBox1->Caption = (UnicodeString)Reconst_TEXTGroupBox1;
  Button1->Caption = Reconst_TEXTButton1;
  Button2->Caption = Reconst_TEXTButton2;
  Label1->Caption = Reconst_TEXTLabel1;
  UnicodeString TextError = Reconst_TEXTError1 + "\n" + Reconst_TEXTError2;
  Application->MessageBox(TextError.w_str(), Reconst_TitleError.w_str(), MB_YESNO+MB_ICONWARNING);
}
...



Компилируем. :) Полный пример привожу в архиве. Среда разработки C++ Builder 2009


Второй вопрос:
Чтобы сохранить русский текст из Memo в файл и чтобы содержимое файла отображалось правильно, а не знаками ?????, нужно добавить второй параметр к функции SaveToFile("MyFile.txt", TEncoding::Unicode)
Код:

...
  Memo1->Lines->SaveToFile("SaveFile.txt", TEncoding::Unicode);
...

Как мне сказали, нужно указывать вторым параметром соответствующую кодировку:
Код:

TEncoding::Unicode
TEncoding::UTF8
TEncoding::Default
TEncoding::ASCII



Вопрос решён!!! :yahoo:


Время: 18:21.

Время: 18:21.
© OSzone.net 2001-