Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подключение к программе общего модуля с классом, Подскажите как правильней 
:(
    Опции темы
Ytz
Дата 17.12.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Задача:
В программе с несколькими формами есть модуль с классом который обрабатывает данные для этих форм.
Вот моя реализация:
Код

#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#endif

class TTest
{
    public:
        int __fastcall Get();
        void __fastcall Set(int n);
        __fastcall TTest();
    protected:
        int num;
};

Это заголовок модуля с классом-обработчиком.
Код

#include "Unit3.h" // модуль с классом
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:    // User declarations
public:        // User declarations
    TTest *Test;
    __fastcall TForm1(TComponent* Owner);
};

Это заголовок основного модуля, здесь я создаю обьект.
В остальных модулях поступаю так:
Код

#include "Unit1.h" // основной модуль, в нем создан обьект
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
    Label1->Caption = Form1->Test->Get(); // обращение к методу класса
}


Теперь собственно вопрос - смущает, что во всех формах надо подключать первую форму, где создан обьект. Хочу что-бы модуль с описанием класса был самодостаточен, то есть в нем же и создавался экземпляр класса единый для всех форм, но не понял как это сделать. Есть ли такое решение? Спасибо!

Это сообщение отредактировал(а) Ytz - 17.12.2007, 16:39
PM MAIL   Вверх
Lazin
Дата 17.12.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



Самый простой вариант - создай глобальную переменную

Код

#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#endif
class TTest
{
    public:
        int __fastcall Get();
        void __fastcall Set(int n);
        __fastcall TTest();
    protected:
        int num;
};

extern TTest test;


Unit3.cpp
Код


TTest test;

PM MAIL Skype GTalk   Вверх
Ytz
Дата 17.12.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Да спасибо, что-то я ступил  smile 
PM MAIL   Вверх
SerK
Дата 19.12.2007, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 31.3.2007

Репутация: нет
Всего: нет



Доброй ночи!
Чтобы не создавать новой темы, вопрос по этой же теме.
Как к моей *.h подключить другую библиотеку
Вот пример кода:
Код

#ifndef GradientFillH
#define GradientFillH
//---------------------------------------------------------------------------
#include "IdGlobal.hpp"

//---------------------------------------------------------------------------
typedef unsigned char uc;
enum  TDirection {gdBottomToTop,gdRightToLeft,gdTopToBottom,gdLeftToRight};

