[Delphi] Tekst uit Richedit opslaan in INI-file

Pagina: 1
Acties:
  • 202 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Ik ben bezig met een programma dat tussentijds een form met oa een x-aantal Richedits moet opslaan. Ik heb gekozen om dit te doen met een INI-file omdat hier makkelijk mee te werken is.

Nu heb ik alleen het probleem dat je in principe alleen een string kunt opslaan in een INI-file en niet, zoals de tekst uit een Richedit is, een TStrings. Nu heb ik al de functie StringsToStr gevonden, maar het nadeel daarvan is dat deze extra "enters" toevoegd. Hij plakt namelijk de verschillende regels van de TStrings aan elkaar en plaats daar een delimiter tussen. Nu plaatst hij altijd een delimiter bij de volgende regel, dus ook als ik geen enter heb gebruikt, maar de regel past gewoon niet op 1 regel in de Richedit.

Met andere woorden: Stel er passen 10 tekens op een regel uit de richedit en ik typ 12 tekens (zonder dat ik op enter druk) dan zullen de laatste twee tekens op de tweede regel komen. De functie StringsToStr zal tussen de eerste 10 tekens en de laatste twee tekens een delimiter teken plaatsen, waardoor het lijkt alsof er een enter tussenstaat. Dat is dus niet de bedoeling, maar het is ook niet de bedoeling dat alle enters verloren gaan. Dus ik kan er ook niet voor kiezen om dan alle enters maar te laten vallen.

Nu zat ik te denken dat als je een TFilestream gebruikt, dat dan de tekst uit een RichEdit ook als 1 lange string wordt weergegeven, en eigenlijk zou ik dat willen opslaan, want dan zou ook de opmaak bewaard blijven (gebruik ik nog niet, maar is voor later wel makkelijk). Ik zat te denken dat ik dat mbv een TMemoryString zou kunnen doen, maar als ik de tekst daarin inlees en vervolgens wegschrijf in de INI-File dan schrijft hij alleen t"A weg en dus altijd dat, dus dat lukt ook niet.

Hoe ga ik het wel voor elkaar krijgen?

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:49

Cyphax

Moderator LNX
Volgens mij kun je de tekst uit die richedit ook als string benaderen, ipv TStrings.
Ik ben er niet 100% zeker van maar het werkt voor een TMemo ook, ik ben er lang geleden ook weleens mee bezig geweest, en ik dacht dat een TRichedit ook een property heeft daarvoor. Ik kan het niet nakijken nu voor je maar kijk het even na.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • Cypher87
  • Registratie: Oktober 2004
  • Laatst online: 12-10 14:42
Ja dat kan met Richedit.text als ik het goed heb

Acties:
  • 0 Henk 'm!

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Nadeel daarvan is weer dat hij alleen alles opslaat tot de enter. Dus als ik wel een enter gebruik, dan slaat hij de dingen erna weer niet op.

Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 21:49

Cyphax

Moderator LNX
Oscar Mopperkont schreef op woensdag 29 december 2004 @ 11:06:
Nadeel daarvan is weer dat hij alleen alles opslaat tot de enter. Dus als ik wel een enter gebruik, dan slaat hij de dingen erna weer niet op.
Misschien moet je die enters gaan escapen ofzo dan, want ze staan wel in de string?

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05 22:30

FendtVario

The leader drives Vario!

Misschien is een INI niet helemaal geschikt om tekst uit een TRichEdit op te slaan. Persoonlijk zou ik de standaard methode SaveToFile gebruiken en eventueel in een INI bestand bijhouden in welke bestanden je de tekst opgeslagen hebt. INI bestanden zijn volgens mij niet gemaakt voor het opslaan van lappen tekst maar voor het opslaan van programma instellingen.

www.fendt.com | Nikon D7100 | PS5


Acties:
  • 0 Henk 'm!

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Ik weet dat een INI er niet voor gemaakt is, maar het is wel makkelijk. Ik zou wel de Richedits kunnen gaan opslaan in aparte files, maar soms heb ik te maken met iets van 60 RichEdits, dan zijn 60 bestanden niet echt een optie

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Nu online

alienfruit

the alien you never expected

Je kan bestand toch zelf ook opslaan :)

TTextualFileName = record
FileName: string[64];
FileContent: string;
end;

Of je zorgt dat je RTF-tekst terug krijgt, dat is volgens mij ook gewoon één lange string :)

[ Voor 28% gewijzigd door alienfruit op 29-12-2004 12:56 ]


Acties:
  • 0 Henk 'm!

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05 22:30

FendtVario

The leader drives Vario!

Je kan natuurlijk ook een subdir maken voor al die bestanden. Maar misschien is dit een mogelijkheid:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure TForm1.Button1Click(Sender: TObject);
var
  tmpStream: TMemoryStream;
