AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hint aus ini Datei laden (mehrzeilig)

Ein Thema von Satyr · begonnen am 6. Dez 2014 · letzter Beitrag vom 7. Dez 2014
Antwort Antwort
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#1

Hint aus ini Datei laden (mehrzeilig)

  Alt 6. Dez 2014, 17:04
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 6. Dez 2014, 17:22
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 6. Dez 2014, 17:37
An sowas in der art dachte ich schon. Nur muss das Programm dann die decodierten einzelstrings für den hint wieder neu zusammenbauen, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#4

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 6. Dez 2014, 17:43
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', ''));
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 6. Dez 2014, 17:48
Ah, verstehe. Vorher also auch neu abspeichern.
Ich werds gleich (nach dem Abendessen *g*) versuchen. Vielen Dank schon mal .
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 6. Dez 2014, 18:34
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 6. Dez 2014, 19:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 7. Dez 2014, 00:01
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.

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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 7. Dez 2014 um 00:05 Uhr)
  Mit Zitat antworten Zitat
Satyr

Registriert seit: 8. Feb 2012
Ort: Essen
305 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Hint aus ini Datei laden (mehrzeilig)

  Alt 7. Dez 2014, 00:43
Liest sich erschreckend logisch .

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*.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 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