您好,有两个问题,存在于如下代码中(100分)

  • 主题发起人 wjlsmail
  • 开始时间
W

wjlsmail

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,有两个问题,存在于如下代码中
1.如何执行DOS命令,我用ShellExecute不行,可能是我用的不对,望大家指正
2.程序中,需要ADOQuery 、DBGrid动态生成,但下面的代码无法在生成的DBGrid中显示数据,望大家指正
(在Button1Click中,即使用静态的DBGrid也不能显示)

谢谢您
unit Unit1;
Uses shellapi ...
//ShellExecute use ShellAPI
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection; //已正确链接到数据库
Button1: TButton;
DataSource1: TDataSource; //静态给出
Label1: TLabel;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
with TDBGrid.Create(self) do
begin
Name := 'DBGrid1' ;
Left := 48 ;
Top := 48 ;
Width := 393 ;
Height := 217 ;
TabOrder := 1 ;
TitleFont.Charset := DEFAULT_CHARSET ;
TitleFont.Color := clWindowText ;
TitleFont.Height := -11 ;
TitleFont.Name := 'MS Sans Serif' ;
TitleFont.Style := [] ;
Parent := Form1 ;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with TADOQuery.Create(nil) do
begin
Try
begin
Name := 'ADOQuery1' ;
Connection := ADOConnection1 ;
Sql.Text := 'select * from jnbs' ;
DataSource1.DataSet := TADOQuery(FindComponent('ADOQuery1')) ;
TDBGrid(FindComponent('DBGrid2')).DataSource := DataSource1 ;
Open ;
end ;
Finally
Free ;
end ;
end ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShellExecute(handle,nil,pchar('c:/windows/Ping.Exe'),nil,nil,sw_shownormal);
//不能执行DOS命令
end;
end.

谢谢您
 

ShellExecute(handle,'open',pchar('ping.exe'),'127.0.0.1',nil,sw_shownormal);
 
Datasource1.active :=true;

我现在用delphi4.没发调试.你自己看看.
 
你的DBGrid 一个是 DBGrid1,一个是 DBGrid2

procedure TForm1.FormCreate(Sender: TObject);
begin
with TDBGrid.Create(self) do
begin
Name := 'DBGrid1' ;
Left := 48 ;
Top := 48 ;
Width := 393 ;
Height := 217 ;
TabOrder := 1 ;
TitleFont.Charset := DEFAULT_CHARSET ;
TitleFont.Color := clWindowText ;
TitleFont.Height := -11 ;
TitleFont.Name := 'MS Sans Serif' ;
TitleFont.Style := [] ;
Parent := Form1 ;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with TADOQuery.Create(nil) do
begin
Try
begin
Name := 'ADOQuery1' ;
Connection := ADOConnection1 ;
Sql.Text := 'select * from jnbs' ;
DataSource1.DataSet := ADOQuery1;///////////////
DBGrid2.DataSource := DataSource1 ;
Open ;
end ;
Finally
Free ;
end ;
end ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShellExecute(handle,'open',pchar('ping.exe'),'127.0.0.1',nil,sw_show);
//不能执行DOS命令
end;
end.

不行的话通过以下声明进行:
var
AdoQuery1:TAdoQuery;
DBGrid1:TDBGrid;
 

Finally
//Free ; //不要Free,要么将Finally改为except
end ;
另外看看DBGrid命名。
建议定义两个私有对象,一个为ADOQuery,一个为DBGrid
 
谢谢楼上几位前辈,
begin
Name := 'ADOQuery1' ;
Connection := ADOConnection1 ;
Sql.Text := 'select * from jnbs' ;
DataSource1.DataSet := TADOQuery(FindComponent('ADOQuery1')) ;
TDBGrid(FindComponent('DBGrid1')).DataSource := DataSource1 ;
//笔误,应该为 DBGrid1 ,程序中另一个DBGrid为 2
Open ;
end ;

还是不行,请大家再指点一下好吗 ? 要不写一个动态使用ADOQuery 、 DBGrid 的例子好吗?

谢谢您
 
private
{ Private declarations }
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
/////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
DBGrid1 := TDBGrid.Create(self);
with DBGrid1 do
begin
Left := 48 ;
Top := 48 ;
Width := 393 ;
Height := 217 ;
TabOrder := 1 ;
TitleFont.Charset := DEFAULT_CHARSET ;
TitleFont.Color := clWindowText ;
TitleFont.Height := -11 ;
TitleFont.Name := 'MS Sans Serif' ;
TitleFont.Style := [] ;
Parent := Form1 ;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1 := TADOQuery.Create(self);
with ADOQuery1 do
begin
Try
begin
Connection := ADOConnection1;
Sql.Text := 'select * from jnbs' ;
DataSource1.DataSet := ADOQuery1;
DBGrid1.DataSource := DataSource1 ;
Open ;
end ;
Finally
//Free ;
end ;
end ;
end;
 
试试下面的
procedure TForm1.Button1Click(Sender: TObject);
begin
with TADOQuery.Create(self) do
begin
Try
begin
Name := 'ADOQuery1' ;
Connection := ADOConnection1 ;
Sql.Text := 'select * from jnbs' ;
DataSource1.DataSet := TADOQuery(FindComponent('ADOQuery1')) ;
TDBGrid(FindComponent('DBGrid2')).DataSource := DataSource1 ;
Open ;
end ;
Finally
Free ;
end ;
end ;
end;
最好定义两个私有对象。

 
影子先生:
您好,
ShellExecute(handle,'open',pchar('ping.exe'),'127.0.0.1',nil,sw_shownormal);
可以执行Ping 命令了 ,谢谢您

