Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi memo in ini speichern (https://www.delphipraxis.net/21821-memo-ini-speichern.html)

Nemesis333 8. Mai 2004 18:26


memo in ini speichern
 
wie kann ich den inhalt eines memofeldes in einer ini datei speichern? ich habe es bereits mit
memo1.lines.savetofile(filename); probiert aber dann speichert er das ganze memo am anfang der ini und es kann mit memo1.lines.loadfromfile(filename); nicht wieder geöffnet werden. wie würdet ihr dies lösen?

toms 8. Mai 2004 18:29

Re: memo in ini speichern
 
Zitat:

wie würdet ihr dies lösen?
Hi,

Gar nicht in eine INI Datei sondern in eine Datei streamen.

Nemesis333 8. Mai 2004 18:38

Re: memo in ini speichern
 
ohje das is glaub ich zu hoch für mich, knntest du mir das ma erklären??

Luckie 8. Mai 2004 18:46

Re: memo in ini speichern
 
Delphi-Quellcode:
Memo1.Lines.SaveToFile(...);

Nemesis333 8. Mai 2004 18:50

Re: memo in ini speichern
 
so hab ichs doch probiert, aber dann speichert er es an den anfang der ini, in der ich noch anderes speichere und ich kann es dann nicht mehr öffnen

Luckie 8. Mai 2004 19:00

Re: memo in ini speichern
 
Du sollst es ja auch nuicht in die Ini speichern. Da ist nach 64k Schluss und du bekommst auch nur die erste zeile rein, es sei denn du schreibst jede Zeile in einen Schlüssel mit TiniFile. Hinzukommt, dass Ini's sehr langsam sind und eingentlich nur dazu gedacht sind, um Programmeinstellungen zu sichern.

Nemesis333 8. Mai 2004 21:04

Re: memo in ini speichern
 
wie mach ich es denn sonst am besten??

S2B 8. Mai 2004 21:05

Re: memo in ini speichern
 
In ne Textdatei speichern! :wink:

fkerber 8. Mai 2004 21:06

Re: memo in ini speichern
 
HI!

Du darfst nur keine Ini als Dateiendung angeben.

Also so:

Delphi-Quellcode:
Memo1.Lines.SavetoFile('datei1.txt');
Ciao fkerber

Nemesis333 9. Mai 2004 08:44

Re: memo in ini speichern
 
kann ich das angeben dass er alles andere in der *.ini speichert und den inhalt des memo in der *.txt ??

alcaeus 9. Mai 2004 08:58

Re: memo in ini speichern
 
Also, mit Memo1.SaveToFile speicherst du nur den Inhalt des Memos ab. Dieser muss in eine Textdatei. Ich versteh nur nicht, was du mit "alles andere" meinst? :gruebel:

Nemesis333 9. Mai 2004 09:46

Re: memo in ini speichern
 
ja ich hab noch mehr eingabefelder und ähnliches, das hab ich aber schon soweit fertig:
Delphi-Quellcode:
if SaveDialog.Execute then
  begin
    filename := SaveDialog.Filename;
    ini := TIniFile.Create(filename);
    try
      ini.writestring('seite1','name',edit124.text);
z.b.
kann man das dann auch so einrichten dass der inhalt des memos in ner text datei gespeichert wird die den selben namen als die ini trägt nur die endung .txt hat??

alcaeus 9. Mai 2004 09:48

Re: memo in ini speichern
 
Ja, mit:
Delphi-Quellcode:
ChangeFileExt(SaveDialog.Filename,'.txt');

Nemesis333 9. Mai 2004 09:54

Re: memo in ini speichern
 
hey cool thx so funktionierts ;) jetzt hab ich nur noch das problem dass ich 2 memos habe und jedes gerne in ein extra file speichern würde besteht da die möglichkeit, dass wenn das ini file hase.ini heißt dass er dann die textfiles hase1.txt und hase2.txt nennt??.
und vor allem wie mache ich es dass er beim laden von hase.ini dann auch denn inhalt aus hase1.txt und hase2.txt in die memos wieder einfügt?

Nemesis333 9. Mai 2004 12:05

Re: memo in ini speichern
 
das mit dem speichern hab ich volgendermaßen gelöst:
Delphi-Quellcode:
memo1.lines.savetofile(ChangeFileExt(FileName,'1.txt'));
aber wie funktioniert daas laden??
Delphi-Quellcode:
memo1.lines.loadfromfile(ChangeFileExt(FileName,'1.txt'));
funktioniert nicht dann will er die ffile 1.txt öffnen

alcaeus 9. Mai 2004 13:44

Re: memo in ini speichern
 
1. Wieso verwendest du als Erweiterung 1.txt? Ist der 1er mit Absicht da?
2. Die Prozedur zum Laden heißt LoadFromFile, dann kommt es immer darauf an, welchen Dateinamen du hast. Wenn du wieder den Dateinamen der ini-Datei hast, dann stimmt dein Funktionsaufruf

Nemesis333 9. Mai 2004 15:40

Re: memo in ini speichern
 
jop der 1er is mit absicht da ;) ich habs schon hinbekommen thx

El Cattivo 26. Apr 2005 19:57

Re: memo in ini speichern
 
Ich wollte mal an diesen Teil anknüpfen und fragen ob es grundsätzlich möglich ist mit einfachen Befehlen wie:
Delphi-Quellcode:
  if savedialog1.execute
    then
      begin
        memo1.lines.savetofile(savedialog1.filename);
      end;
und:

Delphi-Quellcode:
var
  f: textfile;
  text: string;
begin
  if opendialog1.execute then begin
    assignfile(f, opendialog1.FileName);
    reset(f);
    while eof(f)=false do begin
      readln(f, text);
      memo1.lines.add(text);
    end;
    closefile(f);
  end;
auch die Inhalte mehrerer Memo-Felder in einer Datei abzuspeichern und auch wieder in den einzelnen entsprechenen Memo-feldern auszugeben. Oder ist das überhaupt möglich und was für Befehle braucht man dafür, wenn es mit den oben genannten nicht geht?

SirThornberry 26. Apr 2005 20:07

Re: memo in ini speichern
 
mal zur ursprünglichen Frage welche auch die antwort auf die neue frage beinhaltet. Die kannst auch den Inhalt des memos in Hex-Zeichen wandeln und dann in die Ini speichern. Allerdings solltest du dabei beachten das der HexString doppelt so lang ist wie der Inhalt des Memos in Klarschrift

El Cattivo 26. Apr 2005 20:22

Re: memo in ini speichern
 
Wie würde das denn konkret an nem Beispiel aussehen? Wenn man z.B. in memo1 die Namen und in memo2 die dazugehörigen Alter stehen hat. Ich habe ehrlich gesagt nicht viel Ahnung davon. Ich könnte zwar ein memo in einer Textdatei speichern, aber mit ini hatte ich noch nicht zu tun. Aber scheinbar geht es nur damit. Wäre es möglich mir ein Beispiel zu geben woraus ich erkennen kann, wie ich es auf mein Programm anwenden kann?

jfheins 26. Apr 2005 20:26

Re: memo in ini speichern
 
Ganz simple Lösung:
Datei sieht so aus:
Code:
11
12
Hallo
WeltIch bin da !
Also
Code:
Länge Memo1
Länge Memo2
<Inhalt Memo1><Inhalt Memo2>
:wink:

SirThornberry 26. Apr 2005 20:36

Re: memo in ini speichern
 
und falls man doch die memos in die ini packen will:
Hilfsfunktion
Delphi-Quellcode:
function ConvStrToHex(AStr: String): String;
var LGiveback, LStr: String;
    LCount: Integer;
begin
  setlength(LGiveback, length(AStr) * 2);
  for LCount := 1 to length(AStr) do
  begin
    LStr := IntToHex(Byte(AStr[LCount]), 2);
    move(LStr[1], LGiveback[(LCount - 1) * 2 + 1], 2);
  end;
  result := LGiveback;
end;

function ConvHexToStr(AHex: String): String;
var LGiveback: String;
    LCount: Integer;
begin
  setlength(LGiveback, Trunc(length(AHex) / 2));
  for LCount := 0 to length(LGiveback) - 1 do
    LGiveback[LCount + 1] := Char(StrToInt('$' + AHex[LCount * 2 + 1] + AHex[LCount * 2 + 2]));
  result := LGiveback;
