Thema: Delphi ListBox Delimiter

Einzelnen Beitrag anzeigen

marabu

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

Re: ListBox Delimiter

  Alt 26. Aug 2007, 14:54
Hallo Holger,

Schande über den, der aufgehört hat zu lernen, weil er alles zu wissen glaubt.

Hast du meinen Code aus Beitrag #2 ausprobiert? Aus deinen Kommentaren habe ich geschlossen, dass er dein Problem löst - und zwar so wie es von den VCL-Machern vorgesehen ist. Natürlich kannst du das gewünschte Ergebnis auch anders erreichen.

Vielleicht hilft es dir, wenn ich deinen Code kommentiere?

Delphi-Quellcode:
procedure Tfrm_main.ListBox1Click(Sender: TObject);
var
  i: Integer;
  // Du deklarierst sl als TStringList, obwohl du keine speziellen Eigenschaften
  // von TStringList verwendest. TStrings wäre dann korrekter.
  sl: TStringList;
  s: String;
begin
  // du legst eine lokale Variable auf dem Heap an und gibst
  // ihren Speicher beim Verlassen der Methode nicht wieder frei
  sl := TStringList.Create;
  // Du willst einen String 'a=Heute ist ein' am Gleichheitszeichen zerlegen,
  // aber eine Leerstelle ist durch eine Implementierungsschwäche des
  // internen Parsers auch ein Delimiter, wenn keine Quotes verwendet werden.
  sl.Delimiter := '=';

  // Du iterierst über die Items der ListBox, obwohl ItemIndex
  // das angeklickte Item benennt
  for i := 0 to ListBox1.Count - 1 do
  begin
    // Das IF-Statement verlangt einen Boolean-Ausdruck und
    // Selected[i] ist ein solcher. Du verkomplizierst diesen
    // durch einen Vergleich mit einer Boolean-Konstante, welche
    // zudem noch implementationsbedingte Probleme mitbringt.
    if ListBox1.Selected[i] = true then
    begin
      // Weil Strings[] die default property der ListBox.Items ist,
      // genügt die Schreibweise ListBox1.Items[i] - liest sich auch besser.
      sl.DelimitedText := ListBox1.Items.Strings[i];
    end;
  end;

  // Du iterierst über eine StringList, welche bei Index 0
  // den Wert vor dem Gleichheitszeichen aufweist und auch nur dann,
  // wenn dieser Wert nicht durch eingeschlossene Leerzeichen mehrfach
  // zerlegt wurde.
  for i := 0 to sl.Count - 1 do
  begin
    // du verkettest alle Strings und ersetzt effektiv alle Delmiter
    // (Gleichheitszeichen und Leerzeichen) durch jeweils ein Leerzeichen.
    // Dabei steht in s ein zufälliger Inhalt, weil du die lokale Variable
    // nicht initialisiert hast.
    s := s + ' ' + sl.Strings[i];
  end;

  Edit1.Text := s;
  // Ausgehend von 'a=Heute ist ein' dürfte jetzt '(zufallsinhalt) a Heute ist ein'
  // in Edit1 angezeigt werden. Selbst wenn der Zufallsinhalt ein Leerstring sein sollte,
  // ist das nicht das, was du eigentlich erwarten solltest.

end;
Edit1 und ListBox1 sind keine Objektnamen - die hat die IDE nur als Platzhalter generiert und du solltest sie abändern.

Übrigens hast du in deinem Profil D5 stehen, aber D5 kennt die Eigenschaft DelimitedText noch nicht.

Freundliche Grüße
  Mit Zitat antworten Zitat