Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Liste (https://www.delphipraxis.net/103064-problem-mit-liste.html)

Poring 9. Nov 2007 12:37


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:
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.
Oder muss da einfach ne komplett andre Liste her?

mfg

mkinzler 9. Nov 2007 12:43

Re: Problem mit Liste
 
Nimm ein einfaches .Add/.Append/.Insert Hier wird ja überprüft, ob schon vorhanden

Poring 9. Nov 2007 12:47

Re: Problem mit Liste
 
Es soll ja auch noch geordnet werden

lbccaleb 9. Nov 2007 12:48

Re: Problem mit Liste
 
setze
Delphi-Quellcode:
liste.sort := true;
und es sollte ne sortierte liste sein ;-)

madas 9. Nov 2007 12:51

Re: Problem mit Liste
 
sorted := true; :)

lbccaleb 9. Nov 2007 12:52

Re: Problem mit Liste
 
ja sorry richtig ;-)

Poring 9. Nov 2007 12:56

Re: Problem mit Liste
 
Und wie mache ich es dort, dass er mir dies in eine txt file schreibt :gruebel:

mkinzler 9. Nov 2007 12:57

Re: Problem mit Liste
 
.SaveToFile()

Poring 9. Nov 2007 13:03

Re: Problem mit Liste
 
Und das als TListBox, TStringList oder auch als VLE?

mkinzler 9. Nov 2007 13:25

Re: Problem mit Liste
 
Was meinst du mit VLE?

Poring 9. Nov 2007 13:28

Re: Problem mit Liste
 
Wo oben auch im Quellcode benutzt ist: ValueListEditor

Nuclear-Ping 9. Nov 2007 13:53

Re: Problem mit Liste
 
Hä? Hast du doch schon ->

Delphi-Quellcode:
procedure TDemoForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  VLE.Strings.SaveToFile('test.txt');
end;
:gruebel:

Poring 9. Nov 2007 13:58

Re: Problem mit Liste
 
Wie gesagt in diesem Quellscode überschreibt er mir:
z.B:
Delphi-Quellcode:
Name Wert
Test 5
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:
Delphi-Quellcode:
Test 5
Test 10

Nuclear-Ping 9. Nov 2007 14:01

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. ;)

Poring 9. Nov 2007 14:07

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:

Nuclear-Ping 9. Nov 2007 14:11

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.

Poring 9. Nov 2007 14:22

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.

Nuclear-Ping 9. Nov 2007 14:27

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;

Poring 9. Nov 2007 14:30

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:

Nuclear-Ping 9. Nov 2007 14:32

Re: Problem mit Liste
 
Hat doch mkinzler schon vorgeschlagen?

Zitat:

Zitat von mkinzler
Nimm ein einfaches .Add/.Append/.Insert Hier wird ja überprüft, ob schon vorhanden

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

Poring 9. Nov 2007 14:34

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:
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(32): E2035 Nicht genügend wirkliche Parameter
[Fehler] Unit1.pas(34): E2003 Undefinierter Bezeichner: 'Add'

Nuclear-Ping 9. Nov 2007 14:39

Re: Problem mit Liste
 
TStringList ist nicht visuell. Entweder gleich 'ne TListBox oder (was besser ist) Code und Ausgabe trennen.
Delphi-Quellcode:
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
Edit:
TList ist keine TListBox. ;)
Die ListBox musste aus dem Komponenten-Reiter "Standard" auf deine Form ziehen.

Poring 9. Nov 2007 14:45

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:

Nuclear-Ping 9. Nov 2007 14:47

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.

Poring 9. Nov 2007 14:51

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

Nuclear-Ping 9. Nov 2007 14:53

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.

Poring 9. Nov 2007 14:58

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

Nuclear-Ping 9. Nov 2007 15:36

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. ;)

Poring 9. Nov 2007 15:47

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:
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);
Sortiert nur nichts

Nuclear-Ping 9. Nov 2007 16:06

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, Quicksort, ...

Poring 9. Nov 2007 16:13

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)

Nuclear-Ping 9. Nov 2007 16:39

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.

Poring 9. Nov 2007 16:41

Re: Problem mit Liste
 
Mit dem InToStr weis ich schon, nur habe ich das getestet:
Delphi-Quellcode:
  mySL.AddObject ('Test', TObject (IntToStr(Edit1.Text)));
und da kommt gleich ein Fehler
[Fehler] Unit1.pas(34): E2250 Es gibt keine überladene Version von 'IntToStr', die man mit diesen Argumenten aufrufen kann

Deswegen fragte ich :/

mkinzler 9. Nov 2007 16:47

Re: Problem mit Liste
 
Edit.Text ist auch schon ein String:
Delphi-Quellcode:
mySL.AddObject ('Test', TObject (Edit1.Text));

Poring 9. Nov 2007 16:49

Re: Problem mit Liste
 
Dann bekomme ich ja 9977808 raus für Edit1.Text=4 und nicht 4

mkinzler 9. Nov 2007 16:51

Re: Problem mit Liste
 
Warum willst du auch einen String in ein Objekt casten? Nimm doch .Add( )

Poring 9. Nov 2007 16:55

Re: Problem mit Liste
 
Delphi-Quellcode:
mySL.Add ('Test', (Edit1.Text));
so?
Gibt aber auch ein Fehler: [Fehler] Unit1.pas(34): E2034 Zu viele Parameter

mkinzler 9. Nov 2007 17:04

Re: Problem mit Liste
 
Die IDE zeigt dir doch die erwarteten Parameter an

Poring 9. Nov 2007 17:25

Re: Problem mit Liste
 
Aber dann habe ich doch keine Zahl mehr die ich zum sotieren benutzen kann :?:

Nuclear-Ping 9. Nov 2007 17:26

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.
Seite 1 von 2  1 2      

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