Entwickler-Ecke

Sonstiges (Delphi) - ValueListEditor move Problem...


DiamondDog - Mo 22.11.10 13:13
Titel: ValueListEditor move Problem...
Hallo Leute,
ich würde gerne in meinem ValueListEditor Einträge per Buttonklick rauf oder runter verschieben, leider bekomme ich immer den Fehler "Listenindex überschreitet das Maximum". Leider weiß ich nicht genau wo drann das liegen kann, weil meiner Meinung nach der Index nicht überschritten wird.

Hier mal mein Code dazu:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btnAufClick(Sender: TObject);
begin
  if ListEditor1.Row > 1 then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row-1);
  end;
end;

procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < ListEditor1.Strings.Count then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row+1);
  end;
end;


Danke schon mal an alle fürs Helfen.

Mfg Dog


jaenicke - Mo 22.11.10 13:42

user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < ListEditor1.Strings.Count then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row+1);
Was passiert wohl beim letzten Eintrag?


DiamondDog - Mo 22.11.10 13:53

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < ListEditor1.Strings.Count then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row+1);
Was passiert wohl beim letzten Eintrag?

Oh man, ich weiß ungefähr was du mir sagen willst. Bekomm das ganze aber nicht so richtig auf die Kette. Also ich muß doch prüfen ob die ausgewählte Zeile, kleiner ist als das Maximum der Liste oder? Wenn die Listenlänge 5 beträgt und Datei 4 ausgewählt ist, sollte ja alles ok sein oder? Aber neben bei das Raufschieben führt auch immer zu einem Listenindex Fehler.


jaenicke - Mo 22.11.10 13:59

user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:
Also ich muß doch prüfen ob die ausgewählte Zeile, kleiner ist als das Maximum der Liste oder?
Genau, als das Maximum (Length - 1), nicht kleiner als die Anzahl (Length).

Denn das letzte Element ist auch kleiner als das Length, nämlich genau 1 kleiner...


LSanchez - Mo 22.11.10 14:07

richtig wäre:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btnAufClick(Sender: TObject);
begin
  if ListEditor1.Row > 0 then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row-1);
  end;
end;

procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < (ListEditor1.Strings.Count - 1then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row+1);
  end;
end;


Gruß

Luis Sanchez


DiamondDog - Mo 22.11.10 14:14

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDiamondDog hat folgendes geschrieben Zum zitierten Posting springen:
Also ich muß doch prüfen ob die ausgewählte Zeile, kleiner ist als das Maximum der Liste oder?
Genau, als das Maximum (Length - 1), nicht kleiner als die Anzahl (Length).

Denn das letzte Element ist auch kleiner als das Length, nämlich genau 1 kleiner...

ListEditor1.Row ist doch der ausgewählte Eintrag oder seh ich da was falsch?


user profile iconLSanchez hat folgendes geschrieben Zum zitierten Posting springen:
richtig wäre:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.btnAufClick(Sender: TObject);
begin
  if ListEditor1.Row > 0 then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row-1);
  end;
end;

procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < (ListEditor1.Strings.Count - 1then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row,ListEditor1.Row+1);
  end;
end;


Gruß

Luis Sanchez

Das scheint so aber auch nciht ganz richtig zu seine. Wenn ich zb nur 2 Einträge in der Liste habe und den 2ten nach oben schieben will, bekomme ich ein Listenindex Fehler. Beim Ab Button geht dann ganix mehr der oberste Eintrag läst sich nicht nach unten verschieben.


jaenicke - Mo 22.11.10 14:27

Kann es sein, dass du eine fixed Zeile oben hast? Dann wäre der erste Eintrag Row = 1, aber Strings[0]...


DiamondDog - Mo 22.11.10 14:36

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Kann es sein, dass du eine fixed Zeile oben hast? Dann wäre der erste Eintrag Row = 1, aber Strings[0]...

Also hab mir mal die Werte ausgeben lassen, wenn ich 2 Einträge in der Liste habe:

Delphi-Quelltext
1:
2:
3:
ShowMessage(inttostr(ListEditor1.Row)); // Beim ersten Eintrag = 1 beim Zweiten = 2

ShowMessage(inttostr(ListEditor1.Strings.Count - 1)); //Gibt 1 aus


jaenicke - Mo 22.11.10 14:40

Also:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.btnAufClick(Sender: TObject);
begin
  if ListEditor1.Row > 1 then
    ListEditor1.Strings.Move(ListEditor1.Row - 1,ListEditor1.Row - 2);
end;

procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < ListEditor1.Strings.Count then
    ListEditor1.Strings.Move(ListEditor1.Row - 1,ListEditor1.Row);
end;


DiamondDog - Mo 22.11.10 14:43

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Also:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.btnAufClick(Sender: TObject);
begin
  if ListEditor1.Row > 1 then
    ListEditor1.Strings.Move(ListEditor1.Row - 1,ListEditor1.Row - 2);
end;

procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < ListEditor1.Strings.Count then
    ListEditor1.Strings.Move(ListEditor1.Row - 1,ListEditor1.Row);
end;


Super das funktioniert, ist es auch möglich dem verschobenen Eintrga hinterher zu springen? Auf Deutsch, den Eintrag den ich zb nach oben verschoben habe wieder zu selektieren?

Edit:
Hat sich erledigt habs selbst rausbekommen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.btnAufClick(Sender: TObject);
begin
  if ListEditor1.Row > 1 then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row - 1,ListEditor1.Row - 2);
    ListEditor1.Row := ListEditor1.Row-1;
  end;
end;

procedure TForm1.btnAbClick(Sender: TObject);
begin
  if ListEditor1.Row < ListEditor1.Strings.Count then
  begin
    ListEditor1.Strings.Move(ListEditor1.Row - 1,ListEditor1.Row);
    ListEditor1.Row := ListEditor1.Row+1;
  end;
end;