Avatar billede ylwen Nybegynder
18. august 2002 - 16:29 Der er 3 kommentarer og
2 løsninger

drag and drop

Hvordan dragger man fra et stringgrid til en listbox?
og eventuelt også fra en ListView.

Gerne med noget kode der virker
Avatar billede zerohero Nybegynder
18. august 2002 - 17:47 #1
i din Stringgrids OnMouseDown procedure:

StringGrid1.BeginDrag(True);

I din ListViews OnDragOver procedure:

if Source is TStringGrid then
Accept := True;

Til sidst i din StringGrids OnDragDrop procedure:

if Source is TStringGrid then
with Source as TStringGrid do
...(gør et eller andet);

Held og Lykke
ZeroHero
Avatar billede ylwen Nybegynder
18. august 2002 - 18:01 #2
Har du noget eks. på listview
Avatar billede zerohero Nybegynder
18. august 2002 - 21:13 #3
Princippet er det samme.
Du skal stadig bare skrive i din Stringgrids OnMouseDown procedure:

StringGrid1.BeginDrag(True);

og dernæst skrive i din ListViews OnDragOver procedure:

if Source is TStringGrid then
Accept := True;

og i din ListViews OnDragDrop procedure:

if Source is TStringGrid then
with Source as TStringGrid do
...(gør et eller andet);

ZeroHero
Avatar billede borrisholt Novice
19. august 2002 - 08:24 #4
her er en ready to go eksemple :

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure ListViewDragOver(Sender, Source: TObject; X, Y: Integer;  State: TDragState; var Accept: Boolean);
    procedure ListViewDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure ListViewMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
    _ListView : TListView;
    __ListView : TListView;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  ListColumn : TListColumn;
  ListItem : TListItem;
  i : Integer;
begin
  _ListView := TListView.Create(Form1);
  __ListView := TListView.Create(Form1);

  with _ListView do
  begin
    Align := alLeft;
    ViewStyle := vsReport;
    RowSelect := true;
    ReadOnly :=true;
    FullDrag := true;
    OnDragOver := ListViewDragOver;
    OnDragDrop := ListViewDragDrop;
    OnMouseDown := ListViewMouseDown;
  end;

  with __ListView do
  begin
    Align := alClient;
    ViewStyle := vsReport;
    RowSelect := true;
    ReadOnly :=true;
    FullDrag := true;
    OnDragOver := ListViewDragOver;
    OnDragDrop := ListViewDragDrop;
    OnMouseDown := ListViewMouseDown;
  end;


  InsertControl(_ListView);
  InsertControl(__ListView);

  Randomize;

  for i:= 0 to 3 do
  begin
    ListColumn          := _ListView.Columns.Add;
    ListColumn.Caption  := IntToStr(Random(5000));
    ListColumn.Alignment := taCenter;
    ListColumn.AutoSize  := True;
  end;

  __ListView.Columns.Assign(_ListView.Columns);

  for i:= 0 to 15 do
  begin
    ListItem := _ListView.Items.Add;
    ListItem.Caption :=  IntToStr(Random(5000));
    ListItem.SubItems.Add(IntToStr(Random(5000)));
    ListItem.SubItems.Add(IntToStr(Random(5000)));
    ListItem.SubItems.Add(IntToStr(Random(5000)));
  end;
end;

procedure TForm1.ListViewDragOver(Sender, Source: TObject; X, Y: Integer;  State: TDragState; var Accept: Boolean);
begin
  Accept := Source is TListView;
end;

procedure TForm1.ListViewDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  ListItem : TListItem;
  DragPos : Integer;
begin
  ListItem  := (Source as TListView).Selected;

  DragPos :=(Sender as TListView).Items.IndexOf((Sender as TListView).GetItemAt(X,Y));

  if DragPos = -1 then
    DragPos := (Sender as TListView).Items.Count
  else if DragPos > (Source as TListView).Items.IndexOf(ListItem) then
    Inc (DragPos);

  (Sender as TListView).Items.Insert(DragPos);
  (Sender as TListView).Items[DragPos].Assign(ListItem);
  (Source as TListView).Items.Delete((Source as TListView).Items.IndexOf(ListItem));
end;

procedure TForm1.ListViewMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
var
  DragItem: Integer;
begin
  if Button = mbLeft then
  begin
    DragItem := (Sender as TListView).Items.IndexOf((Sender as TListView).GetItemAt(X,Y));

    if (DragItem > -1) and (DragItem < (Sender as TListView).Items.Count) then
      (Sender as TListView).BeginDrag(False);
  end;
end;

end.


Jens B
Avatar billede ylwen Nybegynder
19. august 2002 - 14:18 #5
Ja, jeg må jo sige pænt tak til jer begge.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester