Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Подскажите как применить Мои класс ?


Автор: beautifulll 15.10.2006, 21:11
Есть класс (мне с ним на этом форуме помогли):
class Styles
{
protected:
  TFontStyles FontStyle;
  TRichEdit *RichEdit;
public:
  Styles( TRichEdit *Edit );
  void Underline_true(); // подчёркивание
  void Underline_false();
  void StrikeOut_true(); // зачёркивание
  void StrikeOut_false();
};

Как исп-ть его для RichEdit1  , который уже на форме.
Сперва надо объявить какой-нибудь любой объект этого типа, в смысле:
Styles NewOb(TRichEdit *RichEdit1); ???
Только тогда почему-то исп-ние функций класса не получается, т.е. на строку 
 NewOb.StrikeOut_true(); 
выдается ошибка, типа "left . or .*"
А как надо не знаю smile  smile 

Автор: fry 15.10.2006, 23:27
Код  StrikeOut_true() можно увидеть?

Автор: fry 15.10.2006, 23:52
проверь . и ->
И еще мне не нравиться >> и << в методах класса, но это так....

Автор: Oberon83 16.10.2006, 11:23
beautifulll, код конструктора класса какой?
В конструкторе необходимо присвоить: RichEdit = Edit.
Во вторых при создании класса:
Код

Styles NewOb(Твой RichEdit);

либо 
Код

Styles NewOb;
NewOb = new Styles(Твой RichEdit);


Автор: beautifulll 16.10.2006, 19:15
Я так делала Styles NewOb(Твой RichEdit);, т.е. Styles NewOb(Form1-> RichEdit1); а он всё работать не хочет именно когда я ввожу эту строчку, как ее уберу остальное запускается.
А сами функции вот какие:
#pragma hdrstop
#include "Unit2.h"

Styles::Styles( TRichEdit *Edit )
{
  RichEdit = Edit;
  FontStyle = Edit->SelAttributes->Style;
}

//---------------------------------------------------------------------------
void Styles::StrikeOut_true()
{
  FontStyle << fsStrikeOut;
  RichEdit->SelAttributes->Style = FontStyle;
}
//---------------------------------------------------------------------------

 smile 

Автор: Oberon83 17.10.2006, 08:05
beautifulll, и какую ошибку показывает? Скорее всего ошибка доступа к памяти, поскольку ты под свой класс память не выделяешь.
Попробуй так:
Код

Styles NewOb;    
NewOb = new Styles(Твой RichEdit);

Должно получиться.

Автор: beautifulll 17.10.2006, 20:09
Так не получается:
 в строке Styles NewOb; выдает ошибку:
Could not find a match for ‘Styles::Styles()’
В строке NewOb =new Styles(Form1->RichEdit1); ошибка Type name expected.

Единственный вариант когда программа запускается- это 
Styles NewOb(Form1->RichEdit1);
При таком варианте хотя б когда пишу потом NewOb. автоматически предлогается список функций моего класса.
Но выдает ошибку памяти после запуска.
 smile 

Автор: Oberon83 18.10.2006, 08:44
beautifulll, код приложения и класса в студию. Где подключается класс? Ошибку памяти выдает потому что ты под свой объект класса память не выделяешь.

Автор: beautifulll 18.10.2006, 20:11
Вот то что для формы на которой только RichEdit1 и кнопка  smile .
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
 #include "Unit2.h"


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

 [color=red]Styles Clas(Form1->RichEdit1); [/color]//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
   Clas.StrikeOut_false();
}
//---------------------------------------------------------------------------



Вот то что для описания моего класса: это Unit2.h
Код

//----- файл unit2.h ---------------------------------------------------
#ifndef Unit2H
#define Unit2H
#include <ComCtrls.hpp>

class Styles
{
protected:
  TFontStyles FontStyle;
  TRichEdit *RichEdit;
public:
  Styles( TRichEdit *Edit );
  void Underline_true(); // подчёркивание
  void Underline_false();
  void StrikeOut_true(); // зачёркивание
  void StrikeOut_false();
};
//--------------------------------------------------------------------------



А вот где функции описаны Unit2.cpp:
Код

//--------- файл unit2.cpp -----------------------------------------------
#pragma hdrstop
#include "Unit2.h"

Styles::Styles( TRichEdit *Edit )
{
  RichEdit = Edit;
  FontStyle = Edit->SelAttributes->Style;
}
//---------------------------------------------------------------------------

void Styles::Underline_true()
{
  FontStyle << fsUnderline;
  RichEdit->SelAttributes->Style = FontStyle;
}
//---------------------------------------------------------------------------
void Styles::Underline_false()
{
  FontStyle >> fsUnderline;
  RichEdit->SelAttributes->Style = FontStyle;
}
//---------------------------------------------------------------------------
void Styles::StrikeOut_true()
{
  FontStyle << fsStrikeOut;
  RichEdit->SelAttributes->Style = FontStyle;
}
//---------------------------------------------------------------------------
void Styles::StrikeOut_false()
{
  FontStyle >> fsStrikeOut;
  RichEdit->SelAttributes->Style = FontStyle;
}
//---------------------------------------------------------------------------
#pragma package(smart_init)
 

 


Я вроде бы понимаю, что проблемы с памятью, а как решить то их незнай!!! smile 

Автор: segmentation_fault 18.10.2006, 21:15
beautifulll, напиши так:
Код

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   Styles *Clas = new Styles(Form1->RichEdit1);
}




Автор: beautifulll 19.10.2006, 19:32
Если я объявляю объект в каждой процедуре нажатия кнопки, то всё работает, т.е.:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{   Styles *Clas = new Styles(Form1->RichEdit1);
   (*Clas).StrikeOut_false();
}
Но у меня же будет еще несколько кнопок, по нажатию которых мне нужен объект моего класса , разве так правильно выделять место памяти для объекта моего класса каждый раз(в каждой процедуре кнопки)?
А если 

 __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   Styles *Clas = new Styles(Form1->RichEdit1);
}
 
То объект Clas не узнается в процедуре нажатия кнопки.

ВСЁ, РАЗОБРАЛАСЬ, ВСЁ ВЫХОДИТ ТЕПЕРЬ.ГЛУПЫШКА ПРОСТО. СПАСИБО ВСЕМ БОЛЬШОЕ!!!в жизни бы сама не додумалася. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)