線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1397
推到 Plurk!
推到 Facebook!

ListView 沒有 Move 的方法...要怎麼 Move ?

尚未結案
te_hsun
一般會員


發表:43
回覆:34
積分:20
註冊:2002-03-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-18 11:51:31 IP:220.135.xxx.xxx 未訂閱
這一段程式,新增加的那個Item會是空白的... 請問哪裡弄錯了??    
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  FListItem, NewItem: TListItem;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    FListItem:= ListView1.Items[CurIndex];
    ListView1.Items.Delete(CurIndex);
    NewItem:= ListView1.Items.Insert(NewIndex);
    NewItem:= FListItem;
  end;
end;
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-18 12:10:39 IP:210.243.xxx.xxx 未訂閱
引言: 這一段程式,新增加的那個Item會是空白的... 請問哪裡弄錯了??
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  FListItem, NewItem: TListItem;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    FListItem:= ListView1.Items[CurIndex];
    ListView1.Items.Delete(CurIndex);
    NewItem:= ListView1.Items.Insert(NewIndex);
    NewItem:= FListItem;
  end;
end;
Delete之後該Item的資訊會被清掉, 所以你要這樣改
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  NewItem: TListItem;
  szCaption: String;    begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    szCaption:= ListView1.Items[CurIndex].Caption;
    ListView1.Items.Delete(CurIndex );
    NewItem:= ListView1.Items.Insert(NewIndex );
    NewItem.Caption := szCaption;
  end;
end;    
te_hsun
一般會員


發表:43
回覆:34
積分:20
註冊:2002-03-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-18 13:26:41 IP:220.135.xxx.xxx 未訂閱
引言:
 
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  NewItem: TListItem;
  szCaption: String;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    szCaption:= ListView1.Items[CurIndex].Caption;
    ListView1.Items.Delete(CurIndex );
    NewItem:= ListView1.Items.Insert(NewIndex );
    NewItem.Caption := szCaption;
  end;
end;
雖然這樣可以取得 Caption 但是其他的資料(例:SubItems...)還需一個一個設定 有更簡便的方法嗎?
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-18 14:10:44 IP:210.243.xxx.xxx 未訂閱
引言:
引言:
 
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  NewItem: TListItem;
  szCaption: String;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    szCaption:= ListView1.Items[CurIndex].Caption;
    ListView1.Items.Delete(CurIndex );
    NewItem:= ListView1.Items.Insert(NewIndex );
    NewItem.Caption := szCaption;
  end;
end;
雖然這樣可以取得 Caption 但是其他的資料(例:SubItems...)還需一個一個設定 有更簡便的方法嗎?
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  NewItem, CopyItem: TListItem;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    CopyItem := TListItem.Create(ListView1.Items);
    CopyItem.Assign(ListView1.Items.Item[CurIndex]);
    ListView1.Items.Delete(CurIndex);
    NewItem := ListView1.Items.Insert(NewIndex);
    NewItem.Assign(CopyItem);
    CopyItem.Free;
  end;
end;
發表人 - zard 於 2005/01/18 14:12:50
ajaxhuang
一般會員


發表:2
回覆:5
積分:1
註冊:2003-03-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-18 14:12:09 IP:218.163.xxx.xxx 未訂閱
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  FListItem, NewItem: TListItem;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    FListItem := TListItem.Create(ListView1.Items);
    FListItem.Assign(ListView1.Items[CurIndex]);
    ListView1.Items[CurIndex].Assign(ListView1.Items[NewIndex]);
    ListView1.Items[NewIndex].Assign(FListItem);
    FListItem.Delete;
  end;
end;
試試看... 哈哈...有人比我快~ 發表人 - ajaxhuang 於 2005/01/18 14:22:13
te_hsun
一般會員


發表:43
回覆:34
積分:20
註冊:2002-03-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-18 19:48:18 IP:220.135.xxx.xxx 未訂閱
哇...兩種方法都可以用耶!! 一個是互換,一個是增減...哪個好呢? 若修正如下的程式片段,有必要加上 try ..finally 嗎?    
procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  FListItem: TListItem;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    FListItem := TListItem.Create(ListView1.Items);
    try
      FListItem.Assign(ListView1.Items[CurIndex]);
      ListView1.Items[CurIndex].Assign(ListView1.Items[NewIndex]);
      ListView1.Items[NewIndex].Assign(FListItem);
    finally
      FListItem.Free;
    end;
  end;
end;
ajaxhuang
一般會員


發表:2
回覆:5
積分:1
註冊:2003-03-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-19 15:44:41 IP:218.163.xxx.xxx 未訂閱
感覺加上try finally好像沒有太大的意義 我的程式碼裡 FListItem.Delete; 用 FListItem.Free; 代替也是一樣的吧...
te_hsun
一般會員


發表:43
回覆:34
積分:20
註冊:2002-03-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-19 23:49:33 IP:220.135.xxx.xxx 未訂閱
在實作以後,以下的方法比較符合move的意思... 因為"互換"和"搬移"是不一樣的...呵呵 ^^"    
    procedure TForm1.Move(CurIndex, NewIndex: Integer);
var
  NewItem, CopyItem: TListItem;
begin
  if (NewIndex < 0) or (NewIndex >= ListView1.Items.Count) then exit;
  if CurIndex <> NewIndex then
  begin
    CopyItem := TListItem.Create(ListView1.Items);
    try
      CopyItem.Assign(ListView1.Items.Item[CurIndex]);
      ListView1.Items.Delete(CurIndex);
      NewItem := ListView1.Items.Insert(NewIndex);
      NewItem.Assign(CopyItem);
    finally
      CopyItem.Free;
    end;
  end;
end;    
系統時間:2024-04-23 23:42:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!