Memo/RichEdit i \n

dział ogólny

Memo/RichEdit i \n

Nowy postprzez shycat » piątek, 29 sierpnia 2008, 13:33

Witam, pisze sobie malutką baze danych, w ktorej dane zapisywane sa do pliku "ini", jedno z wpisywanych pol to Memo i musze zamienic jakos "entery" na \n albo na cos innego i potem podczas wczytania danych z pliku z powrotem zamienic \n na [entery], ale kompletnie nie wiem jak ugryzc cos takiego, eh :/
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Memo/RichEdit i \n

Nowy postprzez Cyfrowy Baron » piątek, 29 sierpnia 2008, 14:20

...ale to już było...

► patrz serwis: Cyfrowy Baron dział: porady | TRichEdit & Memo | zapisywanie zawartości Memo do pliku *.ini
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: Memo/RichEdit i \n

Nowy postprzez shycat » piątek, 29 sierpnia 2008, 16:56

ops, faktycznie, przepraszam i dziekuje za odp.
Avatar użytkownika
shycat
Homos antropiczny
Homos antropiczny
 
Posty: 51
Dołączył(a): środa, 20 sierpnia 2008, 12:37
Lokalizacja: Śląsk
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder 2006, Delphi 7
Gadu Gadu: 26712716
    NieznanyNieznana

Re: Memo/RichEdit i \n

Nowy postprzez wargo » piątek, 29 sierpnia 2008, 19:25

Ale to chyba nie o to chodziło tylko o obsługę \n ?? :)
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Memo/RichEdit i \n

Nowy postprzez Cyfrowy Baron » piątek, 29 sierpnia 2008, 21:45

w tej poradzie właśnie o tym jest, ale nie myl char z AnsiString.
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: Memo/RichEdit i \n

Nowy postprzez kinio » środa, 3 września 2008, 16:09

Cześć

Być może też źle Cię zrozumiałem, ale jeżeli nie jest to tak jak opisał CB to pewnie chcesz w pliku ini zapisać pewną wartość która jest umieszczona np. w obiekcie Memo. Np jest to tekst jakiegoś dłuższego opisu i teraz Ty chcesz zapisać np.
description=tekst z memo z zaznaczonymi znakami nowej linii

Jeżeli dobrze rozumie to sprawa jest prosta. Jako znak który może być odpowiednikiem nowej linii wybieramy inny który zazwyczaj nie będzie używany, bądź trudno jest go wprowadzić z klawiatury. Może to być np. Ů. Można go uzyskać uruchamiając klawiaturę alfanumeryczną, i przytrzymując klawisz alt lewy, lub prawy wstukać 222 na klawiaturze alfanumerycznej.

Teraz podam dwie funkcje które konwertują zawartość klasy TStrings używanej przez Memo, RichEdit, ListBox do przechowywania treści na jednolinijkowy łańcuch znaków i odwrotnie:
Funkcja która tworzy i zwraca jeden ciąg znaków z treści przechowywanej w Memo:
Kod: Zaznacz cały
String __fastcall TForm1::toString(TStrings* _strs)
{
     String res = "";
     for(int i=0;i<_strs->Count;++i)
          res += _strs->Strings[i] + "Ů";

     return res;
}

oraz odpowiadająca jej funkcja odwrotna:
Kod: Zaznacz cały
void __fastcall TForm1::fromString(String _src, TStrings* _dest)
{
     _dest->Clear();

     int pos = _src.Pos("Ů");
     while(pos > 0)
     {
          String sstr = _src.SubString(1, pos-1);
          _src = _src.Delete(1, pos);
          _dest->Add(sstr);
          pos = _src.Pos("Ů");
     }
}

Użycie tych funkcji wygląda tak:
Kod: Zaznacz cały
String one_line = toString(Memo1->Lines);

oraz odwrotnie:
Kod: Zaznacz cały
fromString(one_line, Memo1->Lines);


Mam nadzieje że dobrze zrozumiałem i coś ten post pomoże.

Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Memo/RichEdit i \n

Nowy postprzez Cyfrowy Baron » środa, 3 września 2008, 17:05

Nie wiem o czym właściwie dyskutujecie, skoro podałem już rozwiązanie w serwisie i tam do memo tekst jest zapisywany z łamaniem linii.

Przykład wpisu w pliku INI:

