Avatar billede cms Nybegynder
14. april 2003 - 21:10 Der er 1 kommentar og
2 løsninger

TListView.OnSelectItem

Hej kære medeksperter :)

Jeg håber I kan hjælpe mig med mit lille problem.
TListView.OnSelectItem har en parameter: Selected.
Denne er false når et Item mister selection og true når et Item modtager selection. Smart nok. Det betyder at hvis jeg tidligere har valgt et item, lad os kalde det "item1", og ny trykker med musen på et andet, "item2", så vil min eventhandler blive kaldt to gange! Én gang med Item1 og false (fordi denne mister selection) og en gang med Item2 og true.
Problemet er at andre gange vælger man ikke et nyt item, der klikker man ved siden af, dvs. så får man kun en Item1 med Selected=false - dvs. éns procedure bliver kun kaldt én gang.

Jeg ville gerne kunne kalde en procedure med følgende oplysninger:
procedure SelectionChanged(OldSelectedItem, NewSelectedItem: TListItem);
Hvor begge parametre kan være nil eller have en reference.

Jeg håber, det er godt nok forklaret, og at I kan hjælpe mig :)
Avatar billede doc404 Novice
14. april 2003 - 22:17 #1
Her er et eksempel, der efter en kort test, ser ud til at virke...

/doc404

unit Unit1;

interface

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

type

  TForm1 = class(TForm)
    Memo1: TMemo;
    ListView1: TListView;
    procedure ListView1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ListView1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    LastSelItem  : TListItem;
    procedure SelectionChanged(OldSelectedItem, NewSelectedItem: TListItem);
    procedure CheckSelChange;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.DFM}

procedure TForm1.SelectionChanged(OldSelectedItem,NewSelectedItem: TListItem);
var
  a,b : string;
begin
  if OldSelectedItem <> nil then a := OldSelectedItem.Caption else a := '.';
  if NewSelectedItem <> nil then b := NewSelectedItem.Caption else b := '.';
  Memo1.Lines.Add(Format('%s -> %s',[a,b]));
end;

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  CheckSelChange;
end;

procedure TForm1.ListView1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  CheckSelChange;
end;

procedure TForm1.CheckSelChange;
begin
  if (ListView1.Selected <> LastSelItem) then
    begin
      SelectionChanged(LastSelItem,ListView1.Selected);
      LastSelItem := ListView1.Selected;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  LastSelItem := nil;
end;

end.
Avatar billede doc404 Novice
14. april 2003 - 22:19 #2
Det der er interessant for dig er CheckSelChange som skal kaldes fra din listview KeyUp og MouseUp events. Husk initialiseringen i FormCreate for god ordens skyld.
Avatar billede cms Nybegynder
22. maj 2003 - 03:46 #3
Ja, well okay, jeg lavede det selv. Men du skal da have tak for hjælpen :)
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