AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein 2 Listboxen gleichzeitig bearbeiten
Thema durchsuchen
Ansicht
Themen-Optionen

2 Listboxen gleichzeitig bearbeiten

Ein Thema von maluprog · begonnen am 27. Sep 2010 · letzter Beitrag vom 28. Sep 2010
Antwort Antwort
maluprog

Registriert seit: 20. Okt 2009
Ort: Wildau
19 Beiträge
 
Delphi 6 Professional
 
#1

2 Listboxen gleichzeitig bearbeiten

  Alt 27. Sep 2010, 14:02
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:
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;
Einem Hinweis wäre ich dankbar !

ml
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#2

AW: 2 Listboxen gleichzeitig bearbeiten

  Alt 27. Sep 2010, 14:08
Moin guck dir mal MoveDownActionExecute an und rücke mal richtig ein:

So ist es "falsch":
Delphi-Quellcode:
if foo then
  blub;
  bla;
So ist es "richtig":
Delphi-Quellcode:
if foo then
  blub;
bla;
Natürlich einrücken kannste wie du lustig bist, aber ich glaube du hast da was übersehen/vergessen

Ü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?!
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise (27. Sep 2010 um 14:10 Uhr)
  Mit Zitat antworten Zitat
maluprog

Registriert seit: 20. Okt 2009
Ort: Wildau
19 Beiträge
 
Delphi 6 Professional
 
#3

AW: 2 Listboxen gleichzeitig bearbeiten

  Alt 27. Sep 2010, 14:27
Hallo !

Nachstehende Variante habe ich schon probiert, funktioniert nicht:

Delphi-Quellcode:
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;
Ich dachte, muss beide Listboxen ansprechen?

Das andere sieht schon besser aus, geht trotzdem nicht!

Delphi-Quellcode:
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;
Bin für jeden Tipp, ob Lösung oder Schreibweise! dankbar.

mfg

ml
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

AW: 2 Listboxen gleichzeitig bearbeiten

  Alt 27. Sep 2010, 16:12
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:
  with at do
    Listbox2.Items.Exchange(Listbox2.ItemIndex, Pred(Listbox2.ItemIndex));
    Listbox1.Items.Exchange(Listbox1.ItemIndex, Pred(Listbox1.ItemIndex));
Was soll der Code machen? Aktuell macht er ähm:
Delphi-Quellcode:
Listbox2.Items.Exchange(Listbox2.ItemIndex, Pred(Listbox2.ItemIndex));
Listbox1.Items.Exchange(Listbox1.ItemIndex, Pred(Listbox1.ItemIndex));
Vermutlich steht in at die Liste drin, in der die Einträge getauscht werden sollen? Dann müsste das so lauten:
at.Items.Exchange(at.ItemIndex, Pred(at.ItemIndex)); Naja ich frage mich auch gerade was du genau vor hast:
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

MfG
Fabian

PS: Könntest du nicht mal den doppelten Sourcecode rausnehmen? Ich meine zumindest ListBoxXDragOver und ListBoxXDragDrop können das ja schon.
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
maluprog

Registriert seit: 20. Okt 2009
Ort: Wildau
19 Beiträge
 
Delphi 6 Professional
 
#5

AW: 2 Listboxen gleichzeitig bearbeiten

  Alt 27. Sep 2010, 17:17
Hallo Fabian,

habe komplett nochmal überarbeitet:
Delphi-Quellcode:
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;
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.
Mit nachfolgendem kann ich dann ebenfalls dieselbe Zeile in der Listbox2 selectieren.
Delphi-Quellcode:
procedure TFMain.ListBox1Click(Sender: TObject);
begin
        if not ( Listbox1.ItemIndex = Listbox1.Count - 0 ) then
        begin
         Listbox2.ItemIndex := Listbox1.ItemIndex;
        end;
end;
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.
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
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

AW: 2 Listboxen gleichzeitig bearbeiten

  Alt 27. Sep 2010, 19:54
Vielleicht übersehe ich was (benutze keine TActionList),
aber wenn du was in der Listbox 1 dropst, wird doch das aufgerufen:
Delphi-Quellcode:
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;
Und da wird nirgends das aus der Listbox 2 ausgetauscht.

Delphi-Quellcode:
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;
MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
maluprog

Registriert seit: 20. Okt 2009
Ort: Wildau
19 Beiträge
 
Delphi 6 Professional
 
#7

AW: 2 Listboxen gleichzeitig bearbeiten

  Alt 28. Sep 2010, 12:25
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

mfg

manne
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz