Borland C++ VCL FAQ
Страница 2.




Как определить, является ли год високосным?


Для этого надо использовать функцию IsLeapYear. Например, следующий код покажет окно с текстом о том, является ли год високосным или нет:
int year = 2100;  // тут какой надо год
ShowMessage( IntToStr(year) + " год - " + ((IsLeapYear(year)) ? "" : "не ") + "високосный" );
Как видно, функция IsLeapYear принимает параметр - год и возвращает true, если он високосный и false в противном случае.

P.S. Троеточие в примерах заменяет некоторое выражение, позволяющее записать в объект корректное значение.

Компоненты - динамическое создание


Например, так:
for (int i=0;i<5;i++)
       {
       
TEdit *edit = new TEdit(this);
       
edit->Parent = this;
       
edit->Name = "edit"+AnsiString(i);
       
edit->Height = 16;
       
edit->Width = 104;
       
edit->Left = 0;
       
edit->Top = i*edit->Height;
       
edit->Text = AnsiString(i);
       }
Этот код создаст 5 TEdit'ов.
Обращатся к ним можно так (по имени):
for (int i=0;i<5;i++)
       {
       
TEdit *edit = (TEdit*)FindComponent("edit"+AnsiString(i));
       
edit->Text = "www.sources.ru";
       }
Или совершенно другой вариант - использование массива:
TEdit *edit[5];

for (int i=0;i<5;i++)
       {
       
edit[i] = new TEdit(this);
       
edit[i]->Parent = this;
       
edit[i]->Name = "edit"+AnsiString(i);
       
edit[i]->Height = 16;
       
edit[i]->Width = 104;
       
edit[i]->Left = 0;
       
edit[i]->Top = i * edit[i]->Height;
       
edit[i]->Text = AnsiString(i);
       }

for (int i=0;i<5;i++)
       {
       
edit[i]->Text = "www.sources.ru";
       }

Строки(AnsiString) - общие вопросы

Для начала краткая информация

AnsiString - класс динамической строки емкостью до 232-1 символов. Базой для создания этого класса послужил паскалевский тип String, который был расширен в соответствии с возможностями C++.
Особенностью его является то, что два экземпляра этого класса могут физически занимать один и тот же участок памяти. Экземпляр этого класса содержит счетчик ссылок к нему, когда этот счетчик обнуляется, экземпляр автоматически уничтожается. Если попытаться изменить экземпляр, к которому имеется более одной ссылки, то будет создана новая копия этой строки, которая и будет изменяться. Это уменьшает портебность программы в памяти, но и уменьшает скорость обработки.
Наследием Паскаля является также то, что символы в нем нумеруются с 1, а не с 0, как это принято в C/C++

Создание строки


Благодаря наличию перегруженных конструкторов строку можно создавать из большого количества базовых типов языка C++, например:
AnsiString empty_string; /* пустая строка */
AnsiString one = 1; /* строка one будет содержать "1" */
AnsiString one_and_half = 1.5; /* в one_and_half содержится строка "1.5" */
AnsiString one_charachter = 'a'; /* в one_charachter содержится строка "a" */
AnsiString dup_string = AnsiString::StringOfChar('A',5); /* dup_string получит значение "AAAAA" */
AnsiString simply_string = "string";
AnsiString shorten("Длинная строка",7); /* в shorten попадут только первые 7 символов */

получение символа из строки


Получить символ из строки типа AnsiString можно с помощью индексного оператора:
AnsiString ansi_string = "Строка";
char character = ansi_string[1]; /* получаем самый первый символ */
ansi_string[6] = 'и'; /* заменим 6-й на букву 'и' */

Получение символьного массива, содержащего значение AnsiString


Функции библиотеки исполнения C и функции WinAPI требуют, чтобы строки передавались им в виде символьных массивов. В AnsiString для этого предназначены функции c_str и data. Разница между ними в том, что для пустой строки c_str возвращает "", а data - NULL. Это отличие может быть проиллюстрировано следующим примером:
AnsiString ansi_string;
char * str1 = ansi_string.c_str();
char * str2 = (char *)ansi_string.data();

Копирование значения AnsiString в символьный массив Unicode


Для этого предназначена функция WideChar, а размер требуемого массива можно узнать, воспользовавшись функцией WideCharBufSize
AnsiString ansi_string = "Строка AnsiString"; /* наша строка */
wchar_t * UnicodeString = new wchar_t[ansi_string.WideCharBufSize()]; /* массив-получатель */
ansi_string.WideChar(UnicodeString,ansi_string.WideCharBufSize());
// используем полученную строку, затем удаляем
delete [] UnicodeString;
 
« Предыдущая статья   Следующая статья »