Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > «Access violation at address 00000000»


Автор: php5 10.9.2009, 10:05
В БД есть данные в формате RFT необходимо  их считать и  вставить в определенное место рисунок  для  работы с RFT текстом юзаю RichViewEdit   который размещен на главной форме, редактирование данных  происходит так:
Код

bool __fastcall TForm1::EditData(){
      AnsiString data,sql="SELECT * FROM TEMPLATE_DOGOVOR WHERE ID_TEMPLATE_DOGOVOR=1";
      IBQuery_all->Close();
      IBQuery_all->SQL->Clear();
      IBQuery_all->SQL->Add(sql);
      IBQuery_all->Open();
      TStream * Stream = Form1->IBQuery_all->CreateBlobStream(Form1->IBQuery_all->FieldByName("CONTENT"),bmReadWrite);
      data=Form1->editBlob(Stream);
      Memo1->Text=data;
      return true;


 }

//---------------------------------------------------------------------------
 AnsiString __fastcall TForm1::editBlob(TStream * Stream ){

    TRVESearchOptions Options;
    Options << rvseoDown;
    Graphics::TBitmap * bmp = new Graphics::TBitmap;
    TMemoryStream *stm= new TMemoryStream;
    bmp->LoadFromFile(ExtractFilePath(Application->ExeName)+"bars.bmp");
    Form1->RichViewEdit1->LoadRTFFromStream(Stream);
    Form1->RichViewEdit1->Format();
    while(Form1->RichViewEdit1->SearchText("[stamp]",Options))
           Form1->RichViewEdit1->InsertPicture("", bmp, rvvaBaseline);
    Form1->RichViewEdit1->SaveRTFToStream(stm,false);
    stm->Position=0;
    stm->Seek(0, soFromBeginning);
    int size = stm->Size;
    char * buf = new char[size];
    stm->ReadBuffer(buf,size);
    AnsiString data=buf;
    delete buf;
    delete stm;
    delete bmp;
    return data;
}

После того как  данные были успешно отредактированы  и функция завершила свою работу получаю сообщение об ошибке  следующего содержания :  «Access violation at address  00000000» из-за что не так ?
P/S  может, кто знает, как можно вставить в нужное место рисунок в RichView?


 

Автор: mrbrooks 10.9.2009, 11:54
php5, редактирование информации в БД через SQL происходит с помощью sql-команды UPDATE.

1. SELECT
2. Редактирование blob-поля
3. UPDATE 
4. .....
5. PROFIT! 

У тебя явно косяк с обновлением (редактирование) данных.

Автор: php5 10.9.2009, 14:27
дык я редактировал не в БД  а в  Stream  

Автор: mrbrooks 10.9.2009, 15:02
ок. а так что получится?
Код

 AnsiString __fastcall TForm1::editBlob()
{
    TStream * Stream = Form1->IBQuery_all->CreateBlobStream(Form1->IBQuery_all->FieldByName("CONTENT"),bmReadWrite);
    TRVESearchOptions Options;
    Options << rvseoDown;
    Graphics::TBitmap * bmp = new Graphics::TBitmap;
    TMemoryStream *stm= new TMemoryStream;
    bmp->LoadFromFile(ExtractFilePath(Application->ExeName)+"bars.bmp");
    Form1->RichViewEdit1->LoadRTFFromStream(Stream);
    Form1->RichViewEdit1->Format();
    while(Form1->RichViewEdit1->SearchText("[stamp]",Options))
           Form1->RichViewEdit1->InsertPicture("", bmp, rvvaBaseline);
    Form1->RichViewEdit1->SaveRTFToStream(stm,false);
    stm->Position=0;
    stm->Seek(0, soFromBeginning);
    int size = stm->Size;
    char * buf = new char[size];
    stm->ReadBuffer(buf,size);
    AnsiString data=buf;
    delete buf;
    delete stm;
    delete bmp;
    return data;
}
bool __fastcall TForm1::EditData()
{
      AnsiString data,sql="SELECT * FROM TEMPLATE_DOGOVOR WHERE ID_TEMPLATE_DOGOVOR=1";
      IBQuery_all->Close();
      IBQuery_all->SQL->Clear();
      IBQuery_all->SQL->Add(sql);
      IBQuery_all->Open();
      Memo1->Text=Form1->editBlob();
      return true;
 }


очень интересный подход. что ты хочешь увидеть здесь? набор закарючек?
Код

    char * buf = new char[size];
    stm->ReadBuffer(buf,size);
    AnsiString data=buf;
    delete buf;


Автор: php5 10.9.2009, 15:31
Дело в том что это лиш часть кода , на самом деле   отредактированный текст  сохраняется в PDF файл а  в Memo1  я вывожу лиш для того что  бы убедиться что функция    сработала 

Автор: php5 14.9.2009, 12:05
В  общем, проблема была в том, как  вставлялся рисунков  в RichViewEdit .  заработало вот так:
Код

TRVESearchOptions Options;
    Options << rvseoDown;
    TPicture* pic = new TPicture;
    pic->LoadFromFile(ExtractFilePath(Application->ExeName)+"bars.bmp");
    TGraphic* gr = GetGraphicCopy(pic->Graphic);
    gr->Assign(pic->Graphic);
    RichViewEdit1->TopLevelEditor->BeginUndoGroup(rvutInsert);
    RichViewEdit1->TopLevelEditor->SetUndoGroupMode(true);
    while(Form1->RichViewEdit1->SearchText("[stamp]",Options)){
          try{
             if(RichViewEdit1->InsertPicture("", gr, rvvaBaseline))
             RichViewEdit1->SetCurrentItemExtraStrProperty(rvespImageFileName, OpenDialog2->FileName, true);
          }
          __finally{RichViewEdit1->TopLevelEditor->SetUndoGroupMode(false);
         }
    }
Delete pic;

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