AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Drag and drop

Ein Thema von Hansa · begonnen am 10. Feb 2004 · letzter Beitrag vom 14. Feb 2004
Antwort Antwort
Seite 1 von 2  1 2      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Drag and drop

  Alt 10. Feb 2004, 23:04
Hi,

habe hier >2 Listboxen. 8) Schiebe damit Zeilen hin und her. Jetzt kommts:

Delphi-Quellcode:
procedure TForm1.ListBox4DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if Source is TListBox then with Sender do begin
    Text := ListBox2.Items[ListBox2.ItemIndex];
    ListBox4.AddItem(Text,source);
    ListBox2.Items.Delete (ListBox2.ItemIndex);
  end;
end;

soweit, so gut, aber wie kann ich das allgemeingültig machen? Da steht jetzt explizit Listbox2 oder Listbox4 drin und so geht das denn auch, aber was, falls ListBoxAssarbad da steht und aus Listbox1 soll eine Zeile da rein ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Drag and drop

  Alt 10. Feb 2004, 23:38
wenn Absender und Source die Listboxen wären, so etwa :

Delphi-Quellcode:
procedure TForm1.ListBox4DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  lbSource,lbSender : TListBox;
begin
  lbSource := Source as TListBox;
  lbSender := Sender as TListbox;
  lbsender.Items.Add(lbSource.Items[lbSource.ItemIndex];
  lbSource.Items.Delete (lbSource.ItemIndex);
end;
Bernd

P.S Was dein addItem da bezweckt und mit Zeilen hin und herschieben zu tun hat wüsste ich ja auch mal gerne
Bernd Ua
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: Drag and drop

  Alt 11. Feb 2004, 10:48
Thx, Dein Code ist etwas übersichtlicher, als meiner und auch kleiner. So gefällts mir besser. Nur noch ein Schönheitsfehler, zumindest aus meiner Sicht 8) :

Delphi-Quellcode:
procedure TForm1.ListBox2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := Source is TListBox;
end;

procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  lbSource,lbSender : TListBox;
begin
  lbSource := Source as TListBox;
  lbSender := Sender as TListbox;
  lbsender.Items.Add(lbSource.Items[lbSource.ItemIndex]);
  lbSource.Items.Delete (lbSource.ItemIndex);
end;

procedure TForm1.ListBox2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if button = mbLeft then with Sender as TListBox do begin
    if ItemAtPos (Point (x,y),true) >= 0 then
      BeginDrag (false);
  end;
end;
Dieser Code steht jetzt 4mal im Programm (für 4 Listboxen). Es ist also immer derselbe, bis auf den Prozedur-Namen. Wie kann ich den verallgemeinern oder besser noch zur Laufzeit auswerten, je nachdem, wieviele Listboxen ich im Endeffekt brauche ?

Mir fällt gerade ein, daß ich das ganze auf die Form übertragen könnte. Aber das DragDrop der Form hat kein accept. So wirds wohl nicht gehen, oder was muß ich da hin schreiben ?

Delphi-Quellcode:
procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin

end;
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Drag and drop

  Alt 11. Feb 2004, 11:13
Das war jetzt auch verkehrt. Der Code sieht jetzt so aus:

Delphi-Quellcode:
procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := true; //Source is TListBox;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  lbSource,lbSender : TListBox;
begin
  lbSource := Source as TListBox;
  lbSender := Sender as TListbox;
  lbsender.Items.Add(lbSource.Items[lbSource.ItemIndex]);
  lbSource.Items.Delete (lbSource.ItemIndex);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if button = mbLeft then with Sender as TListBox do begin
    if ItemAtPos (Point (x,y),true) >= 0 then
      BeginDrag (false);
  end;
end;
Wieso geht das so nicht ? Gefordert ist : egal wie viele Listboxen da sind, jede Zeile aus einer soll in eine beliebige andere verschoben werden können.
Gruß
Hansa
  Mit Zitat antworten Zitat
Bernd Ua

Registriert seit: 10. Nov 2003
Ort: Lindhorst
87 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Drag and drop

  Alt 11. Feb 2004, 11:53
Wenn dein Code nur sender/Source verwendet kannst du doch OnDragDrop von
beliebig vielen Listboxen auf ein und dieselbe Methdoe zeigen lassen.
Das mit dem Form brauchst du nicht.

