Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem : Schreiben eines Memo1.Text in ein IniFile (https://www.delphipraxis.net/111845-problem-schreiben-eines-memo1-text-ein-inifile.html)

EccoBravo 10. Apr 2008 10:51


Problem : Schreiben eines Memo1.Text in ein IniFile
 
Hallo
nun habe ich folgendes Problem:

Ich schreibe den Inhalt eines mehrzeiligen Memos 'Memo_Fehler' in eine IniFile 'DIni'.

Delphi-Quellcode:
DIni.WriteString('Protokoll', 'Fehler', Memo_Fehler.Text);
Inhalt des 3-zeiligen Memos soll dabei sein:
Delphi-Quellcode:
Dieses ist die 1. Zeile
Dieses ist die 2. Zeile
Schluss
Im IniFile 'DIni' sieht das Ergebnis wie folgt aus:

Delphi-Quellcode:
...
[Protokoll]
Fehler=Dieses ist die 1. Zeile
Dieses ist die 2. Zeile
Schluss
...
...und wenn ich das Memo 'Memo_Fehler' wieder einlese
Delphi-Quellcode:
Memo_Fehler.Text := DIni.ReadString('Protokoll', 'Fehler', EmptyStr);
führt das - wie jeder ahnen kann - zu dem Problem,
daß im Memo 'Memo_Fehler' nur noch die erste Zeile angezeigt wird
Delphi-Quellcode:
Dieses ist die 1. Zeile
Weil im IniFile hinter '...Dieses ist die 1. Zeile' ein Zeilenumbruch erfolgte und
'Dieses ist die 2. Zeile' und 'Schluss' ohne Erklärung dastehen
werden die 2. und 3. Zeile beim Einlesen des IniFiles nicht mehr erkannt
-- und fehlen somit im eingelesenen Memo 'Memo_Fehler'.

Gibt es eine Methode, dieses Dilemma einfach zu umgehen?


Danke

E. B.

mkinzler 10. Apr 2008 10:55

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Ersetzte die Zeilenumbrüche durch andere Zeichen und rekostruiere sie beim Einlesen wieder,

Blackheart 10. Apr 2008 11:13

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
CommaText

calculon 10. Apr 2008 11:41

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Vielleicht hilft dir ja das weiter.

EccoBravo 10. Apr 2008 12:18

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Danke allerseits,
funktioniert wunderbar

Code hängt bei.

Die Wandlung MemoToStr();
Delphi-Quellcode:
function MemoToStr(M: string): string;
var
    i, l: integer;
begin
    l := Length(M);
    for i := 1 to l - 1 do
    begin
        if (M[i] = #13) and (M[i + 1] = #10) then
        begin
            M[i] := '#';
            M[i + 1] := '#';
        end;
    end;
    result:=M;
end;
Die Wandlung StrToMemo();
Delphi-Quellcode:
function StrToMemo(S: string): string;
var
    i, l: integer;
begin
    l := Length(S);
    for i := 1 to l - 1 do
    begin
        if (S[i] = '#') and (S[i + 1] = '#') then
        begin
            S[i] := #13;
            S[i + 1] := #10;
        end;
    end;
    result:=S;
end;
Das Abspeichern eines Memos in ein IniFile
Delphi-Quellcode:
...
DIni.WriteString('Protokoll', 'Fehler', MemoToStr(M_Fehler.Text));
...
Das zurückladen eines Memos aus dem IniFile
Delphi-Quellcode:
...
M_Fehler.Text := StrToMemo(FIni.ReadString('Protokoll', 'Fehler', EmptyStr));
...
Dank und
Grüße

E. B.

Die Muhkuh 10. Apr 2008 12:23

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Gibt allerdings ein Problem, wenn gewollt mal ein ## drin stehen soll.

EccoBravo 10. Apr 2008 13:28

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Danke für den Einwand,
weiss ich, nehme ich in Kauf, will ich so und alle sind informiert.

aber danke


PS.:
Lustiger Name -
Eine Kuh macht Muh - viele Kühe machen Mühe

TonyR 10. Apr 2008 13:28

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Ich hätte dir auch empfohlen, das memo in eine Textdatei zu speichern (die du ja meinetwegen "Datei.INI" nennen kannst).

Alternativ würde ja auch noch gehen die Zeilen einzeln einzuspeichern und in eine eigene Section zu hauen
Code:
[Section]
1=zeile eins
2=zeile zwei
usw.
Da benötigst du aber dann noch eine Routine zum Elemente-zählen der Sections oder ein Extra Eintrag für die Menge der Zeilen :)

Blackheart 12. Apr 2008 19:59

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Man probiert ja einigen Leuten zu helfen aber wenn dann so ein schwachsinn bei rum oder raus kommt. Sorry ich konnt nicht anders.

EccoBravo 30. Apr 2008 09:43

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Hallo, meine Fragerei geht weiter, wenn es nach einiger Leute Meinung auch reiner Schwachsinn ist, aber es gibt auch Leute die bauen Bomben und behaupten, wir Menschen bräuchten diese - Schwachsinn!

Ersterer Code mit dem Tauschen von #13#10 mit irgendwelchen "Pseudozeichen"("##") und das Rücktauschen, alles zum Zwecke, ein mehrzeiliges TMemo in einem IniFile zwischenzulagern funktioniert zur Zufriedenheit. Dafür erst mal - auch trotz der Einwände - vielen Dank!

Aber nun von mir zu gleicher Sache eine vollständige Konsternation, als ich diese Aufgabe zur Ausführung in eine "eigene" Klasse auslagerte.
Der Code ist hier angefügt:

[hier nochmal ausprobiert und Frage ünerarbeitet]

Delphi-Quellcode:
unit EB_Pat_Foto_Satz_U;

interface

uses
    variants, sysutils, classes, contnrs;

type
    TSatz = class(TObject)
    private
        ...
        FNotiz: string;
        ...
        ...
        function GetNotiz: string;
        ...
        procedure SetNotiz(const Value: string);
        ...
    public
        ...
        property Notiz: string read GetNotiz write SetNotiz;
        ...
    end;

implementation

uses EB_Pat_Foto_U, controls;
...

// das lesen und Schreiben in die Ini erfolgt über FNotiz
// also im Hauptprogramm über Satz.Notiz

function TSatz.GetNotiz: string;
begin
    result := StringReplace(FNotiz, '##', #13 + #10, [rfReplaceAll]);
    // damit liesst er nicht richtig in die TMemo zurück
    // ins Memo erhalte ich z.B. "Dieses##ist##ein##Vogel" zurück
    // also keinen Vierzeiler wie erwartet
end;

...

procedure TSatz.SetNotiz(const Value: string);
begin
    FNotiz := StringReplace(Value, #13 + #10,'##', [rfReplaceAll]);
    // damit schreibt er richtig in die Ini
    // Vom Vierzeiler aus dem TMemo
    // gelangt ins Ini z.B.:
    // [Tier]
    // Memo=Dieses##ist##ein##Vogel
end;

...

end.
über die SetNotiz wird das schreibfähige FNotiz richtig erzeugt,
also werden #13#10 gegen ## richtig ausgetauscht um als eine Zeile ins Ini zu gelangen
aber
über GetNotiz werden die Ersatzzeichen ## für die erneute Anzeige im TMemo
nicht zu #13#10 zurückgetauscht, um im TMemo als mehrzeiligen Text anzuzeigen

Habe ich da etwas falsch gemacht oder sie Get... und Set...Methoden nicht richtig verstanden?

Habt vielen Dank für Hilfe

E. B.

EccoBravo 30. Apr 2008 10:26

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Bitte nochmal nachsehen,
ich habe die Frage nach nochmaliger Testung überarbeitet

Danke

E. B.

TonyR 30. Apr 2008 11:33

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Steht in dem Moment, wo du GET aufrufst, überhaupt schon etwas in FNotiz drin???

Obwohl, wenn es leer wäre, dann wäre das Result ja auch leer ...

Dann, wie rufst du das ganze auf (?) wäre noch interessant zu wissen ...

EccoBravo 30. Apr 2008 12:38

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Hallo,

in M_Notiz.OnExit wird der Memo Inhalt in FNotiz geschrieben.

Delphi-Quellcode:
procedure TForm1.MNotizOnExit(Sender:TObject);
begin
    // Hier wird der MemoInhalt in FNotiz geschrieben
    SatzList.Items[SatzNummer].Notiz:=M_Notiz.Text;
end;
Dannach wird beim Neustart des Programmes das IniFile wieder eingelesen

Delphi-Quellcode:
SatzList.Items[SatzNummer].Notiz:=PatIni.ReadString('Bild','Notiz',EmptyStr);
...
M_Notiz.Text := SatzList.Items[SatzNummer].Notiz;
Das ist mein ChaosCode, der mich konsterniert.

Danke

E. B.

tomsel 30. Apr 2008 12:43

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Ja, dann lies dir deinen "ChaosCode" im letzten Post nochmal durch, vor allem den 2. Teil. Fällt da nix auf?

Edit: vergiss es, Irrtum :stupid:

EccoBravo 30. Apr 2008 13:06

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Hallo Tomsel,

ich habe in meinem letzten Code etwas vergessen.
Schau doch mal auf meinem vorherigen Code nach.

Gruß

E. B.

EccoBravo 30. Apr 2008 14:09

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Ich habs,

das Problem ist komplizierter als gedacht:

An diesem Object SatzList.Items[SatzNummer].Notiz hängen noch ein paar mehr Aufrufe als vorhin geschildert, und jedesmal vertauscht er die Zeichen.

So laufen über eine Property Notiz der Traffic mit Form1 und mit den IniFiles:

Delphi-Quellcode:
M_Notiz.Text := SatzList.Items[SatzNummer].Notiz
...
SatzList.Items[SatzNummer].Notiz := M_Notiz.Text

...

SatzList.Items[SatzNummer].Notiz:=PatIni.ReadString('bla', 'bla', EmptyString);
...
PatIni.WriteString('bla', 'bla', SatzList.Items[SatzNummer].Notiz);

Die Lösung:
Alle Zugriffe vom Form1 laufen wie bisher über die Eigenschaft Notiz
also über

Delphi-Quellcode:
SatzList.Items[SatzNummer].Notiz
Für das Speichern und Schreiben der Notiz in ein IniFile habe ich eine extra Property NotizIni geschaffen

Delphi-Quellcode:
SatzList.Items[SatzNummer].NotizIni
die den ganzen Verkehr mit den IniFiles abwickelt.

So kommen sich Form1-Traffic und IniFile-Traffic nicht mehr ins Gehege.

Das sieht so aus:
im Form1:

Delphi-Quellcode:
M_Notiz.Text := SatzList.Items[SatzNummer].Notiz;
...
SatzList.Items[SatzNummer].Notiz := M_Notiz.Text;

...

SatzList.Items[SatzNummer].NotizIni:=PatIni.ReadString('bla', 'bla', EmptyString);
...
PatIni.WriteString('bla', 'bla', SatzList.Items[SatzNummer].NotizIni);
und in der Klasse TSatz ist es wie folgt hinterlegt:

Delphi-Quellcode:
type
    TSatz = class(TObject)
    private
        ...
        FNotiz: string;
        ...
        ...
        function GetNotiz: string;
        function GetNotizIni: string;
        ...
        procedure SetNotiz(const Value: string);
        procedure SetNotizIni(const Value: string);
        ...
    public
        ...
        property Notiz: string read GetNotiz write SetNotiz;
        property NotizIni: string read GetNotizIni write SetNotizIni;
        ...
    end;

implementation

uses EB_Pat_Foto_U, controls;

...

function TSatz.GetNotiz: string;
begin
    result := FNotiz;
end;

function TSatz.GetNotizIni: string;
begin
    result := FNotizIni;
end;

...

procedure TSatz.SetNotiz(const Value: string);
begin
    FNotiz := value;
    FNotizIni := StringReplace(Value, #13 + #10,'##', [rfReplaceAll]);
end;

procedure TSatz.SetNotizIni(const Value: string);
begin
    FNotizIni := value;
    FNotiz := StringReplace(Value, '##', #13 + #10, [rfReplaceAll]);
end;
...

end.
Also vielen Dank fürs Mitdenken!

Fazit ist:
hat man mit einer Property einer Klasse unterschiedlichen Traffic-Bereiche (unterschiedliche Aufgaben) zu versorgen (dann ist es wohl auch nicht mehr eine Property), dann wäre es besser, diese Property in verschiedene Properties aufzuspalten, also für jede Aufgabe eine Property bereitzulegen.
Sicherlich eine Binsenweisheit, aber ich bin stolz, selbst drauf gekommen zu sein.

Also nochmals Danke
E. B.

jaenicke 30. Apr 2008 14:15

Re: Problem : Schreiben eines Memo1.Text in ein IniFile
 
Viel einfacher (und sinnvoller) wäre es, wenn du das Speichern auch tatsächlich innerhalb der Klasse TSatz machst. Dass du ansonsten außerhalb der Klasse TSatz beide Varianten brauchst, ist ja klar.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 Uhr.

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