![]() |
ListBox Delimiter
Folgendes Problem:
Delphi-Quellcode:
procedure Tfrm_main.ListBox1Click(Sender: TObject);
var i: Integer; sl:TStringList; begin //Ich klicke einen Eintrag in der ListBox an und übergebe diesen als Delimitertext zb. "a=Heute ist ein heißer Sommertag" sl := TStringList.Create; for i := 0 to sl.Count - 1 do begin if sl.Selected[i] = true then begin sl.DelimitedText := ListBox1.Items.Strings[i]; end; end; //jetzt übergebe ich das Delimiter-Zeichen sl.CommaText := 'a='; // sl.Delimiter := 'a=' funktioniert leider nicht es kommt die Fehlermeldung "incompatible char string" //und jetzt soll alles was nach dem Delimiterzeichen 'a=' steht an Edit1.Text übergeben werden for i := 0 to sl.Count - 1 do begin Edit1.Text := sl[i]; end; end; //in Edit1 müsste also stehen "Heute ist ein heißer Sommertag" Das ganze funktioniert natürlich nicht :mrgreen: aber vielleicht könnt ihr ja weiterhelfen :gruebel: |
Re: ListBox Delimiter
Hallo Holger,
dein Beispiel zielt ja eher auf Name-Value-Paare, das geht auch einfacher:
Delphi-Quellcode:
Strings.DelimitedText verwendest du, wenn du eine Werteliste in Form eines Strings 'a,b,"c,d",e' in einzelne Strings zerlegen möchtest. Wenn Quote der QuoteChar und Comma der Delimiter ist, dann kannst du gleich CommaText verwenden.
procedure Tfrm_main.ListBoxClick(Sender: TObject);
begin with Sender as TListBox do ShowMessage(Items.ValueFromIndex[ItemIndex]); end; Grüße vom marabu |
Re: ListBox Delimiter
habs gelöst
Delphi-Quellcode:
procedure Tfrm_main.ListBox1Click(Sender: TObject);
var i: Integer; sl:TStringList; s:String; begin sl := TStringList.Create; sl.Delimiter := '='; for i := 0 to sl.Count - 1 do begin if sl.Selected[i] = true then begin sl.DelimitedText := ListBox1.Items.Strings[i]; end; end; for i := 1 to sl.Count - 1 do begin s := s + ' ' + sl.Strings[i]; end; Edit1.Text := s; end; //in Edit1 steht nun "Heute ist ein heißer Sommertag" :mrgreen: |
Re: ListBox Delimiter
Ich muss zugeben, dass ich sehr beeindruckt bin: Mehr als ein halbes Dutzend "Fehler".
Hast du schon versucht den Code zu übersetzen? Nachdenkliche Grüße |
Re: ListBox Delimiter
Du hast Recht schande über mich
Delphi-Quellcode:
procedure Tfrm_main.ListBox1Click(Sender: TObject); var i: Integer; sl:TStringList; s:String; begin sl := TStringList.Create; sl.Delimiter := '='; for i := 0 to ListBox1.Count - 1 do begin if ListBox1.Selected[i] = true then begin sl.DelimitedText := ListBox1.Items.Strings[i]; end; end; for i := 0 to sl.Count - 1 do begin s := s + ' ' + sl.Strings[i]; end; Edit1.Text := s; end; //in Edit1 steht nun "Heute ist ein heißer Sommertag" :mrgreen: so besser ? :mrgreen: |
Re: ListBox Delimiter
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:
Edit1 und ListBox1 sind keine Objektnamen - die hat die IDE nur als Platzhalter generiert und du solltest sie abändern.
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; Übrigens hast du in deinem Profil D5 stehen, aber D5 kennt die Eigenschaft DelimitedText noch nicht. Freundliche Grüße |
Re: ListBox Delimiter
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
//so slTmp1.DelimitedText := lb_Fragen.Items.Strings[i1]; //oder so e_Fragen.Text := s; Ich könnte ja den gesamten Codeabschnitt meines Projektes der bei mir funktioniert Posten, aber ich glaube dann bekommst du graue Haare :mrgreen: und erschießt mich :-D |
Re: ListBox Delimiter
Hallo Holger,
Zitat:
Zitat:
Viel Spaß noch mit deinem Projekt. Gute Nacht |
Re: ListBox Delimiter
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz