糖炒栗子

cheap to talk,show muscle would be better...

导航

Delphi:assigned,TTreeView,return/result,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;


 

posted on 2011-12-01 10:01  糖炒栗子  阅读(579)  评论(0编辑  收藏  举报