Секреты для программистов на Borland C++
Builder 6
4 августа 2004
Руссификация сообщений об ошибках
Для определения расширенного кода ошибки используется функция
WinAPI GetLastError(), объявленная в файле
winbase.h следующим образом:
DWORD GetLastError(VOID). Для расшифровки кода ошибки воспользуйтесь следующим
фрагментом кода:
Часто для вывода сообщений
используется функция ShowMessage(const AnsiString Msg), которая выводит
модальное окно с сообщением. Существует способ автоматического (программного)
закрытия этого окна. Создайте новый проект и поместите на форму со стандартной
палитры компонентов следующие компоненты: Edit, Label и Button, а с системной
палитры – компонент Timer. Объявите две глобальные переменные:
HWND ShowMessageDlgHWND = NULL;
HWND ShowMessageDlgButtonHWND = NULL;
и функцию обратного вызова:
BOOL CALLBACK EnumShowMessageDlgProc(HWND hwnd, LPARAM lParam)
{ ShowMessageDlgButtonHWND = hwnd; return true;
}
в общем разделе класса формы объявите переменную:
int sec. Очистите свойство Text у компонента
Edit и добавьте следующий код в обработчик события OnKeyPress:
Set <char, '0', '9'> Dig;
Dig << '0' << '1' << '2' << '3' << '4' << '5' << '6' << '7' << '8' << '9';
if(!Dig.Contains(Key))
{ Key = 0; MessageBeep(MB_ICONASTERISK);
}.
Данный код позволяет вводить только числа. В обработчик события OnTimer
компонента Timer добавьте код:
Label1->Caption = IntToStr(sec);
if(sec == 0)
{ ShowMessageDlgHWND = FindWindow("TMessageForm",
"Project1"); ShowMessageDlgButtonHWND = NULL; EnumChildWindows(ShowMessageDlgHWND, (WNDENUMPROC)EnumShowMessageDlgProc, NULL); PostMessage(ShowMessageDlgButtonHWND,
BM_CLICK, 0, 0); Timer1->Enabled = false;
}
else
{ sec--;
}.
В обработчик события OnClick компонента Button добавьте код:
if(Edit1->Text == "") return; sec = StrToInt(Edit1->Text); Timer1->Enabled = true; String tmp = "Переместите это
сообщение.\n\tЧерез " + IntToStr(sec) + " сек.\nзакроется
автоматически!"; ShowMessage(tmp);
Полностью исходный код модуля Unit1.cpp приведен в листинге 1.
//---------------------------------------------------------------------------
Создайте новый проект и разместите на
форме следующие компоненты: ListBox, две кнопки Button и два RadioButton
(рисунок 1).
Форма в процессе проектирования
Работающее приложение
Рисунок 1.
Создайте небольшой текстовый
файл. Он понадобится нам для тестирования приложения, и будет загружаться в
ListBox в обработчике события OnCreate формы приложения следующей строкой кода:
ListBox1->Items->LoadFromFile("test.txt");. В общем разделе класса формы
объявите функцию перерисовки ListBox: void __fastcall RepaintListBox(); Функция перерисовки содержит одну
строку кода, ListBox1->Repaint(), которая вызывает стандартный метод компонента
ListBox. Добавьте следующий код в обработчик
события OnDrawItem компонента ListBox:
TCanvas *pCanvas = (dynamic_cast<TListBox*>(Control))->Canvas;
if(RadioButton1->Checked)
{ if(Index % 2 == 0) pCanvas->Brush->Color
= clAqua; else pCanvas->Brush->Color
= clFuchsia;
}
if(RadioButton2->Checked)
{ div_t x = div(Index, 3); switch(x.rem) { case 0:
pCanvas->Brush->Color = clWhite; pCanvas->Font->Color
= clRed; break;
case 1:
pCanvas->Brush->Color = clBlue; pCanvas->Font->Color
= clWhite; break;
В обработчик OnClick компонента Button1 добавьте код: ListBox1->Color = TColor(0x008DC75A); ListBox1->Style = lbOwnerDrawFixed;,
а компонента Button2: ListBox1->Color = clWindow; ListBox1->Style = lbStandard;.
В обработчик OnClick компонентов RadioButton вставьте строку кода:
RepaintListBox();. Запустите проект на выполнение.
Поэкспериментируйте со свойством Style компонента ListBox, в первоначальном виде
оно установлено в lbStandard. Полностью исходный код модуля Unit1.cpp приведен в
листинге 2.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop