Thema: Delphi Strings laden

Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Strings laden

  Alt 15. Dez 2005, 06:42
Hallo Doris,

wenn du ein Programm entwickelst, dann achte immer auf eine saubere Trennung von Form und Funktion. Implementiere zuerst die Funktion und überlege dir dann eine angemessene Form der Darstellung. Du hast zwar keine Hintergrundinformationen zu deinem Problem gegeben, aber es lässt sich auch so gut als eine string transformation erkennen. Die Funktion unter Verwendung von TStrings zu implementieren ist da eine gute Entscheidung. In meinem Beitrag #6 wirst du auch bei intensiver Suche keine Hinweise auf visuelle Komponenten entdecken. Ich habe ja auch nur die gesuchte Funktionalität implementiert.

Bei der Visualisierung ist die ListBox eher eine schlechte Wahl, weil gleich mehrere best practices missachtet werden. Zum einen ist die ListBox in erster Linie ein Selektions-Instrument. Die gängigen style guides empfehlen eine sichtbare Anzahl von etwa sieben items - unser Gehirn empfindet diese Informationsdichte als angenehm. Die items müssen semantisch homogen sein - deine sind es nicht (es gibt Indizien dafür). Die Gesamtzahl der items in einer Listbox sollte nicht zu groß sein, aber die Grenzen hängen dabei stark vom implementierten Bedienkomfort ab. Es gibt auch keinen Gestaltungsspielraum bei den items, insbesondere keine Leer-Items. Das folgt direkt aus der Homogenitätsbedingung. Einen Zeilenumbruch gibt es in einem Fließtext, aber nicht in einer Auswahlliste.

Technisch gesehen ist ein Zeilenumbruch in einer StringListe eine Leerzeile und wird mit Strings.Add('') erzeugt. Das Hinzufügen mit Strings.Add(#13#10) erzeugt zwei Leerzeilen, da die StringList #13#10 grundsätzlich als Zeilentrenner verwendet. Das kannst du sehr leicht sehen, wenn du eine leere ListBox und einen Button auf eine TestForm ziehst und im OnClick-Ereignis des Button folgendes machst:

Delphi-Quellcode:
procedure TTestForm.ButtonClick(Sender: TObject);
begin
  with ListBox.Items do
  begin
    Clear;
    Add('make'#13#10'my'#13#10'day');
    // Text := Text;
  end;
end;
Durch das Einfügen eines Zeilenumbrüche enthaltenden Strings mit Add() wird der interne Parser der TStrings-Komponente umgangen. Da die Steuerzeichen #13 und #10 innerhalb eines Strings weder Bedeutung noch einen Graph besitzen, wird der Graph für nicht darstellbare Zeichen ausgegeben. Wenn du die Kommentarzeichen entfernst, dann wird durch erneutes Parsen des Textes jeder Zeilenumbruch erkannt und korrekt umgesetzt.

Die Zeilenumbrüche haben für die StringList eine interne Bedeutung. Wenn du sie unter Umgehung des Parsers hinzufügst, dann sorgst du vorübergehend für eine Inkosistenz in der Darstellung, aber an der Funktionalität änderst du nichts. Mache es also lieber gleich richtig.

Und denke einmal darüber nach, ob eine mehrspaltige Darstellung deiner Daten nicht angemessener wäre. Wenn du aber doch an einer vertikalen Ausgabe festhalten willst, dann ist wohl die Memo-Komponente besser als die ListBox geeignet.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat