C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Не понятки с указателями  (Прочитано 3397 раз)
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Не понятки с указателями
« : 18 Январь 2011, 11:44:41 »

Здравствуйте!
Ребята помогите разобрать ся с вопросом!

Создаю динамически отчёт в FastReport и после запуска он мне выдаёт ошибку

Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 frReport1->LoadFromFile("A4.frf");
 frReport1->Title = "Привет";
 frReport1->Pages->Clear();
 frReport1->Pages->Add();
 TfrPage *Page = new  TfrPage(0,0,0,0,poPortrait);
 Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];   //создаём страницу
 
 TfrBandView *Band = new TfrBandView();   // создаём TitleBand
 Band->SetBounds(0,20,0,200);
 Band->BandType = btReportTitle;
 Page->Objects->Add(Band);
 
 int b = 0;
 TfrMemoView *Memo;
 for (int i=0;i5;i++)
{
 Memo = new TfrMemoView();// создаём Memo
 Memo->Name = "Memo"+AnsiString(i);
 b+=20;
 Memo->SetBounds(20,b,76,22);
 Memo->BandAlign = baCenter;
 Memo->Alignment = frtaCenter;
 Memo->Prop["Font.Style"] = 2;
 Memo->Font->Size = 12;
 Memo->FillColor = clSilver;
 Memo->FrameColor = clBlack;
 Memo->FrameStyle = psSolid;
 Memo->FrameTyp = 15;
 Memo->FrameWidth = 2;
 Memo->Memo->Add("Здарова");
 Page->Objects->Add(Memo);
 
 }
 delete Band;
 Band = NULL;
 delete Page;
 Page = NULL;
 delete Memo;
 Memo = NULL;
 frReport1->PrepareReport();
 frReport1->ShowPreparedReport();
 
 
Я заметил такую характерную особенность, что когда указатели не разыменовываешь, то эта ошибка не выскакивает. Скриншот ошибки прилагаю
Заранее благодарен, кто поможет

Записан
Day
Участник


Сказали спасибо: +11/-1
Offline

Сообщений: 137


Re: Не понятки с указателями
« Ответ #1 : 18 Январь 2011, 11:58:51 »

Memo ты создаешь 5 раз, а удаляешь только 1 раз. Но это не должно приводить к ошибке, только к утечке памяти.
А вот delete Page не удаляет ли всех своих составляющих ?
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Не понятки с указателями
« Ответ #2 : 18 Январь 2011, 13:51:09 »

Код:
TfrPage *Page = new TfrPage(0,0,0,0,poPortrait);
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];   //создаём страницу

это ж звездец полный. рекомендую заборостроительный колледж.
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Не понятки с указателями
« Ответ #3 : 18 Январь 2011, 14:00:10 »

Цитата: Zor от 18 Январь 2011, 13:51:09
Код:
TfrPage *Page = new TfrPage(0,0,0,0,poPortrait);
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];   //создаём страницу

это ж звездец полный. рекомендую заборостроительный колледж.
Этот код я в интернете нашёл. А что не правильно объект создаётся или что?
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Не понятки с указателями
« Ответ #4 : 18 Январь 2011, 14:12:15 »

если вы ничего не замечаете - учите основы языка.
и пока не изучите - к таким довольно сложным компонентам как FR лучше не подходите.
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Не понятки с указателями
« Ответ #5 : 19 Январь 2011, 11:01:01 »

Цитата: Sasha от 18 Январь 2011, 14:00:10
Цитата: Zor от 18 Январь 2011, 13:51:09
Код:
TfrPage *Page = new TfrPage(0,0,0,0,poPortrait);
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];   //создаём страницу

это ж звездец полный. рекомендую заборостроительный колледж.
Этот код я в интернете нашёл. А что не правильно объект создаётся или что?

Код:
TfrPage *Page = new TfrPage(0,0,0,0,poPortrait); // ТУТ уде создаётся страница, т.е. выделяется память
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];   // а тут ты пытаешься перезаписать созданную страницу имеющейся...

Если надо обратиться к имеющейся странице, то так:
Код
TfrPage *Page = NULL;
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1]; // дальше можно проверять Page на "не NULL"
 
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Не понятки с указателями
« Ответ #6 : 19 Январь 2011, 11:45:47 »

Цитата: S0mbre от 19 Январь 2011, 11:01:01
Цитата: Sasha от 18 Январь 2011, 14:00:10
Цитата: Zor от 18 Январь 2011, 13:51:09
Код:
TfrPage *Page = new TfrPage(0,0,0,0,poPortrait);
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];   //создаём страницу

это ж звездец полный. рекомендую заборостроительный колледж.
Этот код я в интернете нашёл. А что не правильно объект создаётся или что?

Код:
TfrPage *Page = new TfrPage(0,0,0,0,poPortrait); // ТУТ уде создаётся страница, т.е. выделяется память
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];   // а тут ты пытаешься перезаписать созданную страницу имеющейся...

Если надо обратиться к имеющейся странице, то так:
Код
TfrPage *Page = NULL;
Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1]; // дальше можно проверять Page на "не NULL"
 
