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 » |