2014-11-23 44 views
1

我試圖通過點擊按鈕來向上或向下重新排列顯示給用戶的複選框。我可以讓複選框在每次點擊時成功進行,但問題在於,點擊按鈕後,選中的複選框會失去焦點。這樣做使我無法繼續點擊按鈕來上下移動複選標記框。我必須重新選中複選框才能繼續移動它。如何使用.Move()方法在TCheckListbox控件中選中選中的複選框。

每個按鈕點擊後,有人可以幫助我將注意力集中在複選框上嗎?

我的代碼

unit Unit1; 
interface 
uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, CheckLst; 
type 
    TForm1 = class(TForm) 
    CheckListBox1: TCheckListBox; 
    upButton: TButton; 
    downButton: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure upButtonClick(Sender: TObject); 
    procedure downButtonClick(Sender: TObject); 
    end; 
var 
    Form1: TForm1; 
implementation 
{$R *.dfm} 
procedure TForm1.downButtonClick(Sender: TObject); 
var 
    i:Integer; 
begin 
    i:=CheckListBox1.ItemIndex; 
    if(i<CheckListBox1.Count-1) Then 
    CheckListBox1.Items.Move(i,i+1);//Here 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    CheckListBox1.Items.Add('One'); 
    CheckListBox1.Items.Add('Two'); 
    CheckListBox1.Items.Add('Three'); 
    CheckListBox1.Items.Add('Four'); 
    CheckListBox1.Items.Add('Five'); 
    CheckListBox1.Items.Add('Six'); 
end; 

procedure TForm1.upButtonClick(Sender: TObject); 
var 
    i:Integer; 
begin 
    i:=CheckListBox1.ItemIndex; 
    if(i>0) Then 
    CheckListBox1.Items.Move(i,i-1);//Here 
end; 

end. 
+0

該項目失去焦點('ItemIndex'被設置爲-1)最有可能,因爲該項目被刪除(和插入'TListBoxStrings'集合中的其他位置。移動項目後,至少可以手動將'ItemIndex'設置爲新索引(例如,當向下移動時,「CheckListBox1.ItemIndex:= i + 1;')。我不知道(也不相信)你可以以某種方式防止這種行爲。 – TLama 2014-11-23 01:52:35

+0

雖然工作。謝謝你的回答。儘管它實際上失去了焦點,但它看起來像通過手動設置索引沒有丟失焦點。非常感謝。 – user3041882 2014-11-23 02:03:32

回答

2

您應該使用的方法用於計算移動新的索引和另一個,並按照項目。然後,你將有更多的演講,乾燥,可重複使用的從TCustomListBox代碼派生的任何控制:

procedure TForm1.MoveAndFollow(ListBox : TCustomListBox; OldIndex, NewIndex : integer); 
begin 
    ListBox.Items.Move(OldIndex, NewIndex); 
    ListBox.ItemIndex := NewIndex; 
end; 

procedure TForm1.MoveCurrentItem(ListBox : TCustomListBox; MoveUp : Boolean); 
var 
    LOld, LNew : integer; 
begin 
    LOld := ListBox.ItemIndex; 
    if MoveUp then 
    LNew := LOld - 1 
    else 
    LNew := LOld + 1; 
    if 
    Math.InRange(LOld, 0, ListBox.Count -1) 
    and 
    Math.InRange(LNew, 0, ListBox.Count -1) 
    then 
    MoveAndFollow(ListBox, LOld, LNew); 

end; 

procedure TForm1.downButtonClick(Sender : TObject); 
begin 
    MoveCurrentItem(CheckListBox1, False); 
end; 

procedure TForm1.upButtonClick(Sender : TObject); 
begin 
    MoveCurrentItem(CheckListBox1, True); 
end; 
+1

@TLama我的回答更多的是爲這樣的任務提供DRY和可重用代碼的概念。當然,只要保持乾爽,它可以以任何方式改進:o) – 2014-11-23 11:44:01

相關問題