[SEKCJA}
Value=EUROPA UNIVERSALIS to strategia czasu rzeczywistego, odtwarzająca historię świata od Wieku Odkryć (1492) po nastane ery Napoleona (1792). Kombinacja czasu rzeczywistego, gra w trybie sieciowym i historyczna dokładność - to wszystko czyni Europa Universalis unikalną w swoim gatunku. Gracz kontroluje jedną z głównych sił epoki, jak np. Hiszpanię, Anglię, Prusy, Francję, Portugalię czy Polskę. W sumie w grze jest ponad 75 państw, które kontrolowane są przez gracza lub sztuczną inteligencję. Gra zawiera ponad 2000 faktycznych, historycznych osobistości i wydarzeń, co w rezultacie zapewnia całkowicie wciągający i wiarygodny świat.\nGracz lub gracze kontrolują większość funkcji swoich krajów jak np. prowadzenie wojen, ekonomię czy dyplomację. Budują i komenderują flotami i armiami, odkrywają nowe lądy przy pomocy podróżników i konkwistadorów, eksploatują w celach własnych lub handlowych surowce naturalne, i zakładają sojusze, aby rozpocząć lub zapobiec wojnie, przesunąć wojska lub uzyskać wsparcie finansowe.\n\nJednakże władza gracza nie jest nieskończona, a historyczne zdolności - lub ich brak - monarchów danego państwa wpływają na szanse zwycięstwa.\n\nNajważniejsze cechy:\n\n- - historyczna gra RTS oparta na dziesięciu latach badań;\n- - możesz zdobyć bogactwo i chwałę grając Polską, Francją, Anglią, Szwecją, Prusami, Rosją, Hiszpanią, Holandią, Turcją i innymi krajami;\n- - bogate i zaawansowane opcje dyplomacji, ekonomii, wojny, kolonizacji i eksploracji: wszystko oparte na rzeczywistych warunkach historycznych;\n- - historycznie poprawne uniformy, flagi i herby ponad 60 narodów;\n- - ponad 700 prowincji do podbicia i kolonizacji;\n- - ponad 150 historycznych wydarzeń i misji;\n- - opcje gry w sieci do 8 graczy po LAN-ie lub Internecie;][41|42|43|$|$][Minimalne wymagania systemowe:|Windows 95/98/ME/2000/XP|Pentium 200 MHz lub odpowiednik|64 MB RAM|karta graficzna 2 MB RAM|Zabezpieczenie: brak|Objętość: 1 CD ROM|Wersja językowa PL.




Jak widać wykorzystywany jest znak łamania linii \n, gdyż po wczytaniu takiego zapisu do Memo nie trzeba go parsować, po prostu Memo rozpoznaje ten znak i w tym miejscu łamie tekst.

Ja też swego czasu pisałem bazę danych dla katalogu gier (mam go do dziś) i żeby sobie uprościć pracę wszystkie wartości zapisywałem wykorzystując klasę TIniFile. Łatwo jest w ten sposób pobierać rekordy i tworzyć nowe.
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: Memo/RichEdit i \n

Nowy postprzez kinio » środa, 3 września 2008, 20:27

Witam!

Tak CB, masz racje porada do której podałeś odnośnik jest jak najbardziej tym samym o czym ja napisałem. Klasa którą w tej poradzie wykorzystałeś TIniFile jest także jak najbardziej przydatna i też proponuje wykorzystanie tej klasy autorowi tego postu. Jednak ja nie pisałem o sposobie zapisu i odczytu danego klucza z/do pliku .ini tylko o konwersji tekstu który jest w tym obiekcie na postać jednego łańcucha znaków i z powrotem, czyli dokładnie tak jak w tej poradzie. Są tam takie dwie funkcje (StrToIniStr, IniStrToStr) z mnóstwem inkremenctacji, pętli, i instrukcji warunkowych a robią w sumie dokładnie to samo co te które przedstawiłem.

Z jednym się tylko nie zgodzę (o ile dobrze zrozumiałem co masz na myśli):
Jak widać wykorzystywany jest znak łamania linii \n, gdyż po wczytaniu takiego zapisu do Memo nie trzeba go parsować, po prostu Memo rozpoznaje ten znak i w tym miejscu łamie tekst.

Ten znak (\n) jest wykorzystany w Twoim sposobie dokładnie tak samo jak Ů w moim przykładzie - do zaznaczenia gdzie tekst ma być złamany. Dopiero dzięki funkcji IniStrToStr, znak \n jest zamieniany na odpowiedni kod ASCII który Memo już rozpoznaje jako znak nowej linii. Natomiast sam ciąg znaków \n nie jest automatycznie rozpoznawany przez obiekt Memo podczas wczytywania z pliku, czy wklejania ze schowka. Nawet kiedy napiszemy
Kod: Zaznacz cały
Memo1->Text = "linia1\nlinia2";
to napis nie pojawi się dwu linijkowy, tylko z dziwnym znakiem w miejscu gdzie tekst powinien być złamany. Przynajmniej tak jest na moim komputerze a to już dyskwalifikuje takie rozwiązanie pod względem uniwersalności. Aby to sprawdzić to wystarczy podany tekst zapisać w pliku i wczytać go do Memo. Bez konwersji przy pomocy danej funkcji nie działa.

Nie wiem czy trafiłem w to co masz na myśli, ale ja to tak odebrałem i szkoda by było aby inni to odebrali w ten sam błędny sposób co ja. Dlatego napisałem co mi na sercu leżało :)

Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Memo/RichEdit i \n

Nowy postprzez Cyfrowy Baron » środa, 3 września 2008, 23:21

Masz rację, mój błąd. Tekst jest parsowany w obie strony. Pisałem tą poradę dość dawno, a dziś do niej nie zajrzałem. Pamiętałem jednak, że w zamyśle miałem, wczytywanie zawartości do Memo bezpośrednio bez parsowania, stąd ten znak łamania lini \n, jednak w trakcie wyszło, że Memo jednak tego nie rozpoznaje i trzeba tekst parsować w obie strony.
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 5 gości