end;
so wird in die Ini-Datei gespeichert
Delphi-Quellcode:
ini.WriteString('Section', 'MemoInhalt', ConvStrToHex(Memo1.Text));
und so wirds wieder ausgelesen
Delphi-Quellcode:
Memo1.Text := ConvHexToStr(ini.ReadString('Section', 'MemoInhalt', ''));

NicoDE 26. Apr 2005 20:38

Re: memo in ini speichern
 
Zitat:

Zitat von SirThornberry
Die kannst auch den Inhalt des memos in Hex-Zeichen wandeln und dann in die Ini speichern.

TStrings.CommaText dürfte noch einfacher sein...
Delphi-Quellcode:
uses
  IniFiles;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')) do
    try
      WriteString('Test', 'Memo1', Memo1.Lines.CommaText);
      UpdateFile;
    finally
      Free;
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')) do
    try
      Memo1.Lines.CommaText := ReadString('Test', 'Memo1', EmptyStr);
    finally
      Free;
    end;
end;

SirThornberry 26. Apr 2005 20:40

Re: memo in ini speichern
 
@NicoDE: Da muss ich dich leider enttäuschen. Zum Beispiel sind in einer Ini führende Leerzeischen nicht erlaubt und auch einige Sonderzeischen nicht. Wenn ich mich recht entsinne werden auch mehrere Leerzeischen hintereinander zu einem Leerzeichen.
Wenn du also den Inhalt des Memos speicherst wo 2 Leerzeischen hintereinander auftreten kannst du dann beim laden das pech haben das nur noch eines der beiden leerzeischen vorhanden ist.

NicoDE 26. Apr 2005 20:48

Re: memo in ini speichern
 
Zitat:

Zitat von SirThornberry
@NicoDE: Da muss ich dich leider enttäuschen. Zum Beispiel sind in einer Ini führende Leerzeischen nicht erlaubt und auch einige Sonderzeischen nicht. Wenn ich mich recht entsinne werden auch mehrere Leerzeischen hintereinander zu einem Leerzeichen.
Wenn du also den Inhalt des Memos speicherst wo 2 Leerzeischen hintereinander auftreten kannst du dann beim laden das pech haben das nur noch eines der beiden leerzeischen vorhanden ist.

Bei Leerzeichen setzt CommaText die betreffen Zeilen in Hochkommata...
Code:
Memo1="  foo","bar  "

SirThornberry 26. Apr 2005 20:57

Re: memo in ini speichern
 
probiere mal
Delphi-Quellcode:
  LIni.WriteString('Section', 'memotext', Memo1.Lines.CommaText);
  Memo1.Lines.CommaText := LIni.ReadString('Section', 'memotext', '');
wenn in Memo1 folgendes steht
Code:
textteil1   textteil nach 3 leerzeichen
danach steht in Memo1 bischen was anderes, und zwar genau dieser Text aber jedes wort auf einer neuen zeile

NicoDE 26. Apr 2005 21:02

Re: memo in ini speichern
 
Nö, mein Code funktioniert mit dem Text (Delphi 6 PE, Delphi 9 PE).

SirThornberry 26. Apr 2005 21:05

Re: memo in ini speichern
 
stimmt, da ist in meinem Testprojekt wohl irgendwas schief gegangen :oops:

Nicolai1234 26. Apr 2005 21:08

Re: memo in ini speichern
 
So sollte es auf jeden Fall gehen:
Delphi-Quellcode:
//zum speichern:
//ini.writestring('Name','Schlüssel',MemoToHexString(memo1);
//und zum laden:
//Memo1.lines.commatext := HexStringToMemo(ini.readstring('Name', 'Schlüssel', 'Fehler'))
function MemoToHexString(MEMO: TMemo): string;
function StrToHexString(const s : string):string;
begin
   if s = '' then
      Result := ''
   else
   begin
      SetLength(Result, Length(s)*2);
      BinToHex(PChar(s), PChar(Result), Length(s));
   end;
end;
begin
Result := StrToHexString(MEMO.Lines.CommaText);
end;

function HexStringToMemo(HS: String):string;
function HexStringToStr(s : string):string;
begin
   if s = '' then
      Result := ''
   else
   begin
      if Odd(length(s)) then
         s := '0'+s;
      SetLength(Result, Length(s) div 2);
      HexToBin(Pchar(s), PChar(Result), Length(Result));
   end;
end;
begin
result := hexstringtostr(hs);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz