Dynamicznie - LoadFromFile - Access violation
Ostatnio zmodyfikowano 2013-09-04 19:07
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
#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 ); }; }
void __fastcall TForm1::Save1Click( TObject * Sender ) { }
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 ) { }
Edytor_tekstu.h
#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: 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: public: __fastcall TForm1( TComponent * Owner ); void DodajZakladke( TPageControl * APageControl ); };
extern PACKAGE TForm1 * Form1;
#endif
cdocument.cpp
#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
#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 |
|
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).
|
|
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ć 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 |
|
maly |
» 2013-09-04 16:09:28 Skoro masz gotową klasę TDocument to spróbuj ją użyć. |
|
Monika90 |
» 2013-09-04 19:07:46 TRichEdit * RichEdit; RichEdit = new TRichEdit( Zakladka );
Zmienna lokalna. TRichEdit * RichEdit; RichEdit->Lines->LoadFromFile( OpenDialog1->FileName );
Zupełnie inna zmienna lokalna, która nie jest zainicjalizowana. |
|
« 1 » |