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 Hint aus ini Datei laden (mehrzeilig) (https://www.delphipraxis.net/183039-hint-aus-ini-datei-laden-mehrzeilig.html)

Satyr 6. Dez 2014 16:04

Hint aus ini Datei laden (mehrzeilig)
 
Huhu,

ich habe eine Anwendung die für verschiedene Fälle verschiedene Hints anzeigen soll. Diese habe ich in eine ini Datei gespeichert. Also:

Code:
[Komponente1]
hint=text

[Komponente2]
hint=text

[Komponente3]
hint=text
Laden möchte ich die Hints dann folgendermaßen:

Delphi-Quellcode:
for I := 1 to 10 do
begin
 TAdvOfficeImage(FindComponent('ring'+inttostr(i))).Hint := ini.ReadString('ring'+inttostr(i), 'hint', '');
end;
Das funktioniert im grunde auch so wie es soll, bis auf eine Sache: Die Hints werden nicht mehrzeilig geladen. Wenn ich im Objektinspektor ein Hint so definiere:

- Punkt 1
- Punkt 2
- Punkt 3

dann werden diese Punkte auch untereinander angezeigt. Aus der ini Datei geladen, fehlt der Break. Also habe ich an entsprechenden Stellen in der ini Datei ein #13#10 gesetzt. Ohne Erfolg, wie Ihr wahrscheinlich schon vermutet. Das #13#10 wird als Teil des zu ladenden Strings gesehen und auch so angezeigt, nicht als Steuerzeichen.

Gibt es eine unkomplizierte Möglichkeit das zu lösen? Ich könnte natürlich per Hand die Hints zurechtrücken. Für alle Komponenten wäre das aber recht aufwändig und das automatische laden aus der ini nicht mehr voll gegeben.

Gruß,
Andreas

Uwe Raabe 6. Dez 2014 16:22

AW: Hint aus ini Datei laden (mehrzeilig)
 
Delphi-Quellcode:
function EncodeMultiLineString(const Value: string): string;
var
  lst: TStringList;
begin
  lst := TStringList.Create;
  try
    lst.StrictDelimiter := true;
    lst.Text := Value;
    result := lst.CommaText;
  finally
    lst.Free;
  end;
end;

function DecodeMultiLineString(const Value: string): string;
var
  lst: TStringList;
begin
  lst := TStringList.Create;
  try
    lst.StrictDelimiter := true;
    lst.CommaText := Value;
    result := lst.Text;
  finally
    lst.Free;
  end;
end;

Satyr 6. Dez 2014 16:37

AW: Hint aus ini Datei laden (mehrzeilig)
 
An sowas in der art dachte ich schon. Nur muss das Programm dann die decodierten einzelstrings für den hint wieder neu zusammenbauen, oder?

Uwe Raabe 6. Dez 2014 16:43

AW: Hint aus ini Datei laden (mehrzeilig)
 
Zitat:

Zitat von Satyr (Beitrag 1282443)
An sowas in der art dachte ich schon. Nur muss das Programm dann die decodierten einzelstrings für den hint wieder neu zusammenbauen, oder?

Nein! Du kannst direkt schreiben (<Control> sinngemäß ersetzen):

Delphi-Quellcode:
ini.WriteString('ring'+inttostr(i), 'hint', EncodeMultiLineString(<Control>.Hint)));

...

<Control>.Hint := DecodeMultiLineString(ini.ReadString('ring'+inttostr(i), 'hint', ''));

Satyr 6. Dez 2014 16:48

AW: Hint aus ini Datei laden (mehrzeilig)
 
Ah, verstehe. Vorher also auch neu abspeichern.
Ich werds gleich (nach dem Abendessen *g*) versuchen. Vielen Dank schon mal :).

himitsu 6. Dez 2014 17:34

AW: Hint aus ini Datei laden (mehrzeilig)
 
Nur um das nochmal genau zu erklären:

In einer INI werden die Zeilenumbrüche zum Trennen der einzelnen Werte benutzt, also ist es nicht möglich Zeilenumbrüche innerhalb einzelner Werte zu verwenden.
Genauso, wie es nicht möglich ist, in den Value-Namen das "=" zu benutzen.

Lösungen:
  • Den gewünschten Text auf mehere Werte auteilen.
    Entweder mit zusätzlicher Zeilenangabe, damit man weiß wieviel man auslesen muß
    oder man liest, bis es nichts mehr zum Lesen gibt (hint4).
  • Die "ungültigen" Zeichen durch gültige Zeichen/Zeichenfolgen ersetzen.
  • Ein anderes Dateiformat benutzen, welches das gewünschte Feature bietet.


z.B.
Code:
[Komponente1]
hint1=Zeile 1
hint2=Zeile 2
hint3=Zeile 3

[Komponente1]
HintZeilen=3
hint1=Zeile 1
hint2=Zeile 2
hint3=Zeile 3

[Komponente1]
hint=Zeile 1,Zeile 2,Zeile 3

[Komponente1]
hint=Zeile 1<br>Zeile 2<br>Zeile 3

Satyr 6. Dez 2014 18:28

AW: Hint aus ini Datei laden (mehrzeilig)
 
So, ich habe es wie empfohlen geändert und es funktioniert wunderbar, vielen dank nochmals :).

Ich würde lügen, wenn ich schreiben würde ich hätte es vollständig verstanden. Ich glaube ich denke manchmal um zu viele Ecken. Für mich sieht es so aus, das die Breaks der ini Datei zwar übergeben wurden (in dieser waren Zeilenumbrüche) aber beim wieder einlesen alles als String übergeben wurde, auch die eigentlichen Steuerzeichen.

Wenn ich es richtig verstehe, setzt die Lösung von Uwe Raabe folgende Lösung um, oder?:

Code:
[Komponente1]
hint=Zeile 1,Zeile 2,Zeile 3
Ich hatte das auch in der Richtung überlegt, allerdings den String deutlich unsauberer auseinander und wieder zusammen gesetzt.

himitsu 6. Dez 2014 23:01

AW: Hint aus ini Datei laden (mehrzeilig)
 
Zitat:

Zitat von Satyr (Beitrag 1282453)
Für mich sieht es so aus, das die Breaks der ini Datei zwar übergeben wurden (in dieser waren Zeilenumbrüche) aber beim wieder einlesen alles als String übergeben wurde, auch die eigentlichen Steuerzeichen.

Die INI-API geht nunmal davon aus, daß der Programmierer es richtig macht und prüft nicht auf ungültige Zeichen, weswegen man eben auch "ungültige" Zeilenumbrüche rein bekommt.
Aber beim Auslesen weiß die API nunmal nicht, daß dort falsche Zeilenumbrüche drin vorkommen und liest die Werte bis zum ersten Zeilenumbruch. :stupid:

Genauso ist es Problemlos möglich eine #0 in einen String reinzumachen, aber bei Übergabe als PChar (z.B. an ein Label oder Memo) ist dort eben Schluß, da #0 eben das Ende angibt.

Oder nimm dir eine TStringList, schreib dort in einen Value einen mehrzeiligen Text ... das funktioniert dort sogar, solange man nicht über .Text zugreift oder den Inhalt in eine Datei speichert und voallem wieder aussliest.

Delphi-Quellcode:
SL.Add('123' + sLineBreak + '456');
//SL.Count = 1
SL.Text := SL.Text;
//SL.Count = 2

Satyr 6. Dez 2014 23:43

AW: Hint aus ini Datei laden (mehrzeilig)
 
Liest sich erschreckend logisch :-D.

Es ist Wahnsinn was ich in diesem Forum alles gelernt habe, seit ich da bin. Ich trage zwar selbst nicht wirklich was bei aber alleine durch ständiges mitlesen, hab ich mehr gelernt als irgendwo sonst, Berufsschule vor einem Jahrzehnt mit eingeschlossen *g*.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:47 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