//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
void __fastcall SGVGradientFillRect(TCanvas *Canvas,TRect ARect,
               TColor StartColor,TColor EndColor,TDirection Direction,uc Colors)
{
  uc StartRGB[3];
  int RGBDelta[3];
  TRect ColorBand;
  int I, Delta;
  HBRUSH Brush;
  div_t dv;

  if(IsRectEmpty(ARect)) return;
  if(Colors < 2)
    {
     Brush = CreateSolidBrush(ColorToRGB(StartColor));
     FillRect(Canvas->Handle, &ARect, Brush);
     DeleteObject(Brush);
     return;
    }
  switch(Direction)
   {
   case gdBottomToTop :
      StartRGB[0] = GetRValue(StartColor);
      StartRGB[1] = GetGValue(StartColor);
      StartRGB[2] = GetBValue(StartColor);

      RGBDelta[0] = GetRValue(EndColor) - StartRGB[0];
      RGBDelta[1] = GetGValue(EndColor) - StartRGB[1];
      RGBDelta[2] = GetBValue(EndColor) - StartRGB[2];
      break;
    case gdRightToLeft :
      StartRGB[0] = GetRValue(StartColor);
      StartRGB[1] = GetGValue(StartColor);
      StartRGB[2] = GetBValue(StartColor);

      RGBDelta[0] = GetRValue(EndColor) - StartRGB[0];
      RGBDelta[1] = GetGValue(EndColor) - StartRGB[1];
      RGBDelta[2] = GetBValue(EndColor) - StartRGB[2];
      break;
    case gdTopToBottom:
      StartRGB[0] = GetRValue(EndColor);
      StartRGB[1] = GetGValue(EndColor);
      StartRGB[2] = GetBValue(EndColor);

      RGBDelta[0] = GetRValue(StartColor) - StartRGB[0];
      RGBDelta[1] = GetGValue(StartColor) - StartRGB[1];
      RGBDelta[2] = GetBValue(StartColor) - StartRGB[2];
      break;
   case gdLeftToRight:
      StartRGB[0] = GetRValue(EndColor);
      StartRGB[1] = GetGValue(EndColor);
      StartRGB[2] = GetBValue(EndColor);

      RGBDelta[0] = GetRValue(StartColor) - StartRGB[0];
      RGBDelta[1] = GetGValue(StartColor) - StartRGB[1];
      RGBDelta[2] = GetBValue(StartColor) - StartRGB[2];
      break;
   }
  ColorBand = ARect;
  if (Direction == gdBottomToTop || Direction == gdTopToBottom)
   {
    Colors = Max(2, Min(Colors, ARect.Height()));
    dv = div(ARect.Height(),Colors);
    Delta = dv.quot;
   }
  else
   {
    Colors = Max(2, Min(Colors, ARect.Width()));
    dv = div(ARect.Width(),Colors);
    Delta = dv.quot;
   }
  Canvas->Pen->Style = psSolid;
  Canvas->CopyMode = cmSrcCopy;
  if (Delta > 0)
   {
    for (I = 0; I <= Colors; I++)
     {
      switch(Direction)
       {
        case gdBottomToTop:
          ColorBand.Top = ARect.Top + I * Delta;
          ColorBand.Bottom = ColorBand.Top + Delta;
          break;
        case gdTopToBottom:
          ColorBand.Top = ARect.Top + I * Delta;
          ColorBand.Bottom = ColorBand.Top + Delta;
          break;
        case gdRightToLeft:
          ColorBand.Left = ARect.Left + I * Delta;
          ColorBand.Right = ColorBand.Left + Delta;
          break;
        case gdLeftToRight:
          ColorBand.Left = ARect.Left + I * Delta;
          ColorBand.Right = ColorBand.Left + Delta;
          break;
       }
      Brush = CreateSolidBrush(RGB(
        StartRGB[0] + MulDiv(I, RGBDelta[0], Colors - 1),
        StartRGB[1] + MulDiv(I, RGBDelta[1], Colors - 1),
        StartRGB[2] + MulDiv(I, RGBDelta[2], Colors - 1)));
      FillRect(Canvas->Handle, &ColorBand, Brush);
      DeleteObject(Brush);
     }
   }
  if (Direction == gdBottomToTop || Direction == gdTopToBottom)
    Delta = ARect.Height() % Colors;
  else Delta = ARect.Width() % Colors;
  if (Delta > 0)
   {
    switch(Direction)
     {
     case gdBottomToTop:
        ColorBand.Top = ARect.Bottom - Delta;
        ColorBand.Bottom = ColorBand.Top + Delta;
        break;
     case gdTopToBottom:
        ColorBand.Top = ARect.Bottom - Delta;
        ColorBand.Bottom = ColorBand.Top + Delta;
        break;
     case  gdRightToLeft:
        ColorBand.Left = ARect.Right - Delta;
        ColorBand.Right = ColorBand.Left + Delta;
        break;
     case  gdLeftToRight:
        ColorBand.Left = ARect.Right - Delta;
        ColorBand.Right = ColorBand.Left + Delta;
        break;
     }
    switch(Direction)
     {
      case gdBottomToTop:
        Brush = CreateSolidBrush(EndColor);
        break;
      case gdRightToLeft:
        Brush = CreateSolidBrush(EndColor);
        break;
      default: //{3, 4}
        Brush = CreateSolidBrush(StartColor);
        break;
      
     }
    FillRect(Canvas->Handle, &ColorBand, Brush);
    DeleteObject(Brush);
   }
}


Кстати, это функция градиентной заливки, которую мы перевели с Паскаля
(RX Lib).
Хотелось бы ее хранить и вызывать из отдельного файла, но чтобы это 
получилось, нужно подключить библиотеку #include "IdGlobal.hpp",
а вот ее то компилятор не видит, кто знает - в чем проблема?

Эта библиотека нужна для использования функций Маx и Min.


--------------------
Пусть будет миру хорошо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0729 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.