Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dynamicznie - LoadFromFile - Access violation

Ostatnio zmodyfikowano 2013-09-04 19:07
Autor Wiadomość
camillo8902
Temat założony przez niniejszego użytkownika
Dynamicznie - LoadFromFile - Access violation
» 2013-09-04 10:31:36
Witam.
Na wstępie chciałbym się przywitać. Mam na imię Kamil i powoli zaczynam raczkowanie w C++.
Na zajęciach dostałem zadanie napisania prostego edytora tekstu przy zastosowaniu fragmentów kodu udostępnionych przez prowadzącego. Edytor ma w dynamiczny sposób otwierać zakładki, wczytywać i zapisywać pliki, a także zliczać wyrazy, znaki itd.
Niestety, utknąłem na pobieraniu tekstu z pliku do utworzonej zakładki i w związku z tym, prosiłbym Was uprzejmie o pomoc.
Mianowicie, kod wygląda następująco:

Edytor_tekstu.cpp

C/C++
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Edytor_tekstu.h"
#include "cdocument.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

int numer_zakladki = 2;

TForm1 * Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1( TComponent * Owner )
    : TForm( Owner )
{
}


void TForm1::DodajZakladke( TPageControl * APageControl )
{
    TTabSheet * Zakladka;
    Zakladka = new TTabSheet( PageControl1 );
    Zakladka->PageControl = PageControl1;
    Zakladka->Caption = "Nowy dokument";
    TRichEdit * RichEdit;
    RichEdit = new TRichEdit( Zakladka );
    RichEdit->Parent = Zakladka;
    RichEdit->Align = alClient;
    RichEdit->ScrollBars = ssBoth;
    RichEdit->BorderStyle = bsNone;
}

void TDocument::LoadFromFile( String AFileName )
{
    FileName = AFileName;
    RichEdit->Lines->LoadFromFile( FileName );
    Caption = ExtractFileName( FileName );
}




