Thema: Delphi Drag and drop

Einzelnen Beitrag anzeigen

Hansa

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

Re: Drag and drop

  Alt 13. Feb 2004, 21:46
Hi Keldorn,

die zweite Antwort von Dir wollte ich so umsetzen:

Delphi-Quellcode:
procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  i : integer;
  lbSource,lbSender : TListBox;
begin
  lbSource := Source as TListBox;
  lbSender := Sender as TListbox;
  for i := 0 to lbSender.count-1 do begin
   if lbSource.Selected [i] then begin
      lbSender.Items.Add(lbSource.Items[i(*lbSource.ItemIndex*)]);
      lbSource.Items.Delete (lbSender.ItemIndex);
    end;
  end;
end;
Irgendwo ist da mindestens ein Fehler. 1. kann ich nicht über das i gehen, da die beiden Listboxen unterschiedlich viele Elemente haben können. lbSource.Items.Delete (lbSender.ItemIndex); kann wohl nicht gehen, sofern lbSource weniger Elemente hat als der Wert von lbSender.ItemIndex. Mir fällt leider nichts ein, was ich da machen könnte. Auch wenn ich 2 oder mehr Zeilen in der einen Listbox markiert habe und sie in die andere ziehen will, wird immer nur eine übernommen. Und noch eine Kleinigkeit: markieren kann ich nur mit SHIFT+Pfeil. Mit der Maus geht das nicht.

Der modifizierte Code für zwei Stringgrids sieht nun so aus:

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;

  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 StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
  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; // FEHLER BEI TYPUMWANDLUNG
  lbSender := Sender as TStringGridExt;
  lbSender.InsertRow (lbSender.Row);
  lbSource.DeleteRow (lbSource.Row);
end;

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

procedure TForm2.StringGrid2DragDrop(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;

end.
Allerdings wird er nicht compiliert. Wie oben zu sehen ist kommt "Fehler bei Typumwandlung". Ansonsten ist der Code ob ListBox oder Stringgrid fast identisch. In beiden Fällen habe ich das MouseDown allerdings eliminiert. Damit das funktioniert muß Dragmode im OI von dmManual auf dmAutomatic umgestellt werden.
Gruß
Hansa
  Mit Zitat antworten Zitat