RLText: String; Button: TMouseButton);
begin
if Button = mbLeft then
ShellExecute(Handle, nil, PChar(URLText), nil, nil, SW_SHOW);
end;
B.为了节约内存,优化运行,我们总是动态创建组件。可当用完之后,如果不及时彻底的将其从内存中清理出去,那就有违我们的初衷了。可怎么“杀死”所创建的组件? 比如创建了一个Edit控件,现在想让它消失,但用Edit.Free后,调用Edit.Text却仍然存在……我们知道,光Free是不行的,这只是将Edit所指向的内存空间释放了,但是指针并没有设定为nil,当调用Edit.Text时,Delphi仍然会根据Edit提供的指针访问已经释放的内存区域,所以会产生Access Violation ....错误。所以我们需要在Free后Edit:=nil或者FreeAndNil(只在Delphi5下有效)将指针nil掉,才能保证以后的正常运行。
C.将各
控件的提示文本显示于状态行上。这个可用Application的OnHint事件,但由于Application为不可件对象,因此可以采用如下方法:
......
public
procedure DisplayHint(Sender: TObject); //声明一个方法用于显示提示文本
end;
......
procedure TForm1.DisplayHint(Sender: TObject); //实现部分
begin
StatusBar1.SimpleText := GetLongHint(Application.Hint);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnHint := DisplayHint;
end;
这样显示在状态栏里的文本和提示框(就是那个自动出现的黄色小框)里的是一样的。如果想要在状态栏里的提示文本更加详细怎么办?其实,只要控件的Hint属性这样写:MyHint|It's just a MyHint!,就可以让“|”前的内容显示在提示框(Help Hint box)里,“|”的后面的内容显示在状态栏里了。
D.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;
就能设定焦点了。
==其他==