您能否将 ShellExecute函数的用法,参数,简单的讲解一下,谢谢您
 
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(0,
'explore',
'C:/WINDOWS',
nil,
nil,
SW_SHOWNORMAL);
end;
WinExec('RegEdit /s yourfile.reg',SW_NORMAL);
//////////////////////////////////////////////////////////////
ShellExecute(0,nil,'regedit.exe','myfile.reg /v',nil,SW_SHOW);
procedure TForm1.Label1Click(Sender: TObject);

begin
Shellexecute(handle,nil,pchar('mailto:guihong@163.net'),nil,nil,sw_shownormal);
end;
procedure TForm1.Label1Click(Sender: TObject);

begin
Shellexecute(handle,nil,pchar('mailto:guihong@163.net'),nil,nil,sw_shownormal);
end;
 
谢谢
我先定义TDBGrid,TADOQuery的对象变量后,好了。 谢谢影子:)
代码同影子下先生给的。
但当我将用如下写法改了代码:
with TADOQuery.Create(self) do
begin
Try
Name := 'ADOQuery2' ;
Connection := ADOConnection1;
Sql.Text := 'select * from jnbs' ;
DataSource1.DataSet := TADOQuery(FindComponent('ADOQuery2'));
DBGrid2.DataSource := DataSource1 ;
Open ;
Finally
//Free ;
end ;
end ;
不行,没有显示纪录

当我将原来好了的代码中的DBGrid2用TDBGrid(FindComponent('DBGrid2'))引入时,编译可以通过
但无法执行
DBGrid2.DataSource := DataSource1 ;
换为
TDBGrid(FindComponent('DBGrid2')).DataSource := DataSource1 ;
编译可以通过但无法执行

我想请教: 这儿为什么用
类名(FindComponent(类的实例变量名))
不能引用该变量 ? 这种引入变量的用法多用在那儿 ? 谢谢

 
以下说明取自一份VB的中文帮助。

说明
查找与指定文件关联在一起的程序的文件名
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hwnd Long,指定一个窗口的句柄,有时候,windows程序有必要在创建自己的主窗口前显示一个消息框
lpOperation String,指定字串“open”来打开lpFlie文档,或指定“Print”来打印它
lpFile String,想用关联程序打印或打开一个程序名或文件名
lpParameters String,如lpszFlie是可执行文件,则这个字串包含传递给执行程序的参数
lpDirectory String,想使用的完整路径
nShowCmd Long,定义了如何显示启动程序的常数值。

nCmdShow Long,为窗口指定可视性方面的一个命令。请用下述任何一个常数
SW_HIDE 隐藏窗口,活动状态给令一个窗口
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态
SW_SHOWMAXIMIZED 最大化窗口,并将其激活
SW_SHOWMINIMIZED 最小化窗口,并将其激活
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口
SW_SHOWNORMAL 与SW_RESTORE相同


DBGrid2作为局部的对象创建,在代码执行后你还能使用它吗?
因为没有手动地Free,所以在Form上你还可以看到它。

 
问题一:试试这个。
Winexec(pchar('Ping 192.168.78.15'), SW_SHOW); //

问题二:
首先要定义两个变量,
上面有提到建立私有变量,
但是如果在全局范围内使用最好建立全局变量。
记得释放该对象:
//手动的释放。在某个按钮中定义:
//自动释放,防止漏网之鱼:
if DBGrid2<>nil then
DBGrid2.free;
 
谢谢影子,谢谢魏启明
请大家解释一下这个:

我先定义TDBGrid,TADOQuery的对象变量后,好了。
代码同影子先生给的。
但当我将用如下写法改了代码:
with TADOQuery.Create(self) do
begin
Try
Name := 'ADOQuery2' ;
Connection := ADOConnection1;
Sql.Text := 'select * from jnbs' ;
DataSource1.DataSet := TADOQuery(FindComponent('ADOQuery2'));
DBGrid2.DataSource := DataSource1 ;
Open ;
Finally
//Free ;
end ;
end ;
不行,没有显示纪录

当我将原来好了的代码中的DBGrid2用TDBGrid(FindComponent('DBGrid2'))引入时,编译可以通过
但无法执行
DBGrid2.DataSource := DataSource1 ;
换为
TDBGrid(FindComponent('DBGrid2')).DataSource := DataSource1 ;
编译可以通过但无法执行

我想请教: 这儿为什么用
类名(FindComponent(类的实例变量名))
不能引用该变量 ? 这种引入变量的用法多用在那儿 ? 谢谢


 

好象富翁的发信系统有点问题。
我给你的帮助中已经解释了,这是局部对象与全局对象的问题。
当对存在多个相同组件操作时,使用FindComponent可以节省代码(根据名字),也可以使用Components或Controls(根据序号)。
 
影子先生您好 ,大家好,我想问的是:
用 类型(FindComponent('Name')) 的方法访问类的具体对象变量怎么用 ?
在上边的例子中,我将已经改好的程序作如下变化:

Connection := ADOConnection1 ;
换为
Connection := TADOConnection(FindComponent('ADOConnection1')) ;
时无法链接到数据库,提示 "没有指定Connection或者ConnectionString",也就是说用这种方式
无法使用对象;
但是
with TEdit.Create(Self) do
begin
Name:='MyEdit';
Text:='';
Left:=25;
Top:=50;
Parent:=Form1;
end;
TEdit(FindComponent('Myedit')).Text:=inttostr(1234);
是可以的。

因此我想请教大家:

用 类型(FindComponent('Name')) 的方法访问类的具体对象变量应该怎么用 ? 这种用法一般
多用在何处 ? 上边为何出错 ?

谢谢

 
多人接受答案了。
 
顶部