Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ListBox oder ähnliches für Auswahl einer Reihenfolge


mexx - Mo 23.01.06 17:25
Titel: ListBox oder ähnliches für Auswahl einer Reihenfolge
Ich möchte eine ListBox mit möglichen Inhalten einer Tabelle füllen. Die Spalten meine ich. Die Spalte, welche als erstes angezeigt werden soll, soll den Index 0 haben, die zweite die angezeigt werden soll, soll den Index 1 in der Listbox haben. Nun möchte ich aber in der ListBox die Reihenfolge der Spalten ändern können. Entweder durch das anklicken eines Eintrages in der ListBox und dann hoch oder runter schieben, oder durch das Anklicken und dann mit Pfeiltasten hoch oder runter legen. Beides will nicht so recht funktionieren. Gibt es vielleicht eine andere Komponente, die das beherrscht?


Keldorn - Mo 23.01.06 18:02

Hallo

etwas code aus einem meiner projekte


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
//verschieben per buttons (2 Speedbuttons hoch und runter)
procedure TFrameAuswahl.SpeedButton_hochClick(Sender: TObject);
var NeuerIndex: Integer;
begin
  if (ListBox.ItemIndex<>-1and (ListBox.ItemIndex>0then
    begin
      NeuerIndex:=ListBox.ItemIndex-1;
      ListBox.items.Move(ListBox.ItemIndex,NeuerIndex);
      ListBox.ItemIndex:=NeuerIndex;
    end;
  SpeedbuttonsAktualisieren;
end;

procedure TFrameAuswahl.SpeedButton_runterClick(Sender: TObject);
var NeuerIndex: Integer;
begin
  if (ListBox.ItemIndex<>-1and (ListBox.ItemIndex<ListBox.items.Count-1then
    begin
      NeuerIndex:=ListBox.ItemIndex+1;
      ListBox.items.Move(ListBox.ItemIndex,NeuerIndex);
      ListBox.ItemIndex:=NeuerIndex;
    end;
  SpeedbuttonsAktualisieren;
end;

procedure TFrameAuswahl.SpeedbuttonsAktualisieren;/--> auch am Anfang aufrufen
begin
  SpeedButton_hoch.Enabled := (ListBox.ItemIndex > 0);
  SpeedButton_runter.Enabled := (ListBox.ItemIndex < ListBox.Count - 1);
end;

//verscheiben per Drag and drop, dragmode auf dmautomatic

procedure TFrameAuswahl.ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer);
var i,i2 : integer;
    lbSource,lbSender : TListBox;
begin
  { TODO: allgemeiner code, Dragover auf ein und dieselbe Listbox beschränken }
  lbSource := Source as TListBox;
  lbSender := Sender as TListbox;
  //kein Multiselect!
  i2:=lbSender.ItemAtPos(point(x,y),false);
  if (i2<>-1and (i2<lbSource.Count) and (lbSource.ItemIndex<>-1then
    begin
      lbSource.Items.Move(lbSource.ItemIndex,i2);
      lbSource.ItemIndex:=i2;
    end;
end;

procedure TFrameAuswahl.ListBoxDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  accept := (Source is TListBox);
end;


Mfg Frank