![]() |
2 Listboxen gleichzeitig bearbeiten
Hallo !
Habe 2 Listboxen in Verwendung, die Daten beinhalten und zwischen den Listboxen bestimmten Inhalten zugeornet sind. zBsp.: Listbox1: C:\Daten5\a.txt C:\Daten5\b.txt ...... Listbox2: a.txt b.txt ...... Möchte mittels Mouse in der Listbox2 eine bestimmte Datei selectiren und an einer anderen Stelle in der Listbox2 neu plazieren. Beide Listboxen gemeinsam selectieren funktioniert. Das gemeinsame verschieben klappt nicht, wobei wenn ich jede einzelne Listbox selectiere dann geht es. Wo liegt der Fehler, wenn ich Listbox2 selectiere und verschiebe in Listbox1 nichts passiert. Hier der Code: ( unter Verwendung einer ActionList-Komponente )
Delphi-Quellcode:
Einem Hinweis wäre ich dankbar !
procedure TFMain.ListBox2Click(Sender: TObject);
begin if not ( Listbox2.ItemIndex = Listbox2.Count - 0 ) then begin Listbox1.ItemIndex := Listbox2.ItemIndex; end; end; function ListMenu(mi: TMenuItem): Integer; var i: Integer; item: TMenuItem; begin Result := 0; for i := 0 to Pred(mi.Count) do begin item := mi.Items[i]; if item.Count = 0 then item.Visible := item.Enabled else item.Visible := ListMenu(item) > 0; Inc(Result, Ord(item.Visible and not item.IsLine)); end; end; procedure TFMain.MoveUpActionUpdate(Sender: TObject); var at: TListBox; begin with Sender as TAction do begin at := ActiveControl as TListBox; Enabled := at.ItemIndex > 0; end; end; procedure TFMain.MoveDownActionUpdate(Sender: TObject); var at: TListBox; begin with Sender as TAction do begin at := ActiveControl as TListBox; Enabled := (at.ItemIndex >= 0) and (at.ItemIndex < Pred(at.Count)); end; end; procedure TFMain.MoveDownActionExecute(Sender: TObject); var at: TListBox; begin with Sender as TAction do at := ActiveControl as TListBox; with at do Listbox2.Items.Exchange(Listbox2.ItemIndex, Succ(Listbox2.ItemIndex)); Listbox1.Items.Exchange(Listbox1.ItemIndex, Succ(Listbox1.ItemIndex)); end; procedure TFMain.MoveUpActionExecute(Sender: TObject); var at: TListBox; begin with Sender as TAction do at := ActiveControl as TListBox; with at do Listbox2.Items.Exchange(Listbox2.ItemIndex, Pred(Listbox2.ItemIndex)); Listbox1.Items.Exchange(Listbox1.ItemIndex, Pred(Listbox1.ItemIndex)); end; procedure TFMain.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var index: Integer; begin with Sender as TListBox do index := ItemAtPos(Point(X, Y), True); Accept := (Sender = Source) and (index > -1); end; procedure TFMain.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); var index: Integer; begin with Sender as TListBox do begin index := ItemAtPos(Point(X, Y), True); Items.Move(ItemIndex, index); end; end; procedure TFMain.ListBox1ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin with Sender as TListBox do Listbox2.ItemIndex := ItemAtPos(MousePos, False); end; procedure TFMain.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer); var index: Integer; begin with Sender as TListBox do begin index := ItemAtPos(Point(X, Y), True); Items.Move(ItemIndex, index); end; end; procedure TFMain.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var index: Integer; begin with Sender as TListBox do index := ItemAtPos(Point(X, Y), True); Accept := (Sender = Source) and (index > -1); end; procedure TFMain.ListBox2ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin with Sender as TListBox do //Listbox1.ItemIndex := Listbox2.ItemAtPos(MousePos, False); Listbox1.ItemIndex := Listbox2.ItemIndex; end; ml:roll: |
AW: 2 Listboxen gleichzeitig bearbeiten
Moin guck dir mal MoveDownActionExecute an und rücke mal richtig ein:
So ist es "falsch":
Delphi-Quellcode:
So ist es "richtig":
if foo then
blub; bla;
Delphi-Quellcode:
Natürlich einrücken kannste wie du lustig bist, aber ich glaube du hast da was übersehen/vergessen ;)
if foo then
blub; bla; Übrigens kannst du da gut mit "Sender" o.ä. arbeiten und beiden das gleiche Event zuweisen. MfG Fabian PS: MoveUpActionExecute, ListBox2DragOver sehen beide auch noch komisch aus. PPS: ListBox1DragOver ist anders wie ListBox2DragOver?! |
AW: 2 Listboxen gleichzeitig bearbeiten
Hallo !
Nachstehende Variante habe ich schon probiert, funktioniert nicht:
Delphi-Quellcode:
Ich dachte, muss beide Listboxen ansprechen?
procedure TFMain.MoveUpActionExecute(Sender: TObject);
var at: TListBox; begin with Sender as TAction do at := ActiveControl as TListBox; with at do Items.Exchange(ItemIndex, Pred(ItemIndex)); end; end; Das andere sieht schon besser aus, geht trotzdem nicht!
Delphi-Quellcode:
Bin für jeden Tipp, ob Lösung oder Schreibweise! dankbar.
procedure TFMain.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); var index: Integer; begin with Sender as TListBox do index := ItemAtPos(Point(X, Y), True); Accept := (Sender = Source) and (index > -1); end; mfg ml:roll: |
AW: 2 Listboxen gleichzeitig bearbeiten
Moin,
ich frage mich gerade, was da zu den with-Blöcken gehören soll. Ich selber habe den Code nicht durchgetestet sondern nur gesehen, dass die Einrückung komisch aussieht. Zum Beispiel das hier:
Delphi-Quellcode:
Was soll der Code machen? Aktuell macht er ähm:
with at do
Listbox2.Items.Exchange(Listbox2.ItemIndex, Pred(Listbox2.ItemIndex)); Listbox1.Items.Exchange(Listbox1.ItemIndex, Pred(Listbox1.ItemIndex));
Delphi-Quellcode:
Vermutlich steht in at die Liste drin, in der die Einträge getauscht werden sollen? Dann müsste das so lauten:
Listbox2.Items.Exchange(Listbox2.ItemIndex, Pred(Listbox2.ItemIndex));
Listbox1.Items.Exchange(Listbox1.ItemIndex, Pred(Listbox1.ItemIndex));
Delphi-Quellcode:
Naja ich frage mich auch gerade was du genau vor hast:
at.Items.Exchange(at.ItemIndex, Pred(at.ItemIndex));
Du markierst Zeile X (z.B. 5) in der einen Listbox. Dann soll er die Zeile X der anderen ListBox auch markieren oder? Und das austauschen dann via Drag & Drop? Und versuch nicht ganz so viele with-Blöcke zu schreiben. Zumindest mich verwirrts irgendwie :cyclops: MfG Fabian PS: Könntest du nicht mal den doppelten Sourcecode rausnehmen? Ich meine zumindest ListBoxXDragOver und ListBoxXDragDrop können das ja schon. |
AW: 2 Listboxen gleichzeitig bearbeiten
Hallo Fabian,
habe komplett nochmal überarbeitet:
Delphi-Quellcode:
Damit kann ich per Mouse eine bestimmte Zeile in der Listbox1 selectieren und dann an einer anderen Stelle in der Listbox1 wieder einordnen. Das funktioniert aufwärts und abwärts.
procedure TFMain.MoveUpActionUpdate(Sender: TObject);
var at: TListBox; begin with Sender as TAction do begin at := ActiveControl as TListBox; Enabled := at.ItemIndex > 0; end; end; procedure TFMain.MoveUpActionExecute(Sender: TObject); var at: TListBox; begin with Sender as TAction do at := ActiveControl as TListBox; with at do Items.Exchange(ItemIndex, Pred(ItemIndex)); end; procedure TFMain.ListBox1ContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); begin with Sender as TListBox do ItemIndex := ItemAtPos(MousePos, False) end; procedure TFMain.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); var index: Integer; begin with Sender as TListBox do begin index := ItemAtPos(Point(X, Y), True); Items.Move(ItemIndex, index); end; end; procedure TFMain.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var index: Integer; begin with Sender as TListBox do index := ItemAtPos(Point(X, Y), True); Accept := (Sender = Source) and (index > -1); end; Mit nachfolgendem kann ich dann ebenfalls dieselbe Zeile in der Listbox2 selectieren.
Delphi-Quellcode:
Ich möchte nichts weiter, dass, wenn ich in der Listbox1 - was ja funktioniert - zBsp. von zeile 5 nach 2 oder von zeile 2 nach 10 vershiebe auch in der Listbox2 passiert. Das selectieren klappt ja aber beim verschieben futzt es nicht, auch wenn ich der Listbox2 dieselben Parameter analog der Listbox1 zuordnet.
procedure TFMain.ListBox1Click(Sender: TObject);
begin if not ( Listbox1.ItemIndex = Listbox1.Count - 0 ) then begin Listbox2.ItemIndex := Listbox1.ItemIndex; end; end; Im Klartext zBsp.: Verschiebe Box1 von 3 nach 5, dann soll gleichzeitig Box2 auch von 3 nach 5. Ich glaube jetzt ist es eindeutig und Du kannst damit etwas anfangen. Jedoch muss ListBox1DragOver und ListBox1DragDrop bleiben sonst gehts nicht. mfg ml:roll: |
AW: 2 Listboxen gleichzeitig bearbeiten
Vielleicht übersehe ich was (benutze keine TActionList),
aber wenn du was in der Listbox 1 dropst, wird doch das aufgerufen:
Delphi-Quellcode:
Und da wird nirgends das aus der Listbox 2 ausgetauscht.
procedure TFMain.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var index: Integer; begin with Sender as TListBox do begin index := ItemAtPos(Point(X, Y), True); Items.Move(ItemIndex, index); end; end;
Delphi-Quellcode:
MfG
beginprocedure TFMain.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var idx1, idx2: Integer; begin idx1 := (Sender as TListBox).ItemAtPos(Point(X, Y), True); idx2 := (Sender as TListBox).ItemIndex; ListBox1.Items.Move(idx2, idx1); ListBox2.Items.Move(idx2, idx1); end; Fabian |
AW: 2 Listboxen gleichzeitig bearbeiten
Hallo,
sorry, kann erst jetzt antworten, d.h. habe es eben im Project entsprechend Deinem Vorschlag geändert und es funktioniert ohne Probleme. Alles bestens und schöne Grüsse, sowie Danke:-D mfg manne:roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 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