数据库读写?
文件传输?
远程控制?
远程维护?
......
------------------------------
众多的远程交互功能需求困扰你了吧? 来看个程序的界面:
该程序基于Delphi中间件QuickBurro轻松实现(网址:www.quickburro.com),下面是部分代码:、
//
// 当顺利连接到本地节点时,输入登陆参数...
procedure TMainForm.QBConnection1Connected(Sender: TObject);
begin
failtimes:=0;
CurrentNodeId:=qbconnection1.NodeId;
CurrentDrive:='';
CurrentPath:='';
statusbar.Panels[0].Text:=' 当前节点:'+CurrentNodeId;
form2.showmodal;
ShowNodeTree;
end;//
// 关闭确认...
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if application.MessageBox('是否确认从级联网远程管理器(NetAdmin)中退出?','退出确认',mb_okcancel+mb_iconquestion)<>IDOK then
begin
canclose:=false;
exit;
end;
syncburro1.UserLogout;
canclose:=true;
end;//
// 得到一个节点代码中的顶层节点名...
// 对于Z#Y#X字符串,得到X
function TMainForm.TopNodeId(NodeId: string): string;
var
tmpstr: string;
j: integer;
begin
tmpstr:=nodeid;
j:=pos('#',tmpstr);
while j>0 do
begin
delete(tmpstr,1,j);
j:=pos('#',tmpstr);
end;
result:=tmpstr;
end;//
// 以当前节点为末端节点,显示节点树...
procedure TMainForm.ShowNodeTree;
var
tmpstr,nid: string;
newnode,Node: TTreeNode;
begin
treeview1.items.clear;
tmpstr:=CurrentNodeId;
node:=nil;
while true do
begin
nid:=topnodeid(tmpstr);
//
// 若是根节点...
if treeview1.Items.Count=0 then
Node:=Treeview1.Items.AddFirst(nil,nid)
//
// 不是根节点...
else
begin
newnode:=treeview1.Items.AddChild(node,nid);
node:=newnode;
end;
node.ImageIndex:=1;
node.SelectedIndex:=1;
//
// 假如不存在其它节点了,跳出循环...
if pos('#',tmpstr)<=0 then
break;
//
// 删除后部已经显示的上层名称...
delete(tmpstr,length(tmpstr)-length(nid),length(nid)+1);
end;
node.Selected:=true;
end;//
// 得到一个TreeView记录对应的节点全局代码的过程...
// 对于一个下层的Z,得到Z#Y#X代码的过程
function TMainForm.GetNodeId(ANode: TTreeNode): string;
var
Node: TTreeNode;
begin
if anode=nil then
begin
result:='';
exit;
end;
node:=anode;
result:=node.Text;
while node.Parent<>nil do
begin
node:=node.Parent;
result:=result+'#'+node.Text;
end;
end;//
// 选中节点改变时...
procedure TMainForm.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
//
// 先清除列表...
listview2.Items.Clear;
listview3.Items.Clear;
listview4.items.Clear;
CurrentNodeId:=GetNodeId(Node);
CurrentDrive:='';
CurrentPath:='';
statusbar.Panels[0].Text:=' 系统提示:选中节点['+CurrentNodeId+'].';
statusbar.Panels[1].Text:=' 当前节点:'+CurrentNodeId;
statusbar.Panels[2].Text:=' 下属节点:0';
statusbar.Panels[3].Text:=' 内网用户:0';
statusbar.Panels[4].Text:=' 驱动器数:0';
statusbar.Panels[5].Text:=' 当前路径:'+CurrentPath;
//
// 假如未选中,或选中节点不在线,返回...
if (Node=nil) or (node.ImageIndex=0) then
exit;
//
// 假如选中了,则需要接着按顺序获取该节点参数...
ShowSonNodeList(Node);
//
// 显示用户列表...
ShowUserList;
//
// 得到驱动器列表...
ShowDriverList;
end;//
// 显示节点列表...
procedure TMainForm.ShowSonNodeList(ParentNode: TTreeNode);
var
Cds: TClientDataset;
j: integer;
tmpstr: string;
Node: TTreeNode;
begin
ParentNode.DeleteChildren;
Cds:=TClientDataset.Create(nil);
SyncBurro1.FetchSonNodeList(CurrentNodeId,Cds);
CDS.First;
while not CDS.Eof do
begin
tmpstr:=trim(Cds.fieldbyname('NodeId').asstring);
j:=pos('#',tmpstr);
if j>0 then
tmpstr:=copy(tmpstr,1,j-1);
node:=TreeView1.Items.AddChild(ParentNode,tmpstr);
if trim(Cds.fieldbyname('Online').asstring)='1' then
node.ImageIndex:=1
else
node.ImageIndex:=0;
node.SelectedIndex:=node.ImageIndex;
CDS.next;
end;
TreeView1.Selected.Expand(true);
statusbar.Panels[2].text:=' 下属节点:'+inttostr(CDS.RecordCount);
statusbar.Panels[0].Text:=' 系统提示:获取当前节点的子节点表成功.';
Cds.free;
end;//
// 显示用户列表...
procedure TMainForm.ShowUserList;
var
Cds: TClientDataset;
j: integer;
tmpstr: string;
begin
Cds:=TClientDataset.Create(nil);
ListView2.Items.BeginUpdate;
ListView2.Items.Clear;
SyncBurro1.FetchUserList(CurrentNodeId,Cds);
CDS.First;
while not CDS.Eof do
begin
with listview2.Items.Add do
begin
caption:=inttostr(listview2.items.count);
subitems.Add(trim(cds.fieldbyname('UserId').asstring));
subitems.Add(trim(cds.fieldbyname('UserName').asstring));
subitems.Add(trim(cds.fieldbyname('UserTypeName').asstring));
subitems.Add(trim(cds.fieldbyname('IPAddress').asstring));
subitems.Add(trim(cds.fieldbyname('SyncPort').asstring));
if cds.fieldbyname('Online').asinteger=0 then
begin
subitems.add('□');
imageindex:=0;
end
else
begin
subitems.add('√');
imageindex:=1;
end;
end;
cds.next;
end;
ListView2.Items.EndUpdate;
statusbar.Panels[3].text:=' 内网用户:'+inttostr(listview2.items.count);
statusbar.Panels[0].Text:=' 系统提示:获取当前节点的用户列表成功.';
Cds.free;
end;//
// 显示驱动器列表...
procedure TMainForm.ShowDriverList;
var
j: integer;
tmpstr: string;
begin
RpcRemoteFiles1.GetDiskList(CurrentNodeId,tmpstr);
ListView3.Items.BeginUpdate;
ListView3.Items.Clear;
j:=pos(#13#10,tmpstr);
while j>0 do
begin
with listview3.Items.add do
begin
caption:=trim(copy(tmpstr,1,j-1));
imageindex:=0;
end;
delete(tmpstr,1,j);
j:=pos(#13#10,tmpstr);
end;
statusbar.Panels[4].text:=' 驱动器数:'+inttostr(listview3.items.count);
statusbar.Panels[0].Text:=' 系统提示:获取当前节点的驱动器列表成功.';
if listview3.Items.Count>0 then
listview3.Items[0].Selected:=true;
ListView3.Items.EndUpdate;
end;//
// 当选中一个驱动器时,索取其文件列表...
procedure TMainForm.ListView3SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if not selected then
exit;
if copy(listview3.selected.caption,1,2)=currentdrive then
exit;
currentdrive:=copy(listview3.selected.caption,1,2);
currentpath:=currentdrive+'\';
statusbar.Panels[5].text:=' 当前路径:'+CurrentPath;
ShowFileList;
end;//
// 显示文件列表的过程...
procedure TMainForm.ShowFileList;
var
Cds: TClientDataset;
j,attr: integer;
tmpstr: string;
begin
listview4.Items.BeginUpdate;
listview4.Items.Clear;
listview4.Items.EndUpdate;
//
// A:盘不允许访问...
if uppercase(currentdrive)='A:' then
exit;
//
// 得到文件列表...
Cds:=TClientDataset.Create(nil);
RpcRemoteFiles1.ListFiles(CurrentNodeId,CurrentPath,faAnyFile,'*.*',Cds);
//
// 显示列表...
cds.First;
j:=1;
while not cds.Eof do
begin
with listview4.Items.Add do
begin
caption:=inttostr(j);
subitems.add(trim(cds.fieldbyname('FileName').asstring));
tmpstr:=trim(cds.fieldbyname('FileDateTime').asstring);
tmpstr:=copy(tmpstr,1,4)+'-'+copy(tmpstr,5,2)+'-'+copy(tmpstr,7,2)+' '+copy(tmpstr,9,2)+':'+copy(tmpstr,11,2)+':'+copy(tmpstr,13,2);
subitems.add(tmpstr);
subitems.add(trim(cds.fieldbyname('FileSize').asstring));
attr:=cds.fieldbyname('FileAttr').asinteger;
if (attr and $20)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $1)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $2)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $4)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $8)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $10)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $10)<>0 then
imageindex:=1
else
begin
if (attr and $8)<>0 then
imageindex:=2
else
imageindex:=0;
end;
end;
inc(j);
cds.next;
end;
cds.Free;
statusbar.Panels[0].Text:=' 系统提示:获取当前路径的文件列表成功.';
end;
文件传输?
远程控制?
远程维护?
......
------------------------------
众多的远程交互功能需求困扰你了吧? 来看个程序的界面:
该程序基于Delphi中间件QuickBurro轻松实现(网址:www.quickburro.com),下面是部分代码:、
//
// 当顺利连接到本地节点时,输入登陆参数...
procedure TMainForm.QBConnection1Connected(Sender: TObject);
begin
failtimes:=0;
CurrentNodeId:=qbconnection1.NodeId;
CurrentDrive:='';
CurrentPath:='';
statusbar.Panels[0].Text:=' 当前节点:'+CurrentNodeId;
form2.showmodal;
ShowNodeTree;
end;//
// 关闭确认...
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if application.MessageBox('是否确认从级联网远程管理器(NetAdmin)中退出?','退出确认',mb_okcancel+mb_iconquestion)<>IDOK then
begin
canclose:=false;
exit;
end;
syncburro1.UserLogout;
canclose:=true;
end;//
// 得到一个节点代码中的顶层节点名...
// 对于Z#Y#X字符串,得到X
function TMainForm.TopNodeId(NodeId: string): string;
var
tmpstr: string;
j: integer;
begin
tmpstr:=nodeid;
j:=pos('#',tmpstr);
while j>0 do
begin
delete(tmpstr,1,j);
j:=pos('#',tmpstr);
end;
result:=tmpstr;
end;//
// 以当前节点为末端节点,显示节点树...
procedure TMainForm.ShowNodeTree;
var
tmpstr,nid: string;
newnode,Node: TTreeNode;
begin
treeview1.items.clear;
tmpstr:=CurrentNodeId;
node:=nil;
while true do
begin
nid:=topnodeid(tmpstr);
//
// 若是根节点...
if treeview1.Items.Count=0 then
Node:=Treeview1.Items.AddFirst(nil,nid)
//
// 不是根节点...
else
begin
newnode:=treeview1.Items.AddChild(node,nid);
node:=newnode;
end;
node.ImageIndex:=1;
node.SelectedIndex:=1;
//
// 假如不存在其它节点了,跳出循环...
if pos('#',tmpstr)<=0 then
break;
//
// 删除后部已经显示的上层名称...
delete(tmpstr,length(tmpstr)-length(nid),length(nid)+1);
end;
node.Selected:=true;
end;//
// 得到一个TreeView记录对应的节点全局代码的过程...
// 对于一个下层的Z,得到Z#Y#X代码的过程
function TMainForm.GetNodeId(ANode: TTreeNode): string;
var
Node: TTreeNode;
begin
if anode=nil then
begin
result:='';
exit;
end;
node:=anode;
result:=node.Text;
while node.Parent<>nil do
begin
node:=node.Parent;
result:=result+'#'+node.Text;
end;
end;//
// 选中节点改变时...
procedure TMainForm.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
//
// 先清除列表...
listview2.Items.Clear;
listview3.Items.Clear;
listview4.items.Clear;
CurrentNodeId:=GetNodeId(Node);
CurrentDrive:='';
CurrentPath:='';
statusbar.Panels[0].Text:=' 系统提示:选中节点['+CurrentNodeId+'].';
statusbar.Panels[1].Text:=' 当前节点:'+CurrentNodeId;
statusbar.Panels[2].Text:=' 下属节点:0';
statusbar.Panels[3].Text:=' 内网用户:0';
statusbar.Panels[4].Text:=' 驱动器数:0';
statusbar.Panels[5].Text:=' 当前路径:'+CurrentPath;
//
// 假如未选中,或选中节点不在线,返回...
if (Node=nil) or (node.ImageIndex=0) then
exit;
//
// 假如选中了,则需要接着按顺序获取该节点参数...
ShowSonNodeList(Node);
//
// 显示用户列表...
ShowUserList;
//
// 得到驱动器列表...
ShowDriverList;
end;//
// 显示节点列表...
procedure TMainForm.ShowSonNodeList(ParentNode: TTreeNode);
var
Cds: TClientDataset;
j: integer;
tmpstr: string;
Node: TTreeNode;
begin
ParentNode.DeleteChildren;
Cds:=TClientDataset.Create(nil);
SyncBurro1.FetchSonNodeList(CurrentNodeId,Cds);
CDS.First;
while not CDS.Eof do
begin
tmpstr:=trim(Cds.fieldbyname('NodeId').asstring);
j:=pos('#',tmpstr);
if j>0 then
tmpstr:=copy(tmpstr,1,j-1);
node:=TreeView1.Items.AddChild(ParentNode,tmpstr);
if trim(Cds.fieldbyname('Online').asstring)='1' then
node.ImageIndex:=1
else
node.ImageIndex:=0;
node.SelectedIndex:=node.ImageIndex;
CDS.next;
end;
TreeView1.Selected.Expand(true);
statusbar.Panels[2].text:=' 下属节点:'+inttostr(CDS.RecordCount);
statusbar.Panels[0].Text:=' 系统提示:获取当前节点的子节点表成功.';
Cds.free;
end;//
// 显示用户列表...
procedure TMainForm.ShowUserList;
var
Cds: TClientDataset;
j: integer;
tmpstr: string;
begin
Cds:=TClientDataset.Create(nil);
ListView2.Items.BeginUpdate;
ListView2.Items.Clear;
SyncBurro1.FetchUserList(CurrentNodeId,Cds);
CDS.First;
while not CDS.Eof do
begin
with listview2.Items.Add do
begin
caption:=inttostr(listview2.items.count);
subitems.Add(trim(cds.fieldbyname('UserId').asstring));
subitems.Add(trim(cds.fieldbyname('UserName').asstring));
subitems.Add(trim(cds.fieldbyname('UserTypeName').asstring));
subitems.Add(trim(cds.fieldbyname('IPAddress').asstring));
subitems.Add(trim(cds.fieldbyname('SyncPort').asstring));
if cds.fieldbyname('Online').asinteger=0 then
begin
subitems.add('□');
imageindex:=0;
end
else
begin
subitems.add('√');
imageindex:=1;
end;
end;
cds.next;
end;
ListView2.Items.EndUpdate;
statusbar.Panels[3].text:=' 内网用户:'+inttostr(listview2.items.count);
statusbar.Panels[0].Text:=' 系统提示:获取当前节点的用户列表成功.';
Cds.free;
end;//
// 显示驱动器列表...
procedure TMainForm.ShowDriverList;
var
j: integer;
tmpstr: string;
begin
RpcRemoteFiles1.GetDiskList(CurrentNodeId,tmpstr);
ListView3.Items.BeginUpdate;
ListView3.Items.Clear;
j:=pos(#13#10,tmpstr);
while j>0 do
begin
with listview3.Items.add do
begin
caption:=trim(copy(tmpstr,1,j-1));
imageindex:=0;
end;
delete(tmpstr,1,j);
j:=pos(#13#10,tmpstr);
end;
statusbar.Panels[4].text:=' 驱动器数:'+inttostr(listview3.items.count);
statusbar.Panels[0].Text:=' 系统提示:获取当前节点的驱动器列表成功.';
if listview3.Items.Count>0 then
listview3.Items[0].Selected:=true;
ListView3.Items.EndUpdate;
end;//
// 当选中一个驱动器时,索取其文件列表...
procedure TMainForm.ListView3SelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
if not selected then
exit;
if copy(listview3.selected.caption,1,2)=currentdrive then
exit;
currentdrive:=copy(listview3.selected.caption,1,2);
currentpath:=currentdrive+'\';
statusbar.Panels[5].text:=' 当前路径:'+CurrentPath;
ShowFileList;
end;//
// 显示文件列表的过程...
procedure TMainForm.ShowFileList;
var
Cds: TClientDataset;
j,attr: integer;
tmpstr: string;
begin
listview4.Items.BeginUpdate;
listview4.Items.Clear;
listview4.Items.EndUpdate;
//
// A:盘不允许访问...
if uppercase(currentdrive)='A:' then
exit;
//
// 得到文件列表...
Cds:=TClientDataset.Create(nil);
RpcRemoteFiles1.ListFiles(CurrentNodeId,CurrentPath,faAnyFile,'*.*',Cds);
//
// 显示列表...
cds.First;
j:=1;
while not cds.Eof do
begin
with listview4.Items.Add do
begin
caption:=inttostr(j);
subitems.add(trim(cds.fieldbyname('FileName').asstring));
tmpstr:=trim(cds.fieldbyname('FileDateTime').asstring);
tmpstr:=copy(tmpstr,1,4)+'-'+copy(tmpstr,5,2)+'-'+copy(tmpstr,7,2)+' '+copy(tmpstr,9,2)+':'+copy(tmpstr,11,2)+':'+copy(tmpstr,13,2);
subitems.add(tmpstr);
subitems.add(trim(cds.fieldbyname('FileSize').asstring));
attr:=cds.fieldbyname('FileAttr').asinteger;
if (attr and $20)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $1)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $2)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $4)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $8)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $10)=0 then
subitems.add('.')
else
subitems.add('√');
if (attr and $10)<>0 then
imageindex:=1
else
begin
if (attr and $8)<>0 then
imageindex:=2
else
imageindex:=0;
end;
end;
inc(j);
cds.next;
end;
cds.Free;
statusbar.Panels[0].Text:=' 系统提示:获取当前路径的文件列表成功.';
end;
解决方案 »
- 高分求教:三层结构,客户端向Oracle数据库BLOB字段存取图片的问题?
- 关于clientdataset查询语句问题!谢谢帮忙~女朋友急等~~
- delphi8编译Vcl Forms application有问题?
- 如何将一组JPG文件转成一个MPG格式文件?
- 请教关于dbgrid的一个入门问题!
- report 报表中如何在每一页上都显示打印表头
- 谁会用摄像头编程呀?罗技摄像头提供了ocx控件但调用出错??????
- 如何用数组实现动态打印分页?救救我,高手请进,谢谢
- 如何合并Tfilestream文件???高分请教!~~~
- 送50分,怎么在delphi编程中得到本机工作组名称
- TRichviewEdit 如何实现中文排版的两端分散对齐
- one or more lines were too long and have been truncated
价格范围?