//---------------------------------------------------------------------------
void __fastcall TForm1::OpenExecute( TObject * Sender )
{
    if( this->OpenDialog1->Execute() )
    {
        TRichEdit * RichEdit;
        RichEdit->Lines->LoadFromFile( OpenDialog1->FileName );
        //TRichEdit *RichEdit;
        //TTabSheet *Zakladka;
        //RichEdit = new TRichEdit(Zakladka);
       
        //RichEdit->Parent = Zakladka;
        //RichEdit->Lines->LoadFromFile(OpenDialog1->FileName);
    };
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Save1Click( TObject * Sender )
{
    //SaveDialog1->Execute();
    //SaveDialog1->FileName;
    //TRichEdit *RichEdit;
    // Form1->RichEdit->Lines->SaveToFile(SaveDialog1->FileName);
}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
void __fastcall TForm1::New1Click( TObject * Sender )
{
    DodajZakladke( PageControl1 );
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Delete1Click( TObject * Sender )
{
    PageControl1->ActivePage->Free();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::TabSheet_1MouseDown( TObject * Sender, TMouseButton Button,
TShiftState Shift, int X, int Y )
{
    //TComboBox *pCB = dynamic_cast<TComboBox *>(Sender);
    //if (pCB)
    //PageControl1->ActivePage = dynamic_cast<TTabSheet *>(pCB->Items->Objects[pCB->ItemIndex]);
    //PageControl1->ActivePage;
   
    //   PageControl1->ActivePageIndex = TabSheet_1->PageIndex;
}
//---------------------------------------------------------------------------
Edytor_tekstu.h
C/C++
//---------------------------------------------------------------------------

#ifndef Edytor_tekstuH
#define Edytor_tekstuH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <System.Actions.hpp>
#include <Vcl.ActnList.hpp>
#include <Vcl.Menus.hpp>
#include <Vcl.ComCtrls.hpp>
#include <Vcl.Dialogs.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.ActnCtrls.hpp>
#include <Vcl.ActnMan.hpp>
#include <Vcl.ToolWin.hpp>
//---------------------------------------------------------------------------
class TForm1
    : public TForm
{
    __published: // IDE-managed Components
    TActionList * lista_akcji;
    TAction * Open;
    TAction * Save_as;
    TAction * Print;
    TMainMenu * MainMenu1;
    TMenuItem * File1;
    TMenuItem * Open1;
    TMenuItem * Save1;
    TOpenDialog * OpenDialog1;
    TSaveDialog * SaveDialog1;
    TMenuItem * Save2;
    TMenuItem * Print1;
    TPageControl * PageControl1;
    TMenuItem * New1;
    TMenuItem * End1;
    TMenuItem * Edit1;
    TMenuItem * Report1;
    TPopupMenu * PopupMenu1;
    TMenuItem * Delete1;
    TMenuItem * Usedlastly1;
    TStatusBar * StatusBar1;
    TStatusBar * StatusBar2;
    TToolBar * ToolBar1;
    TToolButton * ToolButton1;
    TToolButton * ToolButton2;
   
    void __fastcall OpenExecute( TObject * Sender );
    void __fastcall Save1Click( TObject * Sender );
    void __fastcall New1Click( TObject * Sender );
    void __fastcall Delete1Click( TObject * Sender );
    void __fastcall TabSheet_1MouseDown( TObject * Sender, TMouseButton Button, TShiftState Shift,
    int X, int Y );
   
private: // User declarations
public: // User declarations
    __fastcall TForm1( TComponent * Owner );
    void DodajZakladke( TPageControl * APageControl );
};



//---------------------------------------------------------------------------
extern PACKAGE TForm1 * Form1;

//---------------------------------------------------------------------------
#endif


cdocument.cpp
C/C++
//---------------------------------------------------------------------------

#pragma hdrstop

#include "cdocument.h"
#include "Edytor_tekstu.h"

TDocument::TDocument( TPageControl * APageControl )
    : TTabSheet( APageControl )
{
    PageControl = APageControl;
    Caption = "Nowy dokument";
    RichEdit = new TRichEdit( this );
    RichEdit->Parent = this;
    RichEdit->Align = alClient;
    RichEdit->WordWrap = false;
    RichEdit->ScrollBars = ssBoth;
};


//---------------------------------------------------------------------------
#pragma package(smart_init)


cdocument.h
C/C++
//---------------------------------------------------------------------------

#ifndef cdocumentH
#define cdocumentH

#include "Edytor_tekstu.h"

class TDocument
    : public TTabSheet
{
public:
    TDocument( TPageControl * APageControl );
    __fastcall ~TDocument();
    void LoadFromFile( String AFileName );
    TRichEdit * RichEdit;
    String FileName;
};


extern PACKAGE TDocument * Wczytaj;
//---------------------------------------------------------------------------
#endif

Po kompilacji, nie otrzymuję żadnego błędu, niestety jednak po próbie wybrania Obiektem OpenDialog ścieżki do pliku, otrzymuję komunikat: "Access violation at address 0040365F in module 'Edytor tekstu_zaliczenie.exe'. Read of address 108BC38B."

Byłbym niezmiernie wdzięczny za sugestie i pomoc jak poprawić, by wczytywanie działało na każdej nowoutworzonej zakładce.

Dzięki z góry i pozdrawiam,
Kamil
P-91512
Mitu
» 2013-09-04 12:59:15
Zobacz czy wszystko w porządku ze ścieżką z której otwierasz plik. Czy ścieżka wygląda jak powinna, ewentualnie czy będzie działało jak podasz ścieżkę nie przez zmienną, tylko wpisując ją w cudzysłowie.

U mnie pojawiały się dziwne błędy, okazało się, że musiałem do ścieżki dopisać jeszcze rozszerzenie (ale to akurat przy zapisie).

P-91518
camillo8902
Temat założony przez niniejszego użytkownika
» 2013-09-04 15:39:11
Dzięki za odpowiedź. Zgodnie z zaleceniem spróbowałem bezpośredniego odwołania do konkretnego pliku stosując cudzysłów ale problem pozostał. Spróbowałem również przekleić
C/C++
OpenDialog1->Execute();
RichEdit->Lines->LoadFromFile( OpenDialog1->FileName );
 do void DodajZakladke i podczas dodawania nowej zakladki kazdorazowo pojawia się OpenDialog, także wydaje mi się, że void Wczytaj nie może odnaleźć aktywnej zakładki oraz RichEdit przez co wyskakuje błąd.
Niestety jednak, próbuje i próbuje ale nie potrafię sobie poradzić z problemem, także nadal prosze o pomoc.

Dziekuję i pozdrawiam,
Kamil
P-91525
maly
» 2013-09-04 16:09:28
Skoro masz gotową klasę TDocument to spróbuj ją użyć.
P-91527
Monika90
» 2013-09-04 19:07:46
C/C++
TRichEdit * RichEdit;
RichEdit = new TRichEdit( Zakladka );
Zmienna lokalna.

C/C++
TRichEdit * RichEdit;
RichEdit->Lines->LoadFromFile( OpenDialog1->FileName );
Zupełnie inna zmienna lokalna, która nie jest zainicjalizowana.
P-91545
« 1 »
  Strona 1 z 1