窗体中左右两侧分别有两个listbox:listbox1和listbox2,有六个按钮:全选、全清空、增加、删除、上移、下移
listbox1中有三项:香蕉(对应代码为"XJ")、苹果(对应代码为"PG")、西瓜(对应代码为"XG"
现在想实现如下功能:
1、listbox1和listbox2中的项(水果)显示的是名称、但是保存到数据库时能同时得到用户选择的水果的名称及其代码
2、单击全选或增加按钮时将listbox1中选择的项添加到listbox2,同时这些项从listbox1中删除;同样的单击全清空或删除按钮时将listbox2中选择的项返回到listbox2,同时这些项从listbox2中删除
3、单击上移、下移按钮时可对listbox2中的选择项移到别的位置,保存到数据库时记录下listbox2中各项的索引位置代码如何写?

解决方案 »

  1.   

    type
      {定义一个保存你所需数据的记录类型和记录类型的指针}
      PNode = ^TNode;
      TNode = record
        nCode: integer;
        nName : string[255];
        nIndex: integer;    
      end;{增加节点的时候要把数据附加上去}
    var 
     pn:PNode; 
    begin  Query1.Close; 
     Query1.SQL.Text:='Select * from fruits'; 
     Query1.Open; 
     while not Query1.Eof do 
     begin 
       new(pn); 
       pn^.cCode := Query1.fieldbyname('ccode').AsString; 
       pn^.cName := Query1.fieldbyname('bb').AsString; 
       ListBox1.Items.AddObject(pn^.cName,Tobject(pn)); {使用AddObject方法}
       Query1.Next; 
     end; 
    end; {在保存的时候取出节点的数据}
    //...只写关键的代码了......
    PNode(ListBox1.Items.Objects[i])^.cCode  ...{把某一项的object取出来,强制转换成pNode类型}
      

  2.   

    最近要记得把指针释放掉
    一般在FormDestroy的时候写个循环:
    var
      pn:PNode;
    begin
    for i:= ListBox1.Count-1 downto 0 do begin  {一般从后往前,否则会有问题}
      pn := ListBox1.Items.Objects[i];
      Dispose(pn);
    end;第二问不回答了,基本的增加项问题了。
    第三问就是在onKeyDown里写移动项的,也不难了
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, ADODB;
    type
      pfuit=^Tfuit;
      Tfuit=record
        code: string;
        name: String;
        desc: String;
      end;type
      TForm1 = class(TForm)
        ListBox1: TListBox;
        ListBox2: TListBox;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        ADOQuery1: TADOQuery;
        ADOConnection1: TADOConnection;
        procedure Button1Click(Sender: TObject);
        procedure ListBox1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
        Ffuit:pfuit;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);  //初始化listbox1中的内容
    begin
      New(Ffuit);
      Ffuit.code :='xj';
      Ffuit.name :='香蕉';
      Ffuit.desc :='产自海南';
      Listbox1.Items.AddObject(Ffuit.name,TObject(Ffuit));  New(Ffuit);
      Ffuit.code :='xg';
      Ffuit.name :='西瓜';
      Ffuit.desc :='产自北京大兴';
      Listbox1.Items.AddObject(Ffuit.name,TObject(Ffuit));end;procedure TForm1.ListBox1Click(Sender: TObject);  //选中listbox1中信息时显示
    begin
      New(Ffuit);
      Ffuit := pfuit(Listbox1.Items.Objects[Listbox1.ItemIndex]);
      showmessage(Ffuit.code+'/'+Ffuit.name+'/'+Ffuit.desc);
    end;procedure TForm1.Button2Click(Sender: TObject);  //将listbox1中内容写到listbox2
    begin
      New(Ffuit);
      Ffuit := pfuit(Listbox1.Items.Objects[Listbox1.ItemIndex]);
      Listbox2.Items.AddObject(Ffuit.name,TObject(Ffuit));
      Listbox1.Items.Delete(Listbox1.ItemIndex);
    end;procedure TForm1.Button3Click(Sender: TObject); //保存到数据库
    var
      i: integer;
    begin
      adoconnection1.BeginTrans;
      try
        for i:=0 to Listbox1.Items.Count-1 do
        begin
          New(Ffuit);
          Ffuit := pfuit(Listbox1.Items.Objects[i]);
          with adoquery1 do
          begin
            close;
            sql.text := ' insert into t1 (code,name) values(:code,:name)';
            Parameters.ParamByName('code').Value :=  Ffuit.code;
            Parameters.ParamByName('name').Value :=  Ffuit.name;
            ExecSql;
          end;
        end;
        adoconnection1.CommitTrans;
      except
        adoconnection1.RollbackTrans;
      end;end;end.
      

  4.   

    3、单击上移、下移按钮时可对listbox2中的选择项移到别的位置,保存到数据库时记录下listbox2中各项的索引位置
    ============================================================================================
    这个代码怎么写?
      

  5.   

    procedure TForm1.Button6Click(Sender: TObject);  //向上
    var
      i:integer;
    begin
      i := ListBox1.ItemIndex;//先记下当前的位置
      New(Ffuit);
      Ffuit := pfuit(Listbox1.Items.Objects[i]);
      ListBox1.Items.Delete(i);
      listBox1.Items.InsertObject(i-1,Ffuit.name,TObject(Ffuit));
    end;
    procedure TForm1.Button7Click(Sender: TObject); //向下
    var
      i:integer;
    begin
      i := ListBox1.ItemIndex;//先记下当前的位置
      New(Ffuit);
      Ffuit := pfuit(Listbox1.Items.Objects[i]);
      ListBox1.Items.Delete(i);
      listBox1.Items.InsertObject(i+1,Ffuit.name,TObject(Ffuit));
    end;