TStringList do RichEdit

dział ogólny

TStringList do RichEdit

Nowy postprzez wo! » niedziela, 25 stycznia 2009, 08:08

Witam
Próbuje przekazać tekst bez formatowania z TStringList do RichEdit :
Kod: Zaznacz cały
void __fastcall TStringList_To_RichEdit(TStringList *List,TRichEdit *s)
{
       s->Visible=false;   
       TMemoryStream *X = new TMemoryStream;
   X->Position = 0;
   List->SaveToStream(X);
   X->Position = 0;
   s->Lines->LoadFromStream(X);
   delete X;
   s->Visible=true;
};
{

podobną f-cje zdefiniowałem w drugą strone tj z RichEdit do TStringList i tam wszystko jest OK.
Przy pomocy tej fcji w pewnych liniach RichEdit pojawiają się znaki NULL chociaż wcale niebyły wpisywane do TStringList
co uniemożliwia powtórne przeniesienie tekstu do TStringList, poprostu tekst sie urywa na pierwszym napotkanym NULL-u.
Oczywiscie jest możliwość użycia prostego s->Lines = List; ale w tym wypadku trwa to zdecydowanie za długo, średnio jest do
przepisania 50-100k linii.Próbowałem także włączać/wyłączać PlainText w RichEdit, bez żadnego rezultatu.
Mam nadzieje, że ktoś wie jak rozwiązać ten problem.
Pozdrawiam
Avatar użytkownika
wo!
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 25 stycznia 2009, 07:27
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez Cyfrowy Baron » niedziela, 25 stycznia 2009, 09:26

Lista typy TStringList na każdym końcu linii zawiera znak końca lini. Kontrolka RichEdit potrafi wyświetlać tekst sformatowany dlatego wyświetla również te znaki.
Skoro nie używasz tekstu sformatowanego, zamiast RichEdit użyj Memo.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez wo! » niedziela, 25 stycznia 2009, 16:04

Znak NULL pojawia się w sposób losowy np w osiemsetnej linii i niema związku ze znakiem końca linii. Np dodaje do TStringList text ->Add("Text") 20tyś razy , przepisuje i znak null pojawia się w RichEdit w któreś tam linii. Jeżeli byłoby jak mówisz dotyczyłoby to każdej z linii tekstu. I nie chodzi o sposób wyświetlania to nie jest tu istotne . Przekazanie TStringList->RichEdit a następnie RichEdit->TStringList nie spełnia swojej funkcji bo w pierwszym przekazaniu wystepują błędy.
Pozdrawiam
Avatar użytkownika
wo!
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 25 stycznia 2009, 07:27
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez Cyfrowy Baron » niedziela, 25 stycznia 2009, 18:17

Sprawdziłem ten Twój kod u siebie i nie stwierdziłem tego błędu:

plik nagłówkowy:
Kod: Zaznacz cały
private:
            TStrings *Lista;


plik źródłowy:
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
Lista = new TStringList;
Lista->LoadFromFile(ExtractFilePath(ParamStr(0)) + "plik.txt");
}
//---------------------------------------------------------------------------
void __fastcall TStringList_To_RichEdit(TStrings *List, TRichEdit *s)
{
   s->Lines->Clear();
   TMemoryStream *X = new TMemoryStream;

   X->Position = 0;

   List->SaveToStream(X);

   X->Position = 0;

   s->Lines->LoadFromStream(X);

   delete X;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList_To_RichEdit(Lista, RichEdit1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete Lista;
}
//---------------------------------------------------------------------------


a tutaj masz użyty plik tekstowy:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez wo! » niedziela, 25 stycznia 2009, 19:46

Dziękuje za odpowiedz , wklejam mój kod:
Kod: Zaznacz cały
private:   // User declarations
   TStringList *Lista;


Kod: Zaznacz cały
void __fastcall TStringList_To_RichEdit(TStringList *List,TRichEdit *s)
{
   s->Visible=false;
   s->Clear();
   TMemoryStream *X = new TMemoryStream;
   X->Position = 0;
   List->SaveToStream(X);
   X->Position = 0;
   s->Lines->LoadFromStream(X);
   delete X;
   s->Visible=true;
};
void __fastcall RichEdit_To_TStringList(TRichEdit *s,TStringList *List)
{
   s->Visible=false;
   s->PlainText=true;
   List->Clear();
   TMemoryStream *X = new TMemoryStream;
   X->Position = 0;
   s->Lines->SaveToStream(X);
   X->Position = 0;
   List->LoadFromStream(X);
   delete X;
   s->Visible=true;
};

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   Lista = new TStringList;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Lista->Clear();
double Z = 0;
for(int x=100000;x>0; x--)
{
    Z=Z-1e-6;
    Lista->Add(FloatToStr(Z));
};
TStringList_To_RichEdit(Lista,RichEdit1);
Label1->Caption=IntToStr(RichEdit1->Lines->Count );
RichEdit_To_TStringList(RichEdit1,Lista);
Label2->Caption=IntToStr( Lista->Count);
TStringList_To_RichEdit(Lista,RichEdit1);
Label3->Caption=IntToStr(RichEdit1->Lines->Count );
};
//---------------------------------------------------------------------------


U mnie rezulatat jest taki , że ostatecznie w RichEdit1 znajduje się 831linii , zamiast 100k. I na końcu tej 831szej linii znajduje się w/w znak specjalny.
Znam rozwiÄ…zanie problemu , ale nie jest to rozwiÄ…zanie oparte na TMemoryStream.

Pozdrawiam
Avatar użytkownika
wo!
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 25 stycznia 2009, 07:27
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez Witold » niedziela, 25 stycznia 2009, 20:15

wo! napisał(a):U mnie rezulatat jest taki , że ostatecznie w RichEdit1 znajduje się 831linii , zamiast 100k. I na końcu tej 831szej linii znajduje się w/w znak specjalny.
Znam rozwiÄ…zanie problemu , ale nie jest to rozwiÄ…zanie oparte na TMemoryStream.

Pozdrawiam


U mnie gdy to testowałem, w RichEdit1 znalazło się 100k linii (BCB6 i Turbo C++ 2006).
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez wo! » niedziela, 25 stycznia 2009, 20:31

C++ Builder 2009
Avatar użytkownika
wo!
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 25 stycznia 2009, 07:27
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez wo! » niedziela, 25 stycznia 2009, 20:51

Sprawdziłem to na BCB6 i rzeczywiście jest tak jak powinno być
Avatar użytkownika
wo!
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 25 stycznia 2009, 07:27
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 26 stycznia 2009, 00:12

Przetestowałem Twój kod u siebie (CodeGear RAD Studio C++ Builder 2007) i wszystko jest w normie.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez wo! » wtorek, 27 stycznia 2009, 03:33

Skompilowany projekt Barona w załączniku , niestety nie działa prawidłowo.
Ale chyba temat powinień zostać zamknięty , mimo wszystko to wina Buildera , niedługo zobacze na nowym Update
Pozdrawiam
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
wo!
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 25 stycznia 2009, 07:27
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez wo! » wtorek, 27 stycznia 2009, 03:35

Jeszcze screenshot proforma..
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
wo!
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 25 stycznia 2009, 07:27
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: TStringList do RichEdit

Nowy postprzez Cyfrowy Baron » Å›roda, 28 stycznia 2009, 12:55

To nie tyle błąd środowiska, ile błędne ustawienia środowiska, lub co bardziej prawdopodobne, różnice w bibliotekach, co oznacza, ze trzeba j trochę inaczej stosować.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 11 gości