Avatar billede jisch Mester
28. august 2008 - 13:23 Der er 7 kommentarer og
1 løsning

Listbox i Delphi7

Er der nogen der ved hvordan man sætter property i en listbox således at bruger med musen kan flytte items op og/eller ned. Hvis det ikke kan lade sig gøre er der så nogen der ved om der findes en component med denne mulighed.
Avatar billede hrc Mester
28. august 2008 - 13:33 #1
Tænker du på at rearrangere dem? Kunne også forestille mig, at du ville scrolle ved at holde fast på en linje.

Tror godt det kan lade sig gøre med TListBox, men ellers kan TListView garanteret. Skal prøve lidt inden der kommer kød på svaret.
Avatar billede pidgeot Nybegynder
28. august 2008 - 13:34 #2
Jeg skulle mene det her vil gøre tricket:
http://delphi.about.com/od/adptips2006/qt/listboxdropitem.htm
Avatar billede jisch Mester
28. august 2008 - 16:52 #3
>pidgeot: Genialt - send lige et svar - Tak
Avatar billede pidgeot Nybegynder
28. august 2008 - 17:02 #4
Værsgo :)
Avatar billede hrc Mester
28. august 2008 - 23:55 #5
Mit eksempel ser sådan ud (ignorér OutputDebugString-linjerne):

uses
  TypInfo;

type
  TMyDragObject = class(TDragObject)
  private
    fSelectedIndex: integer;
  public
    constructor Create(const aSelectedIndex: integer);
    property SelectedIndex: integer read fSelectedIndex;
  end;

{ TMyDragObject }

constructor TMyDragObject.Create(const aSelectedIndex: integer);
begin
  inherited Create;
  fSelectedIndex := aSelectedIndex;
end;

procedure TfrmMain.lbDataDragDrop(Sender, Source: TObject; X, Y: Integer);
var
  Index: integer;
begin
  Index := (Sender as TListBox).ItemAtPos(Point(X,Y),true);
  if Index >= 0 then
    (Sender as TListBox).Items.Move((Source as TMyDragObject).SelectedIndex,Index);
  OutputDebugString(pchar(format('Drop: Sender: %s, Source: %s (%d,%d)',[Sender.ClassName, Source.ClassName, X, Y])));
  Source.Free;
end;

procedure TfrmMain.lbDataDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
  // OutputDebugString(pchar(format('Over: Sender: %s, Source: %s (%d,%d) - %s',[Sender.ClassName, Source.ClassName, X, Y, GetEnumName(TypeInfo(TDragState),integer(State))])));
end;

procedure TfrmMain.lbDataEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
  if assigned(Target) then
    OutputDebugString(pchar(format('End: Sender: %s, Target: %s (%d,%d)',[Sender.ClassName, Target.ClassName, X, Y])))
  else
    OutputDebugString(pchar(format('End: Sender: %s, Target: %s (%d,%d)',[Sender.ClassName, 'nil', X, Y])));
end;

procedure TfrmMain.lbDataStartDrag(Sender: TObject; var DragObject: TDragObject);
begin
  // Det bekymrer mig lidt at dette event kaldes så snart jeg vælger en linje
  // i listboksen. Der bliver altså oprettet et objekt, men slipper jeg linjen
  // igen, bliver DragDrop aldrig kaldet og objektet (Source = DragObject)
  // bliver ikke frigivet.

  OutputDebugString(pchar(format('Start: Sender: %s',[Sender.ClassName])));
  with (Sender as TListBox) do
    if ItemIndex >= 0 then
      DragObject := TMyDragObject.Create(ItemIndex);
end;
Avatar billede jisch Mester
30. august 2008 - 11:43 #6
>hrc: Tak for din indsats, men pidgeot's eksempel virker og jeg bruger det allerede nu.
Avatar billede hrc Mester
30. august 2008 - 20:59 #7
Velbekomme. Har altid syntes det drag-drop sjov fungerede ret dårligt og trængte til lidt træning udi det. Jeg synes ikke meget om About's eksempel, da det indeholder globale variable og den slags. På den anden side er det en simpel løsning der virker.

Jeg selv ved ikke hvad der sker med de objekter der oprette, når bare der en linje vælges, for de ender aldrig i OnDragDrop hvor de frigives.
Avatar billede pidgeot Nybegynder
30. august 2008 - 22:04 #8
Nu står der "form level" jo ud for den var i About's kode, så jeg tolker det som en forkortet måde at angive på at den variabel bør være en del af formen - det er jo ikke en hel Unit.

Det vil ikke have nogen funktionel forskel, da man alligevel ikke kan dragge fra to steder på samme tid, men det er jo så en anden sag.

Jeg kiggede i øvrigt lidt i VCL'et (Controls.pas), og det ser ud som om den bruger en global variabel til at gemme det aktuelle DragObject. Jeg kan ikke finde nogles Frees el. lign. på den - kun et par assignments - så jeg ved ikke helt hvad der er meningen i den situation du skriver.
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