ListView1中有许多项目名称:
1、当更改其中一个项目名称结束时,如果发现更改后的名称与ListView1中现有项目名称相同时:
     A、不允许此次更名,并提示已有相同项目名称存在;
      B、该项目名称恢复修改前的名称,而且使该项目名称处于重命名状态;
   
   现在遇到的问题是:上述问题不知如何实现,求代码!
2、当更改其中一个项目名称结束时,如果发现更改后的名称与ListView1中现有项目名称 不 相同时:
     A、将修改后的名称写入数据库;
      B、如果觉得有问题时,可以再次修改;
   
   现在现在遇到的问题是:第A步可以实现,但我第二次修改(第B步)时就不成功了,请问如何处理?相关代码如下:procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  i:integer;
begin
   if   listview1.selected<>nil   then
       begin
              for i:=ListView1.Items.Count-1  downto  0  Do
              if  ListView1.Items[i].Selected then
              begin
                      YCN:=ListView1.Items[i].Caption;                             //全局变量,获取变更前的ListView1名称,用于下面的更新
              end;
       end;
end;
procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem;               //更新listview1时更新数据库
  Change: TItemChange; var AllowChange: Boolean);
var
     i:integer;
     XCN:string;
begin
       if   listview1.selected<>nil   then
       begin
             for i:=ListView1.Items.Count-1  downto  0  Do
             if  ListView1.Items[i].Selected then
             begin
                     XCN:=ListView1.Items[i].Caption;
                     if   Trim(YCN)<>Trim(XCN)  then                               //加上这句判断才表示方案名称变动过,感觉还是有问题
                     with ADOQuery1 do
                     begin
                             close;
                             SQL.Clear;
                             SQL.Text:='UPDATE ……';
                             ExecSql;
                             break;
                     end;
             end;
       end;
end;

解决方案 »

  1.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        ListView1: TListView;
        procedure ListView1Edited(Sender: TObject; Item: TListItem;
          var S: String);
        procedure ListView1SelectItem(Sender: TObject; Item: TListItem;
          Selected: Boolean);
      private
        { Private declarations }
        str:string;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ListView1Edited(Sender: TObject; Item: TListItem;
      var S: String);
    begin
     if s = 'a' then    //这里换成自己的条件
       S := str
     else
       str := s;
    end;procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    begin
      str := Item.Caption;
    end;end.
      

  2.   

    1. i:=self.ListView1.Items[0].SubItems.IndexOf(s);
    if i>=0 then
      showmessage('已经有相同的项目名称')
      

  3.   

         if  Trim(YCN) <>Trim(XCN)  then                              
     YCN 哪來的??
      

  4.   

    如果楼主的listview允许多行选择,那么你的全局变量YCN的类型定义有问题,不能用字符串类型,而应改成数组类型
    procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; 
      Selected: Boolean); 
    var 
      i:integer; 
    begin 
      if  listview1.selected <>nil  then 
      begin 
        for i:=ListView1.Items.Count-1  downto  0  Do 
          if  ListView1.Items[i].Selected then 
          begin 
            YCN:=ListView1.Items[i].Caption;//全局变量,获取变更前的ListView1名称,用于下面的更新 
           end; 
      end; 
    end; 
    从你的代码实现的效果来看,你把所有选中的caption都放到一个字符串变量中,因此在检查是否修改时,肯定是都修改过了。不知道楼主能否明白。
      

  5.   

    我不需要listview多行选择,这个地方接收bdmh 代码,已改成下面代码:
    procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    begin
      str := Item.Caption;               //str全局变量
    end;昨天反复测试过,两个问题仍然有问题,期待解决中!
      

  6.   

    这样试试
    procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    var
      s1,s2:string;
    begin
      if self.vg_item=nil then
      else
      begin
        if Item<>self.vg_item then
        begin
          s1:=self.vg_caption;
          s2:=self.vg_item.Caption;
          self.Label1.Caption:=s1;
          self.Label2.Caption:=s2;
        end;
      end;
      self.vg_item:=Item;
      self.vg_caption:=item.Caption;
    end;
      

  7.   

    应该是这样,上面那个有点问题procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    var
      s1,s2:string;
    begin
      if Selected then
        Item.Checked:=True
      else
        item.Checked:=False;
      if Selected then
      begin
        if self.vg_item=nil then
        else
        begin
          if Item<>self.vg_item then
          begin
            s1:=self.vg_caption;
            s2:=self.vg_item.Caption;
            self.Label1.Caption:=s1;
            self.Label2.Caption:=s2;
          end;
        end;
        self.vg_item:=Item;
        self.vg_caption:=item.Caption;
      end;
    end;
      

  8.   

      if Selected then
        Item.Checked:=True
      else
        item.Checked:=False;
    这几句去掉就行,vg_item:TListItem;vg_caption:string定义为全局变量
      

  9.   

    问题解决了,现在把代码贴出来,请高手看一看有没有其他问题:
    procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    begin
          str:=Item.Caption;                                 //全局变量,获取只是变更前的ListView1名称,用于下面的更新
    end;procedure TForm1.ListView1Edited(Sender: TObject; Item: TListItem;                 //更新listview1时更新数据库
      var S: String);
    var
         i,n:integer;
         TorF : Boolean;
    begin
          begin
                   TorF := False;
                   for i:=ListView1.Items.Count-1  downto  0  Do
                   begin
                              n := CompareStr(ListView1.Items[i].Caption, Trim(S));
                              if n = 0 then
                              begin
                                        TorF := True;
                                        break;
                              end;
                   end;
           end;
          if TorF  then //找到同名提示是否替换
           begin
                   MessageBox(handle,PChar(' 方案 < '+s+' > 名称已存在  '),'提示信息',MB_ICONASTERISK);                     
                     s:=str;
                     Abort;
           end
           else
           begin
                 with ADOQuery1 do
                 begin
                            close;
                            SQL.Clear;
                            SQL.Text:='UPDATE ……';
                            ExecSql;
                 end;
           end;
    end;