Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ListBox Delimiter (https://www.delphipraxis.net/98174-listbox-delimiter.html)

newuser01 22. Aug 2007 16:28


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:

marabu 22. Aug 2007 17:03

Re: ListBox Delimiter
 
Hallo Holger,

dein Beispiel zielt ja eher auf Name-Value-Paare, das geht auch einfacher:

Delphi-Quellcode:
procedure Tfrm_main.ListBoxClick(Sender: TObject);
begin
  with Sender as TListBox do
    ShowMessage(Items.ValueFromIndex[ItemIndex]);
end;
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.

Grüße vom marabu

newuser01 22. Aug 2007 17:05

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:

marabu 22. Aug 2007 18:14

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

newuser01 26. Aug 2007 13:28

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:

marabu 26. Aug 2007 14:54

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:
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

newuser01 26. Aug 2007 20:09

Re: ListBox Delimiter
 
Zitat:

Übrigens hast du in deinem Profil D5 stehen, aber D5 kennt die Eigenschaft DelimitedText noch nicht
ich benutze zur Zeit TurboDelphi

Zitat:

Schande über den, der aufgehört hat zu lernen, weil er alles zu wissen glaubt
ich habe nicht aufgehört zu lernen und ich glaube auch nicht alles zu wissen sonst würde ich bestimmt nicht fragen :mrgreen:


Zitat:

Edit1 und ListBox1 sind keine Objektnamen - die hat die IDE nur als Platzhalter generiert und du solltest sie abändern.
bei mir steht es dann immer so in etwa.
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

marabu 26. Aug 2007 21:03

Re: ListBox Delimiter
 
Hallo Holger,

Zitat:

Zitat von newuser01
... Ich könnte ja den gesamten Codeabschnitt meines Projektes der bei mir funktioniert Posten ...

du hast alles fest im Griff, wie mir scheint. Da du dich selbst in deiner Signatur als Hobby-Programmierer bezeichnest, mag das Ergebnis und nicht der Weg dorthin dich zufrieden stellen.

Zitat:

Zitat von newuser01
... aber ich glaube dann bekommst du graue Haare und erschießt mich

Deine Sorge um meine Haare ist rührend, aber wir gehen schon lange getrennte Wege. Und obwohl ich an der Waffe ausgebildet wurde: Ich bin der Worte mächtig - das reicht in den meisten Fällen.

Viel Spaß noch mit deinem Projekt.

Gute Nacht

newuser01 26. Aug 2007 22:40

Re: ListBox Delimiter
 
Zitat:

du hast alles fest im Griff, wie mir scheint
Nein ! nicht alles, aber es wird schon noch :mrgreen:

Zitat:

mag das Ergebnis und nicht der Weg dorthin dich zufrieden stellen
Genau in erster Linie zählt für mich das Ergebnis. Mir ist schon klar das mein Code in meinen Projekten hier und da mal unübersichtlich ist. Mir ist auch klar das man das ganze um einiges verbessern könnte, da geb ich dir schon Recht. Ich Löse die Probleme eigentlich immer so wie sie mir gerade einfallen hauptsache es funktioniert. Ich kann ja nicht bei jeder Sache hier immer wieder Fragen stellen. Ich Programmiere die meisten sachen frei aus dem Kopf 80% zumindest und wenn ich längere Zeit nichts mache muss ich auch mal nachschlagen. Ich nehme auch gerne Ratschläge von den leuten hier an selbstverständlich auch deine, deswegen kann ich auch die Eußerung "ich scheine alles zu wissen" nicht verstehen.


Zitat:

Deine Sorge um meine Haare ist rührend, aber wir gehen schon lange getrennte Wege
das kenn ich woher :gruebel: :mrgreen:


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