Bernd
Bernd Ua
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Drag and drop

  Alt 11. Feb 2004, 12:46
Das ist ja auch immer dasselbe, aber es geht nur wenn ich ListBox1..4Dragdrop einzeln aufrufe. Wie meinst du, soll ich das alles auf eine procedure zeigen lassen ?
Gruß
Hansa
  Mit Zitat antworten Zitat
MikeS

Registriert seit: 3. Mai 2003
Ort: München
157 Beiträge
 
Delphi 7 Professional
 
#7

Re: Drag and drop

  Alt 11. Feb 2004, 13:11
funktioniert das auch nicht, wenn du die allgemeinen von dir angelegten proceduren
dem jeweiligen ereignis deiner listboxen zuweißt?

also listbox2.dragdrop = form1.dragdrop <- oder so ähnlich!

oder im objectinspektor einstellen
Mike Schröder
Fleiß kann man vortäuschen, faul muss man schon selber sein!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

Re: Drag and drop

  Alt 11. Feb 2004, 13:41
Die Teilfrage bleibt offen, ich lebe dann eben vorerst mit zu vielen unnötigen Prozeduren. Jetzt sehe ich gerade, daß die Listbox ja auch Columns hat. Wie behandele ich denn die ? Ich bräuchte 2 Columns pro Listbox und wollte eventuell ein Stringgrid verwenden. Vielleicht tuts die Listbox aber doch. Wie gesagt, die Hauptfrage ist die Verwendung von Drag and Drop.
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

Re: Drag and drop

  Alt 11. Feb 2004, 13:50
Und da ist schon das nächste Problem. Wenn ich Multiselect auf true stelle kann ich mit SHIFT mehrere Elemente auswählen. Sobald ich die Maus benutze um alle zu verschieben ist nur noch eines markiert. Was fehlt da noch ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10

Re: Drag and drop

  Alt 13. Feb 2004, 18:39
Scheint keinen mehr zu interessieren.

Ich habe das ganze jetzt mal statt mit einer Listbox mit einem StringGrid versucht:

Delphi-Quellcode:
unit StrTestUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;

type
  TStringGridExt = class(TStringGrid)
  protected
    procedure InsertRow(ARow: Longint);
    procedure DeleteRow(ARow: Longint);
  end;

type
  TForm2 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    StringGrid2: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    {...}
  public
    {...}
  end;

var
  Form2: TForm2;

implementation

{$R *.DFM}

procedure TStringGridExt.InsertRow(ARow: Longint);
var
  TempRow: Integer;
begin
  TempRow := Row; // Zeile zwischenspeichern
  while ARow < FixedRows do
    ARow := ARow + 1;
  RowCount := RowCount + 1;
  MoveRow(RowCount - 1, ARow);
  Row := TempRow;
  Rows[Row].Clear;
end;

procedure TStringGridExt.DeleteRow(ARow: Longint);
var
  GemRow: Integer;
begin
  GemRow := Row;
  if RowCount > FixedRows + 1 then
    inherited DeleteRow(ARow)
  else
    Rows[ARow].Clear;
  if GemRow < RowCount then Row := GemRow;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  TStringGridExt(StringGrid1).InsertRow(1);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  TStringGridExt(StringGrid1).DeleteRow(1);
end;

procedure TForm2.StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := true; //Source is TStringGridExt;
end;

procedure TForm2.StringGrid1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  lbSource,lbSender : TStringGridExt;
begin
  lbSource := Source as TStringGridExt;
  lbSender := Sender as TStringGridExt;
  lbsender.InsertRow (lbSender.Row);
  lbSource.DeleteRow (lbSource.Row);
end;

procedure TForm2.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if button = mbLeft then with Sender as TStringGridExt do begin
    if ItemAtPos (Point (x,y),true) >= 0 then
      BeginDrag (false);
  end;
end;

end.
Das StringGridExt enthält 2 Prozeduren, um Zeilen zu löschen / einzufügen. Ansonsten ist es ähnlich, wie bei der Lsitbox. Nur die MouseDown Prozedur wird nicht compiliert, da es kein ItemAtPos im StringGrid gibt. Nur, was soll ich statt dessen verwenden ??
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:32 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