窗体中左右两侧分别有两个listbox:listbox1和listbox2,有六个按钮:全选、全清空、增加、删除、上移、下移
listbox1中有三项:香蕉(对应代码为"XJ")、苹果(对应代码为"PG")、西瓜(对应代码为"XG"
现在想实现如下功能:
1、listbox1和listbox2中的项(水果)显示的是名称、但是保存到数据库时能同时得到用户选择的水果的名称及其代码
2、单击全选或增加按钮时将listbox1中选择的项添加到listbox2,同时这些项从listbox1中删除;同样的单击全清空或删除按钮时将listbox2中选择的项返回到listbox2,同时这些项从listbox2中删除
3、单击上移、下移按钮时可对listbox2中的选择项移到别的位置,保存到数据库时记录下listbox2中各项的索引位置代码如何写?
listbox1中有三项:香蕉(对应代码为"XJ")、苹果(对应代码为"PG")、西瓜(对应代码为"XG"
现在想实现如下功能:
1、listbox1和listbox2中的项(水果)显示的是名称、但是保存到数据库时能同时得到用户选择的水果的名称及其代码
2、单击全选或增加按钮时将listbox1中选择的项添加到listbox2,同时这些项从listbox1中删除;同样的单击全清空或删除按钮时将listbox2中选择的项返回到listbox2,同时这些项从listbox2中删除
3、单击上移、下移按钮时可对listbox2中的选择项移到别的位置,保存到数据库时记录下listbox2中各项的索引位置代码如何写?
{定义一个保存你所需数据的记录类型和记录类型的指针}
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类型}
一般在FormDestroy的时候写个循环:
var
pn:PNode;
begin
for i:= ListBox1.Count-1 downto 0 do begin {一般从后往前,否则会有问题}
pn := ListBox1.Items.Objects[i];
Dispose(pn);
end;第二问不回答了,基本的增加项问题了。
第三问就是在onKeyDown里写移动项的,也不难了
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.
============================================================================================
这个代码怎么写?
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;