begin
  tmpStream := TMemoryStream.Create;
  RichEdit1.Lines.SaveToStream(tmpStream);
  tmpStream.Seek(0, soFromBeginning);

  with TIniFile.Create('c:\temp\test.ini') do
  begin
    WriteBinaryStream('test', 'text', tmpStream);
    Free;
  end;

  FreeAndNil(tmpStream);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  tmpStream: TMemoryStream;
begin
  tmpStream := TMemoryStream.Create;
  with TIniFile.Create('c:\temp\test.ini') do
  begin
    ReadBinaryStream('test', 'text', tmpStream);
    Free;
  end;
  tmpStream.Seek(0, soFromBeginning);
  RichEdit1.Lines.LoadFromStream(tmpStream);

  FreeAndNil(tmpStream);
end;

www.fendt.com | Nikon D7100 | PS5


Acties:
  • 0 Henk 'm!

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
alienfruit schreef op woensdag 29 december 2004 @ 12:56:
Je kan bestand toch zelf ook opslaan :)

TTextualFileName = record
FileName: string[64];
FileContent: string;
end;

Of je zorgt dat je RTF-tekst terug krijgt, dat is volgens mij ook gewoon één lange string :)
Hoe krijg ik de info als 1 lange string? Dus als RTF tekst? Want via zo'n Memorystream lukt dat dus niet. Maar misschien weet jij het?

Acties:
  • 0 Henk 'm!

Verwijderd

Met 60 RichEdits in 1 file is een INI-file ook niet echt een optie...
Delphi gebruikt de standaard Windows routines voor inifiles, en daarmee is de grootte beperkt tot 64K, en dan loop je nogal snel tegen die grens aan.
Ik heb tijden geleden wel een LargeIniFiles unitgemaakt die die beperking niet heeft, en die is hier te vinden. Een door mij aangepaste versie van die unit wordt nu in FreePascal gebruikt als standaard inifiles.pas. :)

Wil je trouwens ook de RTF informatie opslaan? Of alleen de platte tekst?
In het eerste geval lijkt me een INI-file niet echt handig.

Acties:
  • 0 Henk 'm!

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Ik gebruik al de TMemIniFile, die kent de beperking ook niet :)

Maar volgens mij moet je de RTF informatie ook als 1 lange string te krijgen zijn, dat gebeurt immers ook als je gebruik maakt van een SaveToStream.

Acties:
  • 0 Henk 'm!

Verwijderd

Al geprobeerd om 'm te saven naar een TStringStream?

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Nu online

alienfruit

the alien you never expected

Zo doe ik het altijd:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const S_EMPTY = '';

function GetRichText( anEditor: TRichedit ): string;
var
   aStream: TStringStream;
begin
   aStream := TStringStream.Create( S_EMPTY ) ;
   try
     anEditor.PlainText := False; // enable RTF stream
     anEditor.Lines.SaveToStream( aStream ) ;
     
     Result := aStream.DataString; // Contains the contents of the stream in string form
   finally
     aStream.Free
   end;
end;

[ Voor 5% gewijzigd door alienfruit op 29-12-2004 13:35 ]


Acties:
  • 0 Henk 'm!

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Alienfruit _/-\o_

Kan ik nu aan de slag om te kijken of het dan ook weer op te vragen is :)

Acties:
  • 0 Henk 'm!

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Het wordt nu dus netjes opgeslagen in de INI-file, maar ik heb nu twee problemen:

1) Hoe lees ik het weer in. Op de een of andere manier kan hij een string niet inlezen als deze met { begint. Als ik het eerste teken weghaal dan leest hij hem wel (dan doe ik het even als plain text) en laat ik hem staan, dan leest hij niks.

2) Als ik met TMemInifile probeer te werken, dan wordt het bestand niet op schijf opgeslagen. Ik had begrepen, hoewel de naam anders doet vermoeden, dat dat wel het geval zou zijn. Of doe ik iets verkeerd?

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Nu online

alienfruit

the alien you never expected

Mijn excuses voor het schrijven in het Engels, maar ik ben halve avond vragen aan het beantwoorden in nieuwsgroepen, en dit ging automatisch.

You should call the method UpdateFile() of TMemIniFile to store the data to disk.
Beside of that TIniFile is a decendant of the TMemIniFile class, so in theory it works fine ;)

About the problem of the { sign when you try to read back, as you might know the Windows API also supports reading ini files (ReadSection etc.) did you already try that? Because the TIniFile implementation in Delphi doesn't use these APIs for cross-platform compatibility. (my bad)

What you could do is make a new decendant of the TMemIniFile and reimplemtate the ReadString-method, because this is used by all the ReadX methods. This ReadString-method using the stuff of TString.... so probably the problem is their...

Did you know that TIniFile supports writing and reading binary streams? Using the HexToBin and BinToHex methods of Classes.pas

[ Voor 9% gewijzigd door alienfruit op 05-01-2005 00:26 ]

Pagina: 1