Отправляет email-рассылки с помощью сервиса Sendsay

Уроки по C++ Builder

  Все выпуски  

Уроки по C++ Builder


Информационный Канал Subscribe.Ru


C++ Builder. Уроки с сайта http://progs.biz

Рассылка №1

C++ Builder. Урок 1. Первая программа на C++ Builder.
C++ Builder. Урок 2. Вторая программа на C++ Builder.

Полные версии уроков (с картинками) можно найти по адресам
Урок 1. Первая программа на C++ Builder.
Урок 2. Вторая программа на C++ Builder.

C++ Builder. Урок 1. Первая программа на C++ Builder

Первая наша программа будет рисовать на форме звездочку. Количество вершин у звездочки будет задаваться пользователем. Кроме того, пользователь будет задавать еще одно число, определяющее, через сколько вершин происходит соединение (если это число равно один, то получается не звездочка, а просто многоугольник, если два, то при соединении одну вершину пропускаем) и т. п.. Рисование будет присходить при нажатии на кнопку.

Итак, запустите C++ Builder, и разместите на появившейся форме два Edit'а и одну кнопку (компонент Button) и два label'а.

Задайте свойства Caption для label'ов как "n:" и "m:" соответственно. Для кнопки же свойство Caption установите в "Нарисовать".

Теперь займемся кодом. Все рисование на форме происходит, как правило, в обработчике OnPaint. Есть еще и много других обработчиков - OnCreate (его код выполняется при создании формы), OnClick (код выполняется, когда пользователь щелкает на форме). Для того, чтобы создать заготовку для соответствеющего обработчика, выбираем нужный пункт в combobox'е Object Inspector'а, затем щелкаем на вкладочке Events чуть пониже и делаем двойной щелчок на строке с нужным именем обработчика.

В окно кода вносим следующие строки:

...
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  int r=30; //Радиус
  int x=50, y=50; //Центр звезды
  const float pi=3.1415926;
  Canvas->MoveTo(x + r, y); //Переходим в начальную точку
  for(int i=1; i<=n; i++){
    //Рисуем в цикле
    Canvas->LineTo(x + cos(i*m*pi*2/n) * r, y + sin(i*m*pi*2/n) * r);
  }
}
 ...

Этот код и рисует звезду с центром в точке (50, 50) и радиуром 30. С алгоритмом рисования мы сейчас разбираться не будем. Отметим только, чт мы использем тут синусы и косинусы. А это значит, что файл с соответствующими функциями надо подключить (а то компилятор будет ругаться, что не знает он, что такое sin и cos). Для подключения добавьте с начале файла следующую строку:

...
#include "Unit1.h"
#include <math.h>
 ...

Еще во вставленном коде мы используем две неописанные пока переменные n и m. Именно они и оперделяют, сколько у нашей звездочки будет лучей (n) и через сколько вершин происходит соединение (m). Эти две переменные надо ввести в переменные класса TForm1 (в заголовочном файле *.h):

private: // User declarations
  int n, m;
 ...

Далее этим переменным надо задать некоторое начальное значение. Это мы сделаем в обработчике OnCreate для нашей формы. Для создания заготовки для обработчика делаем двойной щелчок на строке OnCreate в Object Inspector'е. Кроме того, здесь же мы зададим некоторые начальное значения для наших edit'ов:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  n=5;
  m=2;
  Edit1->Text="5";
  Edit2->Text="2";
}

Двигаемся дальше. Теперь нам надо написать обработчик для нашей кнопки. Можно опять воспользоваться Object Inspector'ом, но проще сделать в конструкторе формы двойной щелчок на кнопке. В созданной заготовке напечатайте следующие строки:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  n=StrToInt(Edit1->Text); //Количество лучей
  m=StrToInt(Edit2->Text); //Через сколько соединяем
  Invalidate();
}

В этом коде мы читаем значения из наших edit'ов, превращаем их в целые числа с помощью функции StrToInt и затем вызываем функцию Invalidate(), которая заставляет наше окно перерисоваться с новыми значениями n и m. Вообще говоря, метод Invalidate() отправляет нас в обработчик для OnPaint, в котором мы собственно говоря нашу звезду и рисуем.

Запускаем программу и смотрим на результат - появится обычная пятиконечная звезда.

Если зададите другие значения для n и m, то и звездочка будет другой.

С первой программой все!

Наверх

C++ Builder. Урок 2. Вторая программа на C++ Builder

На этом занятии мы с вами сделаем простой текстовый редактор. Будет он уметь следующее - открывать текстовые файлы и сохранять внесенные пользователем изменения. Наша программа будет использовать стандартные диалоги - для открытия и сохранения файлов соответственно. Итак, запустите C++ Builder, и разместите на форме компоненты Memo (с вкладки Standard Палитры компонетов) и OpenDialog и SaveDialog (с вкладки Dialogs).

Далее измените свойство Align для компонента Memo1 на alClient. Это означает, что он будет занимать всю клиентсткую область, т. е. наш редактор будет занимать все окно. Еслы мы в работающей программе поменяем размер, то все равно наш Memo1 будет "растянут" на всю форму.

Теперь приступаем к коду. Мы хотим, что бы диалог для сохранения появлялся при нажатии на крестик в правом верхнем углу или при комбинации клавиш Alt+F4. При этом мы хотим, чтобы такой диалог появлялся только тогда , когда документ как-то изменили. А если в редактируемый документ никакие изменения не вносились, то и диалог появлятся не будет. Для этого добавляем через Object Inspector обработчик для OnClose формы Form1. Вписываем в обработчик следующие строки:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  if(bDirty){ //Если документ изменялся
    //Вызываем диалог
    SaveDialog1->Execute();
    //Сохраняем данные в файле
    Memo1->Lines->SaveToFile(SaveDialog1->FileName);
  }
}

Здесь мы используем переменную bDirty типа bool, показывающую, был документ изменен или нет. Ее мы еще ввели. Исправим это в заголовочном файле (с расширением *.h):

...
public: // User declarations
bool bDirty;

Добавим обработчик для OnCreate для нашей формы и впишем него строку:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  bDirty=false; //Изменений в документе пока нет 
}

Теперь добавим код, выполняющийся при изменении текста в Memo1:

void __fastcall TForm1::Memo1Change(TObject *Sender)
{
  bDirty=true; //Документ изменили
}

С сохранением в файл все. Теперь остается добавить диалог для открытия файла. Давайте сделаем так, чтобы он появлялся при двойном щелчке на нашем Memo1. Для этого в обработчик для OnDblClick нашего Memo1 добавьте следующий код:

void __fastcall TForm1::Memo1DblClick(TObject *Sender)
{
 OpenDialog1->Execute();
 //Загружаем данные их файла
 Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
 //Устанавливаем признак того, что документ не менялся
 bDirty=false;
}

Все! Запускаем программу. Двойным щелчком можно загрузить в программу некоторый файл, поредактировать его и сохранить. Конечно, наша программа не работает как настояшие редакторы (например, что будет, если мы в диалоге для сохранения файла не выберем ни одного файла? Ничего хорошего).

Наверх

Copyright Шмидт Отто, 2002

Copyright Алексеев Игорь, 2002

Copyright сайт progs.biz, 2002


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное