Delphi:assigned,TTreeView,return/result,listview

本文介绍了Delphi编程语言中的实用技巧,包括使用assigned检查对象是否为空、TTreeView和ListView组件的高级操作方法,如添加、删除节点,以及实现数据排序等功能。

assigned 是用来判断某一指针(pointer)或过程引用是否为nil(空),如果为空则返回假(false)。用法示例(防止窗体被实例化多次):
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Not assigned(form2)) then
  begin
    form2:=Tform2.Create(Self);
  end;
  form2.show;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
  form2:=nil;  //这句比较重要,窗体被释放时,窗体变量并不会自动变空
end;


TTreeView
procedure TForm_login.cxButton1Click(Sender: TObject); // 登录
var
  newNode0, newNode1, newNode2: TTreenode;//管理每层结点
begin
  if not Assigned(Form_main) then
  begin
    Form_main := TForm_main.Create(nil);
  end;
  Form_main.Show;
  if cxComboBox1.ItemIndex = 1 then
  begin
    Form_main.cxTreeView1.Items.Clear;
    with Form_main.cxTreeView1.Items do
    begin
      newNode0 := add(nil, 'root');
      newNode1 := AddChildFirst(newNode0, 'child1');
      newNode2 := AddChildFirst(newNode1, 'child10');
      newNode1 := AddChild(newNode0, 'child2');
      newNode2 := add(newNode2, 'child11');
      newNode0 := add(nil, 'root1');
    end;
    ShowMessage(string(Form_main.cxTreeView1.Items.Item[3].Text));
  end;
  self.Hide;
end;


在c++中: 跳出一个函数用return(返回类型),在return的同时就跳出函数了, 无返回类型函数直接return就跳出了。   
但delphi不一样:   result中保存的是返回值,但真正跳出函数要用exit,   exit在退出函数的同时把result值返回,   如果是procedure,就没有result

delphi中result一般做为函数的返回值,不做为退出条件,退出条件是exit,abort等,给result赋值不会退出函数。


listview 指定行 指定列的值 listview基本用法大全
//增加项或列(字段)  
ListView1.Clear;  
ListView1.Columns.Clear;  
ListView1.Columns.Add;  
ListView1.Columns.Add;  
ListView1.Columns.Add;  
ListView1.Columns.Items[0].Caption:='id';
ListView1.Columns.Items[1].Caption:='type';
ListView1.Columns.Items[2].Caption:='title'; 
ListView1.Columns.Items[2].Width:=300;  
Listview1.ViewStyle:=vsreport;  
Listview1.GridLines:=true;//此处代码也可以直接在可视化编辑器中完成,也可写成以下这样  
begin  
with listview1 do 
begin
Columns.Add;  
Columns.Add;  
Columns.Add;  
ViewStyle:=vsreport;  
GridLines:=true;  
columns.items[0].caption:='进程名';  
columns.items[1].caption:='进程ID';  
columns.items[2].caption:='进程文件路径';  
Columns.Items[0].Width:=100;  
Columns.Items[1].Width:=100;  
Columns.Items[2].Width:=150;  
end  
end;  
//增加记录  
with listview1.items.add do  
begin  
caption:='1212';   
subitems.add('hh1');   
subitems.add('hh2');   
end;   
//删除   
listview1.items.delete(0);  
//从数据库表里读取数据写入Listview  
var  
Titem:Tlistitem;       //此处一定要预定义临时记录存储变量.  
begin  
ListView1.Items.Clear;  
with adoquery1 do 
begin  
close;  
sql.Clear;  
sql.Add('select spmc,jg,sl from kcxs');  
Open;  
ListView1.Items.Clear;  
while not eof do 
begin  
Titem:=ListView1.Items.add;  
Titem.Caption:=FieldByName('spmc').Value;  
Titem.SubItems.Add(FieldByName('sl').Value);  
Titem.SubItems.Add(FieldByName('jg').Value);  
next;  
end;  
//删除   
ListView1.DeleteSelected;  
//如何取得ListView中选中行的某一列的值  
procedure TForm1.Button2Click(Sender: TObject);  
begin  
ShowMessage(ListView1.Selected.SubItems.Strings[1]); //返回选中行第三列中的值  
end;  
showMessage(listView1.Selected.Caption);   //返回选中行第一列的值.  
第1列的值: -->>> ListView1.Selected.Caption     
第i列的值(i>1):-->>> ListView1.Selected.SubItems.Strings[i]  
ListView1.Items.Item[1].SubItems.GetText); //取得listview某行某列的值  
Edit2.Text := listview1.Items[1].SubItems.strings[0];   //读第1行第2列  
表示第2行,原因是从0开始地得嘛,0表示第二列,原因是第1列就为Caption 
返回选中行所有子列值.是以回车符分开的,你还要从中剥离出来你要的子列的值。    
showMessage(ListView1.Selected.SubItems.GetText);     
ListView 简单排序的实现  
ListView 排序  
怎样实现单击一下按升序,再单击一下按降序。  
function CustomSortProc(Item1, Item2: TListItem; ColumnIndex: integer): integer; stdcall;  
begin  
if ColumnIndex = 0 then  
Result := CompareText(Item1.Caption,Item2.Caption)  
else 
Result := CompareText(Item1.SubItems[ColumnIndex-1],Item2.SubItems[ColumnIndex-1])  
end;   
procedure TFrmSrvrMain.ListView1ColumnClick(Sender: TObject;  
Column: TListColumn);  
begin  
ListView1.CustomSort(@CustomSortProc,Column.Index);  
end;  
===============================================================  
//增加   
i := ListView1.Items.Count;   
with ListView1 do  
begin   
ListItem:=Items.Add;   
ListItem.Caption:= IntToStr(i);   
ListItem.SubItems.Add('第 '+IntToStr(i)+' 行');   
ListItem.SubItems.Add('第三列内容');   
end;   
//按标题删除   
for i:=ListView1.Items.Count-1 downto 0 Do   
if ListView1.Items[i].Caption = Edit1.Text then   
begin   
ListView1.Items.Item[i].Delete(); //删除当前选中行   
end;   
//选中一行   
if ListView1.Selected <> nil then   
Edit1.Text := ListView1.Selected.Caption;   
// listview1.Items[Listview1.Items.Count -1].Selected := True;   
// listview1.Items[Listview1.Items.Count -1].MakeVisible(True);   
procedure TForm1.Button2Click(Sender: TObject); // 选择第一条   
begin   
listview1.SetFocus;   
listview1.Items[0].Selected := True;   
end;   
procedure TForm1.Button1Click(Sender: TObject); // 选择最后一条   
begin   
listview1.SetFocus;   
listview1.Items[Listview1.Items.Count -1].Selected := True;   
end;   
//这是个通用的过程   
procedure ListViewItemMoveUpDown(lv : TListView; Item : TListItem; MoveUp, SetFocus : Boolean);   
var   
DestItem : TListItem;   
begin   
if (Item = nil) or ((Item.Index - 1 < 0) and MoveUp) or   
 ((Item.Index + 1 >= lv.Items.Count) and (not MoveUp))   
then Exit;   
lv.Items.BeginUpdate;   
try  
if MoveUp then   
DestItem := lv.Items.Insert(Item.Index - 1)   
else  
DestItem := lv.Items.Insert(Item.Index + 2);   
DestItem.Assign(Item);   
lv.Selected := DestItem;   
Item.Free;   
finally  
lv.Items.EndUpdate;   
end;   
if SetFocus then lv.SetFocus;   
DestItem.MakeVisible(False);   
end;   
//此为调用过程,可以任意指定要移动的Item,下面是当前(Selected)Item   
ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True);//上移   
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移   
TListView组件使用方法   
引用CommCtrl单元   
procedure TForm1.Button1Click(Sender: TObject);   
begin   
ListView_DeleteColumn(MyListView.Handle, i);//i是要删除的列的序号,从0开始   
end;   
用LISTVIEW显示表中的信息:   
procedure viewchange(listv:tlistview;table:tcustomadodataset;var i:integer);   
begin   
tlistview(listv).Items.BeginUpdate; {listv:listview名}   
try  
tlistview(listv).Items.Clear;   
with table do {table or query名}   
begin   
active:=true;   
first;   
while not eof do  
begin   
listitem:=tlistview(listv).Items.add;   
listitem.Caption:=trim(table.fields[i].asstring);   
// listitem.ImageIndex:=8;   
next;   
end;   
end;   
finally  
tlistview(listv).Items.EndUpdate;   
end;   
end;   
ListView使用中的一些要点。以下以一个两列的ListView为例。   
→增加一行:   
with ListView1 do  
begin   
ListItem:=Items.Add;   
ListItem.Caption:='第一列内容';   
ListItem.SubItems.Add('第二列内容');   
end;   
→清空ListView1:   
ListView1.Items.Clear;   
→得到当前被选中行的行的行号以及删除当前行:   
For i:=0 to ListView1.Items.Count-1 Do   
If ListView1.Items[i].Selected then //i=ListView1.Selected.index   
begin   
ListView1.Items.Delete(i); //删除当前选中行   
end;   
当然,ListView有OnSelectItem事件,可以判断选择了哪行,用个全局变量把它赋值出来。   
→读某行某列的操作:   
Edit1.Text := listview1.Items[i].Caption; //读第i行第1列   
Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列   
Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列   
以次类推,可以用循环读出整列。   
→将焦点上移一行:   
For i:=0 to ListView1.Items.Count-1 Do   
If (ListView1.Items[i].Selected) and (i>0) then   
begin   
ListView1.SetFocus;   
ListView1.Items.Item[i-1].Selected := True;   
end;   
不过在Delphi6中,ListView多了一个ItemIndex属性,所以只要   
ListView1.SetFocus;   
ListView1.ItemIndex:=3;   
就能设定焦点了。   
Delphi的listview能实现交替颜色么?   
procedure TForm1.ListView1CustomDrawItem(   
Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;   
var DefaultDraw: Boolean);   
var   
i: integer;   
begin   
i:= (Sender as TListView).Items.IndexOf(Item);   
if odd(i) then sender.Canvas.Brush.Color:= $02E0F0D7   
else sender.Canvas.Brush.Color:= $02F0EED7;   
Sender.Canvas.FillRect(Item.DisplayRect(drIcon));   
end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值