![]() |
Problem mit Liste
Hallo,
Ich habe ein Problem mit einer Liste. Sie funktioniert zwar, aber er überschreibt gleiche Namen. Gibt es eine möglichkeit dies zu ändern? Also das er die Namen nicht überschreibt sondern einfach neu anlegt:
Delphi-Quellcode:
Oder muss da einfach ne komplett andre Liste her?
function CompareValues(List: TStringList; Index1, Index2: Integer): Integer;
var value1, value2: integer; begin value1 := StrToInt(List.ValueFromIndex[Index1]); value2 := StrToInt(List.ValueFromIndex[Index2]); if value1 > value2 then Result := 1 else if value1 < value2 then Result := -1 else Result := 0; end; procedure TDemoForm.ClearActionExecute(Sender: TObject); begin VLE.Strings.Clear; end; procedure TDemoForm.RemoveActionExecute(Sender: TObject); begin with VLE do DeleteRow(Row); end; procedure TDemoForm.AddActionExecute(Sender: TObject); begin with VLE do begin Strings.BeginUpdate; Values[NameEdit.Text] := ScoreEdit.Text; TValueListStrings(Strings).CustomSort(CompareValues); Strings.EndUpdate; end; end; procedure TDemoForm.FormCreate(Sender: TObject); begin fileName := ChangeFileExt(ParamStr(0), '.hs'); if FileExists('test.txt') then VLE.Strings.LoadFromFile('test.txt') else VLE.Strings.Clear; end; procedure TDemoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin VLE.Strings.SaveToFile('test.txt'); end; procedure TDemoForm.RemoveActionUpdate(Sender: TObject); begin with Sender as TAction do Enabled := VLE.Strings.Count > 0; end; procedure TDemoForm.ClearActionUpdate(Sender: TObject); begin with Sender as TAction do Enabled := VLE.Strings.Count > 0; end; procedure TDemoForm.AddActionUpdate(Sender: TObject); var i: integer; begin with Sender as TAction do Enabled := (NameEdit.Text <> '') and TryStrToInt(ScoreEdit.Text, i); end; end. mfg |
Re: Problem mit Liste
Nimm ein einfaches .Add/.Append/.Insert Hier wird ja überprüft, ob schon vorhanden
|
Re: Problem mit Liste
Es soll ja auch noch geordnet werden
|
Re: Problem mit Liste
setze
Delphi-Quellcode:
und es sollte ne sortierte liste sein ;-)
liste.sort := true;
|
Re: Problem mit Liste
sorted := true; :)
|
Re: Problem mit Liste
ja sorry richtig ;-)
|
Re: Problem mit Liste
Und wie mache ich es dort, dass er mir dies in eine txt file schreibt :gruebel:
|
Re: Problem mit Liste
.SaveToFile()
|
Re: Problem mit Liste
Und das als TListBox, TStringList oder auch als VLE?
|
Re: Problem mit Liste
Was meinst du mit VLE?
|
Re: Problem mit Liste
Wo oben auch im Quellcode benutzt ist: ValueListEditor
|
Re: Problem mit Liste
Hä? Hast du doch schon ->
Delphi-Quellcode:
:gruebel:
procedure TDemoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin VLE.Strings.SaveToFile('test.txt'); end; |
Re: Problem mit Liste
Wie gesagt in diesem Quellscode überschreibt er mir:
z.B:
Delphi-Quellcode:
Wenn ich nun nocheinmal den Namen Test habe überschreibt er mir den Wert, dies will ich aber nicht. Es sollte dann z.B so sein:
Name Wert
Test 5
Delphi-Quellcode:
Test 5
Test 10 |
Re: Problem mit Liste
Du meinst beim Laden von der Datei hast du 2x "Test" in der Liste stehen, obwohl du nur 1x haben willst?
Wo kommt die Datei her? Hast du die selbst angelegt? Wenn ja, warum speicherst du dann 2x "Test"? Wenn nein und die Datei vorgegeben ist, musst du halt nach dem Laden noch manuell filtern ... oder sie manuell Speichern. Sorry, quark ... verlesen :wall: Naja, dann speicher die Liste halt manuell. ;) |
Re: Problem mit Liste
Das Speichern geht ja. Es geht mir ja nur darum, dass er die Namen nicht überschreibt. Nur weis ich nicht ob ich das mit diese VLE hinbekomme oder eher mit TListBox oder TStringList :gruebel:
|
Re: Problem mit Liste
Normalerweise sollte .SaveToFile in dem Falle schon so speichern, dass es jeden Eintrag in der Liste auch in die Datei schreibt.
Es sei denn, es ist so implementiert, dass zB dupletten nicht gespeichert werden. In dem Fall versuch mal statt "Test" "Test1" oder so. Deswegen meinte ich ja, dass du die Liste halt manuell speichern sollst, weil du da ja selber steuern kannst, was du wie speichern willst. |
Re: Problem mit Liste
Nicht beim Speichern tut er dies, sondern IM Programm IN der Liste schon. Dies ist ja mein Problem. Wenn ich dort den Add Button drücke, Überschreibt er den Wert mit dem gleichen Namen.
|
Re: Problem mit Liste
Ah, so langsam wird ein Schuh draus. :D
Wenn DAS dein Add-Code ist, dann sollte aber schon klar werden, warum er überschreibt, oder?
Delphi-Quellcode:
procedure TDemoForm.AddActionExecute(Sender: TObject);
begin with VLE do begin Strings.BeginUpdate; Values[NameEdit.Text] := ScoreEdit.Text; // << -- er kann nix anderes machen, ausser überschreiben TValueListStrings(Strings).CustomSort(CompareValues); Strings.EndUpdate; end; end; |
Re: Problem mit Liste
Das dachte ich mir, deswegen fragte ich ja ob ich dies deswegen in einer TListBox oder TStringList machen sollte anstatt in diesem VLE oder was ich sonst machen könnte :roll:
|
Re: Problem mit Liste
Hat doch mkinzler schon vorgeschlagen?
Zitat:
Mit VLE kenn ich mich nicht aus. Wenn die so konzipiert ist, dass du keine Werte mit gleichen Namen (was auch Sinn macht) eintragen kannst, dann ja: Nimm eine TStringList oder TList. |
Re: Problem mit Liste
Oki danke, nur wie mache ich eine TStringList? Find ich einfach nicht. Das einzigste was ich habe ist eine TStringGrid :?
EDIT: In TList geht add auch irgendwie nicht :wall:
Delphi-Quellcode:
[Fehler] Unit1.pas(32): E2035 Nicht genügend wirkliche Parameter
procedure TForm1.Button1Click(Sender: TObject);
var List: TListBox; begin List:=TListBox.Create; try List.Add(Edit1.Text); finally List.Free; end; end; [Fehler] Unit1.pas(34): E2003 Undefinierter Bezeichner: 'Add' |
Re: Problem mit Liste
TStringList ist nicht visuell. Entweder gleich 'ne TListBox oder (was besser ist) Code und Ausgabe trennen.
Delphi-Quellcode:
Edit:
uses Classes;
var mySL: TStringList; begin mySL := TStringList.Create; mySL.AddObject ('Test', TObject (5)); mySL.AddObject ('Test1', TObject (10)); mySL.AddObject ('Test2', TObject (7)); ListBox1.Assign (mySL); FreeAndNil(mySL); showmessage (inttostr (Integer (ListBox1.Objects[0]))); // 5 showmessage (inttostr (Integer (ListBox1.Objects[1]))); // 10 showmessage (inttostr (Integer (ListBox1.Objects[2]))); // 7 end; // ungetestet TList ist keine TListBox. ;) Die ListBox musste aus dem Komponenten-Reiter "Standard" auf deine Form ziehen. |
Re: Problem mit Liste
[Fehler] Unit1.pas(7): E2004 Bezeichner redefiniert: 'Classes'
:roll: Ich hab bei Standard nur eine TListBox drin :| Ehm ja, verlesen. Hab ne TListBox drin aber wie gesagt dort kommt der Fehler :roll: |
Re: Problem mit Liste
Bitte nicht ganz so hilflos. ;)
Entferne halt das "uses Classes" wieder, scheinbar wird die Unit oben schon eingebunden. Edit: Ja, TList wäre auch nicht visuell. TListBox - kann man mal so grob sagen - ist die visuelle Implementierung von TList/TStringList. |
Re: Problem mit Liste
Argh sry, steht ja schon drin (Classes).
Nun bekomme ich trozdem ein Fehler ab: ListBox1.Assign (mySL); [Fehler] Unit1.pas(31): E2003 Undefinierter Bezeichner: 'ListBox1' [Fehler] Unit1.pas(31): E2008 Inkompatible Typen [Fehler] Unit1.pas(36): E2029 ')' erwartet, aber Bezeichner 'Objects' gefunden [Fehler] Unit1.pas(39): E2029 '.' erwartet, aber ';' gefunden [Fataler Fehler] Project1.dpr(5): F2063 Verwendete Unit 'Unit1.pas' kann nicht compiliert werden Ich hab doch ne ListBox1 :( |
Re: Problem mit Liste
Du wirst wahrsch. versuchen, den Code nicht als Methode deiner Form1 auszuführen? Also du hast ihn wahrsch. kopiert und unten vor das end. oder so gesetzt. Das geht net ... ;)
Der Code muss in deiner Klasse sein. Also am besten 'n Button auf die Form machen, Doppelklick und dort den Code dann (inkl. var) rein. |
Re: Problem mit Liste
Hab mir doch gedacht das dort was nicht stimmt xD
Gut nu hab ich es in: procedure TForm1.Button1Click(Sender: TObject); rein Nu bekomme ich jedoch nen Fehler bei: showmessage (inttostr (Integer (ListBox1.Objects[0]))); // 5 showmessage (inttostr (Integer (ListBox1.Objects[1]))); // 10 showmessage (inttostr (Integer (ListBox1.Objects[2]))); // 7 [Fehler] Unit1.pas(42): E2003 Undefinierter Bezeichner: 'Objects' entferne ich diese paar Zeilen, starte und drücke den button: *Im Projekt Project1.exe ist eine Exception der Klasse EConvertError mit der Meldung 'TStringList kann nicht zu TListBox zugewiesen werden' aufegtreten.* *seufz* Och Manno :cry: edit: mit diesem mysl kenne ich mich gar nich aus :( |
Re: Problem mit Liste
1.) Statt ListBox1.Objects ListBox1.Items.Objects
2.) Statt ListBox1.Assign (mySL) ListBox1.Items.Assign (mySL) Wenn du dich womit nicht ausgekennst, mit Cursor rein und F1 drücken. ;) |
Re: Problem mit Liste
Wenn ich in der Hilfe mySL eingebe zeigt er mir gar nix an :(
Nun gehts ^^ Nur sind die nicht nach dem Wert sortiert :( Habs damit auch getestet:
Delphi-Quellcode:
Sortiert nur nichts
procedure TForm1.Button1Click(Sender: TObject);
begin mySL := TStringList.Create; ListBox1.Sorted:=True; mySL.AddObject ('Test', TObject (5)); mySL.AddObject ('Test1', TObject (10)); mySL.AddObject ('Test2', TObject (7)); ListBox1.Items.Assign(mySL); |
Re: Problem mit Liste
"mySL" ist auch kein Delphi-Element sondern eine Variable vom Typ TStringList. Dazu findest du was in der Hilfe. Ich hätte sie statt "mySL" auch "foobar" nennen können. ;)
Sortiert wird die Liste. Nur halt nach dem Text. Wenn du die Liste nach den Werten sortieren willst, musst du auch wieder per Hand ran. Element nach Element auslesen, vergleichen, ggf. tauschen. Stichworte: Bubblesort, ![]() |
Re: Problem mit Liste
Das sieht jetzt deutlich komplizierter aus :gruebel: Naja werde es mal anscheun vll bekommeich das ja hin.
Achja ich hätte da noch eine Frage zu mySL.AddObject ('Test', TObject (5)); Den Namen Test kann ich ja auch mit einem Wert eines EditBox versehn, ist dies auch bei dem TObject(5) möglich? Also das ich diesen Wert mittels einer Zahl in einer anderen EditBox eingebe? Denn mit mySL.AddObject ('Test', TObject (Edit1.Text)); Gibt er mir einen Wert aus: 9977808 (Edit1.Text=4) |
Re: Problem mit Liste
Die Zahl die er dir ausgibt, ist wohl die Adresse des TEdit oder so.
Denn du "type castest" "TEdit.Caption" (vom Typ TCaption, Zeichen) nach TObject (Integer-Wert). Das klappt so nicht. Wenn du das machen willst, musst du da noch eine Umwandlung von Edit1.Text nach Integer (inttostr, F1) machen. |
Re: Problem mit Liste
Mit dem InToStr weis ich schon, nur habe ich das getestet:
Delphi-Quellcode:
und da kommt gleich ein Fehler
mySL.AddObject ('Test', TObject (IntToStr(Edit1.Text)));
[Fehler] Unit1.pas(34): E2250 Es gibt keine überladene Version von 'IntToStr', die man mit diesen Argumenten aufrufen kann Deswegen fragte ich :/ |
Re: Problem mit Liste
Edit.Text ist auch schon ein String:
Delphi-Quellcode:
mySL.AddObject ('Test', TObject (Edit1.Text));
|
Re: Problem mit Liste
Dann bekomme ich ja 9977808 raus für Edit1.Text=4 und nicht 4
|
Re: Problem mit Liste
Warum willst du auch einen String in ein Objekt casten? Nimm doch .Add( )
|
Re: Problem mit Liste
Delphi-Quellcode:
so?
mySL.Add ('Test', (Edit1.Text));
Gibt aber auch ein Fehler: [Fehler] Unit1.pas(34): E2034 Zu viele Parameter |
Re: Problem mit Liste
Die IDE zeigt dir doch die erwarteten Parameter an
|
Re: Problem mit Liste
Aber dann habe ich doch keine Zahl mehr die ich zum sotieren benutzen kann :?:
|
Re: Problem mit Liste
Sorry, StrToInt wars.
Mit Add kannst du nur einen Text hinzufügen. Er will aber Text + Wert. Versuchs mal so:
Delphi-Quellcode:
procedure TForm1.Button1Click (Sender: TObject);
var i: Integer; begin if not TryStrToInt (Edit1.Text, i) then Exit; mySL.AddObject ('Test', TObject (i)); // ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 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