500分, 问题解决立即奉送!!!(300分)

  • 主题发起人 主题发起人 chehongll
  • 开始时间 开始时间
画图程序有一个接口,你在你的程序里面操作这个接口就可以直接在程序中使用
画图打开Image,画图程序的状态是可以调整的。
 
楼上的lgxyy 朋友:我的目的是在ACCESS中双击此条记录就能直接打开(如一个BMP 图象),而不能再用DELPHI调用shellexecute了。可能“楼”建高了大家有些糊涂,我再重申一下我的目的:
怎样利用DELPHI 存放一BMP记录到ACCESS 的OLE字段中后(注意下面的要求)“能在ACCESS中直接双击此条记录就能直接打开相应的‘画图’软件观看此BMP”
 
ACCESS 好像很少人會用! 沒用過!
 
等周一我给你源码吧,不过你的分数可以全给我一个人,现在我没空,总而就是COM
 
to whtsuperant:
大哥请放心, 分数不会少你的,我会加贴加分!
 
下面的代码可以将指定的图片按你的要求放到Access中,唯一的问题是只能放在表的第一个字段中。思路如下:1、将OleContainer中的图片复制到剪切板上,用servers控件中的
TAccessApplication控件打开一个access实例,打开要放入图片的表,添加新记录,
粘贴图片对象。由于不会选择字段,所以只能对表中第一个字段操作,不算是大问题吧?
希望如此!你参考一下吧:
OleContainer1: TOleContainer;
AccessApplication1: TAccessApplication;

........

self.OleContainer1.CreateObjectFromFile('c:/1.jpg',true);
SELF.OleContainer1.Copy;
self.AccessApplication1.Connect;
self.AccessApplication1.OpenCurrentDatabase('e:/db1.mdb',False);
self.AccessApplication1.CurrentDb.OpenTable('tb4',0);
self.AccessApplication1.DoCmd.OpenTable('tb4', acViewNormal, acAdd);
self.AccessApplication1.DoCmd.GoToRecord(acTable, 'tb4', acNewRec ,acLast);
self.AccessApplication1.SetHiddenAttribute(acTable,'f1',True);
//self.AccessApplication1.DoCmd.SelectObject(acTable,'f1',False);
self.AccessApplication1.DoCmd.RunCommand(acCmdPaste);
 
解决只能更新第一个字段的办法,将前面的字段隐藏,执行下面的语句一次就隐藏一个
self.AccessApplication1.RunCommand(acCmdHideColumns);//有几个字段在图像字段的前边,将该语句重复几次
 
to whtsuperant:
小弟正等着你的贴子!!!
 
晕我以为你已经结决了呢
等下午给你一段代码吧
 
在ACCESS中直接双击此条记录就能直接打开相应的‘画图’软件观看此BMP??
很有必要吗?
没这功能,总不成自己帮ACCESS打补丁吧!?
 
唉!!! 我是有苦说不出啊.....
单位上有一台“ 证卡” 打印机,用DELPHI 编程怎么也驱动不了,其参数设定和一般的打印机不一样,弄得头都大了, 只好退而求其次,用他自带的软件。说出来真是惭愧:)
 
直接读取显示图片(bmp)不就行了吗?干吗显示软件呀!
 
难道我的问题真的没人解决吗? whtsuperant老兄, 你是不是在耍我呀! 等你的贴子等得黄花菜都凉了.....另 TO wfzha: 你的方法可能有效, 但是我的DELPHI 5.0 版中没有你列的“TAccessApplication” 控件。 伤心...........55555555555
天呐!!!谁来帮帮我·!#!%!……!……
 
大家知道,在一个大型复杂的系统中,有时会调用一些外部程序来帮助我们完成某些特定功能。然而,如何打开并关闭这些外部程序呢?也许,这是一个老生常谈的话题,但笔者仍要继续讨论这个问题,原因有二:一是解决这个问题的方法很重要,并经常会遇到;二是大多数参考书提及的解决办法不全面,仍有很多朋友有疑问。下面,我将详细地阐述这个问题(提供的源代码均在WinNT/Delphi4.0环境下运行通过)。

一、如何打开一个外部程序:
我们常用的函数有两个,WinExec,ShellExecute,因为ShellExecute函数主要用于Win32下,功能也强大一些,故而本文只对后者进行讨论。

首先,我们粗略地研究一下ShellExecute的几个参数:
hwnd:窗体的句柄;
lpOperation:打开程序执行的操作,共预留有"open","explore","print"三种方式,此参数可以省略,此时将依据打开的文件(lpFile)的类型执行相应的操作,比如:如果lpFile为一文本文件,那么将会在与该文件相关联的程序中打开它;
lpFile:文件名;
lpParamerters:打开文件时所需的参数;
lpDirectory:文件名所在的路径,当然,一般来说,在Windows中登
"记记"过的程序(如WinWord)不必提供此参数;
nShowCmd:打开文件后程序窗体如何显示。
该函数的详细文档请读者朋友参阅相应帮助。

其次,我们来举一个例子(以"记事本"为例):
procedure TForm1.OpenBtnClick(Sender:TObject);
begin
ShellExecute(handle,'open','notepad.exe',nil,nil,SW_ShowNormal);
end;
读者朋友可以在你的Delphi环境下试试这段代码,当然,由于使用Windows的API函数,请加上ShellAPI单元。

二、如何关闭打开的外部程序:
要关闭一个外部程序,只需向他发送一条消息就行了,比如,SendMessage(ExeHandle,WM_Close,0,0);其中ExeHandle是程序窗体的句柄,但如何得到窗体句柄呢?这是最为关键的地方,幸好Windows提供了FindWindow()函数,它能够解决这个问题,它有两个参数:lpClassName:程序的类名;lpWindowName:程序窗体的标题。

第一种情况也是最简单情况的就是提供确定的[*"确定的"加着重号*]
"lpWindowName"参数,如下例:
procedure TForm1.CloseAppClick(Sender: TObject);//确定标题
var
Exehandle:Thandle;
begin
//获得句柄-->标题确定
ExeHandle:=findWindow(nil,'文件管理器');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
Else
Application.MessageBox('没有打开"文件管理器"!','提示',
MB_IconInformation+MB_OK);
end;

另一种情况是程序窗体没有确定的[*"没有确定的"加着重号*]标题,这就是很多朋友出现疑问的地方,也是几乎所有参考书均不涉及的地方。比如打开"写字板"程序,它的标题会随着文本文件名的不同而不同,此时,你要关闭它,就不得不提供程序的类名,但是如何获得程序的类名呢?笔者在这里向大家介绍一个可行的办法:首先打开程序(此处以"记事本"为例),然后,运行WinSight32(Delphi自带)或Spy++(VC自带),找到程序( "记事本")的运行状态,即可找到我们需要的类名(两者均为"Class Name"项)。参考一个例子:
procedure TForm1.CloseVAppClick(Sender: TObject);//标题不确定
var
var
ExeHandle:Thandle;
Begin
//获得句柄-->标题不确定
ExeHandle:=FindWindow('notepad',nil);//'');//返回句柄
//关闭程序
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0)
Else
Application.MessageBox('没有打开"记事本"程序!','提示',
MB_IconInformation+MB_OK);
end;

当然,既能提供程序的类名又能提供程序窗体的标题自然就没有讨论的必要了。这样,我们就可以在自己的程序中打开并关闭任意的外部程序了。另外,笔者在这里罗嗦一句:上文提到的ShellExeCute()还有有相当"豪华" 的用处!细心的读者可能注意到有的作者的程序里提供了一些广告他们的连接,这其实就是ShellExeCute()的运用之一,略举一例:
procedure TForm1.HttpClick(Sender: TObject);
begin
ShellExecute(handle,'open','http://liangming.163.net',
nil,nil,SW_ShowNormal);
end;
 
书上的例子
//存图片
procedureTForm1.btnTargetClick(Sender: TObject);
var
sFileName: string;
functionBlobContentToString(constFileName: string): string;
begin
withTFileStream.create(FileName, fmOpenRead) do
try
SetLength(Result, Size);
Read(Pointer(Result)^, Size);
finally
Free;
end;
end;
begin
if (OpenDialog1.Execute) then
begin
sFileName := OpenDialog1.FileName;
adodsBlobs.Edit;
adodsBlobs.FieldByName('Blobs').AsString :=
BlobContentToString(sFileName);
adodsBlobs.Post;
end;
end;
//用OleContainer显示图片。
procedureTForm1.btnShowBlobsClick(Sender: TObject);
var
sFileName: string;
BS: TADOBlobStream;
begin
BS :=
TADOBlobStream.Create(TBlobField(adodsBlobs.FieldByName('Blobs')),
bmRead);
try
sFileName := ExtractFilePath(Application.ExeName) + 'tmpBlob';
sFileName := sFileName + '.' +
adodsBlobs.FieldByName('Extension').AsString;
BS.SaveToFile(sFileName);
OleContainer1.CreateObjectFromFile(sFileName, False);
finally //wrapup
BS.Free;
end; //try/finally
end;
 
可能要VBA吧!
 
换delphi7或delphi6吧,我的办法能行,就是不太正规,非用delphi5也行,
就是你要自己导入access,倒入方法:
project/import type library.../add
选择office的安装目录,导入msacc.olb
install
就行了
 
这个问题是这样的:
大家先把一个BMP文件插入到Access的对像中,在Delphi下读出来
自已再给附值与读出来的比较看哪种方式相同就行了
这就是我的解决方法,不过我现在很忙,谁来把这位老弟试试呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部