Цитата 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
Вопрос решён!!!