Спасибо за помощь, но это меня не спасло так как ошибка всё равно появляется  такое впечатление вроде я обращаю к пустой памяти, только не знаю в каком месте и иногда проскакивает другая ошибка Неверный FRF-формат

Вот исправленный код
Код
frReport1->LoadFromFile("A4.frf");
 frReport1->Title = "Привет";
 frReport1->Pages->Clear();
 frReport1->Pages->Add();
 TfrPage *Page = NULL;
 Page = frReport1->Pages->Pages[frReport1->Pages->Count - 1];
 
 TfrBandView *Band = new TfrBandView();  
 Band->SetBounds(0,20,0,200);
 Band->BandType = btReportTitle;
 Page->Objects->Add(Band);
 
 int b = 0;
 for (int i=0;i5;i++)
{
 TfrMemoView *Memo = new TfrMemoView();
 Memo->Name = "Memo"+AnsiString(i);
 b+=20;
 Memo->SetBounds(20,b,76,22);
 Memo->BandAlign = baCenter;
 Memo->Alignment = frtaCenter;
 Memo->Prop["Font.Style"] = 2;
 Memo->Font->Size = 12;
 Memo->FillColor = clSilver;
 Memo->FrameColor = clBlack;
 Memo->FrameStyle = psSolid;
 Memo->FrameTyp = 15;
 Memo->FrameWidth = 2;
 Memo->Memo->Add("Здарова");
 Page->Objects->Add(Memo);
 delete Memo;
 Memo = NULL;
 }
 
 if (Page !=NULL)
 {
  delete Page;
  Page = NULL;
 }
 
 if(frReport1->PrepareReport())
   {
    frReport1->ShowPreparedReport();
   }
 
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Не понятки с указателями
« Ответ #7 : 19 Январь 2011, 12:39:38 »

После долгих тестиррований было установлено, что ошибка возникает после разыменования указателя Page. Но почему это происходит, не понятно
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Не понятки с указателями
« Ответ #8 : 19 Январь 2011, 12:54:37 »

Сейчас вылетает ошибка линковщика

[linker Error] Fatal: Access violation.  Link terminated.
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Не понятки с указателями
« Ответ #9 : 19 Январь 2011, 16:10:01 »

Цитата: Sasha от 19 Январь 2011, 12:39:38
После долгих тестиррований было установлено, что ошибка возникает после разыменования указателя Page. Но почему это происходит, не понятно
Тут по ходу любой указатель, который я разыменовываю приводит к ошибке. Блин прям не знаю чё и делать......
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Не понятки с указателями
« Ответ #10 : 19 Январь 2011, 17:36:15 »

Указатели на объекты, которые ты вытаскиваешь из отчета, находятся под управлением FastReport-а.
А ты туда со своим delete-ом лезешь. Повторяю - учи основы.

PS для информации - "разименовать" значит совсем другое.
« Последнее редактирование: 19 Январь 2011, 17:54:21 от Zor » Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Не понятки с указателями
« Ответ #11 : 20 Январь 2011, 01:03:52 »

Цитата: Zor от 19 Январь 2011, 17:36:15
Указатели на объекты, которые ты вытаскиваешь из отчета, находятся под управлением FastReport-а.
А ты туда со своим delete-ом лезешь. Повторяю - учи основы.

PS для информации - "разименовать" значит совсем другое.
Вообщем я пришёл к выводу, что в FastReporte лучше объекты не удалять.........
Записан
olegenty
Администратор


Сказали спасибо: +16/-7
Offline

Сообщений: 520


Re: Не понятки с указателями
« Ответ #12 : 20 Январь 2011, 09:52:02 »

Цитата: Sasha от 20 Январь 2011, 01:03:52
Цитата: Zor от 19 Январь 2011, 17:36:15
Указатели на объекты, которые ты вытаскиваешь из отчета, находятся под управлением FastReport-а.
А ты туда со своим delete-ом лезешь. Повторяю - учи основы.

PS для информации - "разименовать" значит совсем другое.
Вообщем я пришёл к выводу, что в FastReporte лучше объекты не удалять.........

Если объект средствами FastReport создан правильно (т.е. Owner есть и это FR), то он [FR] сам позаботится об удалении. Это не только FR касается, а вообще создания/работы с VCL объектами.

Не зря же Zor тебе говорит - учи матчасть. Вопросы задавай по матчасти, а не по прикладнине [пока в матчасти не разобрался].
Записан
Sasha
Участник


Сказали спасибо: +13/-0
Offline

Сообщений: 413


Re: Не понятки с указателями
« Ответ #13 : 08 Март 2011, 22:23:06 »

Здравстуйте!
Уважаемые товарищи программисты!
Помогите разобраться с вопросом.

Создал отчёт в фастрепорте и хочу на нём создавать динамически объекты. Только проблема в том, что не знаю как программно поменять параметры страницы (формат и ориентацию).

FastReport 2.5

Заранее благодарен
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.124 секунд. Запросов: 20.