FROM1含AdoConnection、ADOQuery、Datasource、DBGrid三个控件,数据库为SQL2000,连接的数据表中含有“照片”列,为image类型,程序用文件流的方式存储图片到照片列,FORM2中含有image、多个DBEdit,在FORM1中的DBGrid的单元格双击事件中弹出FORM2以显示当前单条记录并在image显示“照片”列中存储的图片
在UNIT2中:
procedure TForm2.FormCreate(Sender: TObject);
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
mStream:=TMemoryStream.Create ;
TBlobField(Form1.ADOQuery1.FieldByName('照片')).SaveToStream(mStream); //
mStream.Position :=0;
JpgFile:=TjpegImage.Create ;
jpgfile.LoadFromStream(MStream);
image1.Picture.Bitmap.Assign(JpgFile);
end;
UNIT1中 :
procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
Form2:TForm2;
begin
Form2:=TForm2.Create(self);
Form1.Show;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery1.Active:=true;
end;
但是运行提示错误:[Error] UNIT2.pas(91): Illegal character in input file: ' ' ($A1A1)不明白是什么意思一直没有改对,请大家帮忙修改多谢!
在UNIT2中:
procedure TForm2.FormCreate(Sender: TObject);
var
mStream:TMemoryStream;
JpgFile:TjpegImage;
begin
mStream:=TMemoryStream.Create ;
TBlobField(Form1.ADOQuery1.FieldByName('照片')).SaveToStream(mStream); //
mStream.Position :=0;
JpgFile:=TjpegImage.Create ;
jpgfile.LoadFromStream(MStream);
image1.Picture.Bitmap.Assign(JpgFile);
end;
UNIT1中 :
procedure TForm1.DBGrid1DblClick(Sender: TObject);
var
Form2:TForm2;
begin
Form2:=TForm2.Create(self);
Form1.Show;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery1.Active:=true;
end;
但是运行提示错误:[Error] UNIT2.pas(91): Illegal character in input file: ' ' ($A1A1)不明白是什么意思一直没有改对,请大家帮忙修改多谢!
只要删除那个空格就可以了~~
这句话说明你的程序是从其他复制粘贴进去的
把91行所有空格删除即可
或者删掉91行,自己手工写入代码
这里给个例子,实在搞不懂,找我,我发程式给你
猫猫:28088191
------------------------------------------
//----下面是定义一个装图片入库的过程
procedure TForm1.SavePicture;
var
TheWidth:integer;
TheHeight:integer;//定义加入图片的长与宽
TheTotalPicture:integer;//定义这个变量主要是让ID字须增加
begin
try
TheJpeg:=TJpegImage.Create;
if OpenPictureDialog1.Execute then begin
TheJpeg.LoadFromFile(OpenPictureDialog1.FileName);
Image1.Picture.Assign(TheJpeg);
if Image1.Picture.Graphic<>nil then begin
TheWidth:=TheJpeg.Width; //取得加入图片的宽
TheHeight:=TheJpeg.Height;//取得加入图片高
if (TheWidth<>800) and (TheHeight<>535) then begin//验证图片大小
Image1.Stretch:=False;
if Application.MessageBox('图片大小不符合规定是否继续?','系统提示',MB_YESNO+MB_ICONQUESTION)=IDYES then begin//对用户选择进行处理
ClientDataSet1.Append;
TheTotalPicture:=ClientDataSet1.RecordCount;
ClientDataSet1.FieldByName('图片').Assign(Image1.Picture.Graphic);
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
MessageDlg('图片增加成功!',mtInformation,[mbOK],0);
end else begin
Exit;
end;
end else begin
ClientDataSet1.Append;
TheTotalPicture:=ClientDataSet1.RecordCount;
ClientDataSet1.FieldByName('图片').Assign(Image1.Picture.Graphic);
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
MessageDlg('图片增加成功!',mtInformation,[mbOK],0);
end;
end;
end;
except
end;
GroupBox2.Caption:='图片总数'+IntToStr(ClientDataSet1.RecordCount)+' 张';
TheJpeg.Free;
end;
//----下面是做一个显示图片的过程
procedure TForm1.ShowPicture;
begin
try
Image1.Stretch:=True;
TheJpeg:=TJpegImage.Create;
TheJpeg.Assign(ClientDataSet1.FieldByName('图片'));
Image1.Picture.Assign(TheJpeg);
//下面是做一个是否拉伸图像的判断
if (TheJpeg.Width>800) and (TheJpeg.Height>600) then begin
Image1.Stretch:=True;
end else begin
Image1.Stretch:=False;
end;
except
Image1.Picture.Assign(ClientDataSet1.FieldByName('图片'));
end;
TheJpeg.Free;
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, jpeg, StrUtils,
Dialogs, ExtCtrls, StdCtrls, Buttons, DB, ADODB, ExtDlgs, ComCtrls;type
TCJtupian = class(TForm)
Image1: TImage;
Edit1: TEdit;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
ADOQuery1: TADOQuery;
OpenPictureDialog1: TOpenPictureDialog;
Label1: TLabel;
ADOQuery2: TADOQuery;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
Function Ceckytu(str: string): string;
Function Zkuan(str: string): string;
Function ytu(str: string): char;
public
{ Public declarations }
end;var
CJtupian: TCJtupian;implementation{$R *.dfm}procedure TCJtupian.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=Cafree;
end;procedure TCJtupian.BitBtn2Click(Sender: TObject); //添加图片
var
sStr:string;
str1: string;
i: LongInt;
f1: file;
begin
{ OpenPictureDialog1.Filter :='All (*.jpg;*.jpeg;*.bmp;*.ico;*.emf;*.wmf)|'
+'*.jpg;*.jpeg;*.bmp;*.ico;*.emf;*.wmf|JPEG Image File (*.jpg)|'
+'*.jpg|JPEG Image File (*.jpeg)|*.jpeg|Bitmaps (*.bmp)|*.bmp|'
+'Icons (*.ico)|*.ico|Enhanced Metafiles (*.emf)|*.emf|'
+'Metafiles (*.wmf)|*.wmf'; }
Try
//OpenPictureDialog1.Filter :='文件(*.jpg)|(*.*)|所有文件(*.*)|(*.*)';
With AdoQuery1 do
Begin
Close;
SQl.Clear ;
SQl.Add('select top 0 * from filetupian');
open;
End;
OpenPictureDialog1.Execute ;
sStr := OpenPictureDialog1.FileName ;
str1:= OpenPictureDialog1.FileName ;
if Sstr<>'' then //加载图片中取消时处理2007-11-30晚
Begin
if ytu(sstr) in ['H','M','A','S','T','h','m','s','t','a'] then
Begin
if pos('.',sStr) <>0 then
begin
while pos('\', sStr) <> 0 do
sStr:=copy(sStr, pos('\', sStr)+1,length(sStr)-pos('\',sStr)+1);
end;//最后不含路径的文件名
assignfile(f1,str1);
reset(f1);
i:=filesize(f1);
Closefile(f1);
if OpenPictureDialog1.FileName <>''then
Begin
ADOQuery1.Insert;
TBlobField(ADOQuery1.FieldByName('image_')).LoadFromFile(OpenPictureDialog1.FileName);
AdoQuery1.FieldByName('zkuan_').AsString :=Zkuan(SStr);
AdoQuery1.FieldByName('ytu_').AsString :=Ceckytu(sstr);
Adoquery1.FieldByName('size_').AsInteger :=i;
AdoQuery1.Post ;
End
Else
Begin
exit;
end;
image1.Picture.LoadFromFile(str1);
Showmessage('加载图片完成');
End
Else
Begin
Showmessage('加载图片没有输入用途');
End;
End
Else
Begin
// showmessage('没有选择图片');
exit;
End;
Except
Showmessage('图片加载失败');
Abort;
End;
end;function TCJtupian.Ceckytu(str: string): string;
var
str1: string;
ien_: integer;
begin
Str1:=str;
ien_:=length(str1);
Ceckytu:=copy(str1,ien_-4,1);
end;function TCJtupian.Zkuan(str: string): string;
var
ien_: integer;
str1: string;
begin
str1:=str;
ien_:=length(str1);
zkuan:=copy(str1,1,ien_-5);
end;procedure TCJtupian.BitBtn1Click(Sender: TObject); //显示图片
var
Tstream: Tmemorystream;
jpgfile: TjpegImage;
s: string[50];
pp: char;
begin
image1.Visible :=False;
image1.Visible :=True;
if Edit1.Text <>'' then
Begin
s:=edit1.Text ;
pp:=s[length(edit1.text)];
if pp in ['H','M','A','S','T','h','m','s','t','a'] then
Begin
With AdoQuery2 do
Begin
Close;
SQl.Clear ;
SQl.Add('select top 1 * from filetupian where zkuan_='''+copy(edit1.Text ,1,length(edit1.Text )-1)+''' '
+' and ytu_='''+rightstr(edit1.Text,1)+'''') ;
open;
End;
if Not AdoQuery2.FieldByName('image_').IsNull then
Begin
Tstream:=Tmemorystream.Create ;
jpgfile:=Tjpegimage.Create ;
TBlobField(AdoQuery2.FieldByName('image_')).SaveToStream(Tstream);
Tstream.Position :=0;
jpgfile.LoadFromStream(Tstream);
image1.Picture.Assign(JpgFile);
End;
End
Else
Showmessage('请在针款编号后面加用途');
End
Else
Begin
Application.MessageBox('请输入查询条件','注意',mb_iconstop+mb_ok);
End;
end;procedure TCJtupian.BitBtn3Click(Sender: TObject); //删除错误图片2007-11-29添加
var
AdoQuery3:TAdoQuery;
num: string[50];
pp:Char;
begin
AdoQuery3:=TAdoQuery.Create(self);
Adoquery3.ConnectionString :=AdoQuery2.ConnectionString ;
if Edit1.Text <>'' then
Begin
num:=edit1.Text;
pp:=num[length(edit1.Text)];
if pp in ['H','M','A','S','T','h','m','s','t','a'] then
Begin
if Application.MessageBox('删除图片','注意',mB_iconstop+mb_okcancel)=idok Then
Begin
with AdoQuery3 do
Begin
Close;
SQl.Clear ;
SQl.Text :='delete from filetupian where zkuan_='''+Copy(edit1.Text ,1,length(edit1.Text )-1)+''' '
+' and ytu_='''+rightstr(edit1.Text,1)+''' ' ;
ExecSQL;
End;
Showmessage('数据删除完成');
end;
End
Else
Begin
Showmessage('请输入针款编号的用途');
End;
End
Else
Begin
Showmessage('你没有输入要删除的条件');
End;
end;function TCJtupian.ytu(str: string): char;//判断图片是否有HMSTA等字样
var
num : string[200];
begin
num:=str;
ytu:=num[length(str)-4];
end;end.
var //2007-11-29晚,处理下载图片并打印的效果
Mstream: TMemorystream;
jpgfile: TjpegImage;
pp: pChar;
ss: String;
ii:DWORD;
aa: string;
ll : string;
Begin
GetMem(pp,255); //处理获得用户登陆电脑名称
ii:= 255;
GetUserName(pp,ii);
ss := StrPas(pp);
FreeMem(pp);
ll:= 'C:\Documents and Settings\'+ss+ '\Local Settings\Temp\';
if (Edit1.Text <>'' ) or (edit1.Text<>'000001') then //2007-11-29晚加,处理打印图片和下载图片问题 ,
Begin
With ADOQuery1 do //处理图片
Begin
Close;
SQl.Clear ;
SQl.Text :=' Select (n.image_) as image_, isnull(n.zkuan_,'''')as zkuan , (m.ytu_) as ytu_,(m.zkuan_) as zkuan_ '
+' from klbom m left join filetupian n on m.zkuan_=n.zkuan_ and m.ytu_=n.ytu_ '
+' where m.id_='''+Trim(Edit1.Text)+''' ' ;
Open;
End;
try
While not ADOQuery1.Eof do
Begin //在这里需要判断是否查询到图片的字段,所以特殊添加下面的判断
if Adoquery1.FieldByName('zkuan').AsString <>'' then
Begin
Mstream:=TMemorystream.Create ;
jpgfile:=TjpegImage.Create ;
TBlobField(ADOQuery1.FieldByName('image_')).SaveToStream(Mstream);
Mstream.Position :=0;
jpgfile.LoadFromStream(Mstream);
aa:='C:\Documents and Settings\'+ss+ '\Local Settings\Temp\'+ADOQuery1.fieldbyname('zkuan_').AsString+ADOQuery1.fieldbyname('ytu_').AsString+'.jpg';
jpgfile.SaveToFile(aa);
End;
Adoquery1.Next;
End; except
Showmessage('数据处理有问题,请联系信息部');
End;
Dim FileName As String ′图片文件名
Const BLOCKSIZE = 4096 ′每次读写块的大小
Dim ADOCon As New ADODB.Connection ′ADODB Connection对象
Dim ADORst As New ADODB.Recordset ′ADODB Recordset 对象
Dim ADOFld As ADODB.Field ′ADODB Field 对象
------------------------
Private Sub SaveToDB(ByRef Fld As ADODB.Field, DiskFile As String)
Dim byteData() As Byte ′定义数据块数组
Dim NumBlocks As Long ′定义数据块个数
Dim FileLength As Long ′标识文件长度
Dim LeftOver As Long′定义剩余字节长度
Dim SourceFile As Long ′定义自由文件号
Dim i As Long ′定义循环变量
SourceFile = FreeFile ′提供一个尚未使用的文件号
Open DiskFile For Binary Access Read As SourceFile ′打开文件
FileLength = LOF(SourceFile) ′得到文件长度
If FileLength = 0 Then ′判断文件是否存在
Close SourceFile
MsgBox DiskFile & 〃 无 内 容 或 不 存 在 !〃
Else
NumBlocks = FileLength \ BLOCKSIZE ′得到数据块的个数
LeftOver = FileLength Mod BLOCKSIZE ′得到剩余字节数
Fld.Value = Null
ReDim byteData(BLOCKSIZE) ′重新定义数据块的大小
For i = 1 To NumBlocks
Get SourceFile, , byteData() ′ 读到内存块中
Fld.AppendChunk byteData() ′写入FLD
Next i
ReDim byteData(LeftOver) ′重新定义数据块的大小
Get SourceFile, , byteData() ′读到内存块中
Fld.AppendChunk byteData() ′写入FLD
Close SourceFile ′关闭源文件
End If
End Sub
----------------------
Private Sub Form_Load()
Constr = 〃DSN=image〃 ′定义ODBC连接
ADOCon.Open Constr ′创建一个连接
ADORst.Open 〃table〃, ADOCon, adOpenDynamic, adLockOptimistic
′打开一个ADO动态集 表名为table
Set AdoCtr.Recordset = ADORst ′将动态集赋给ADO控件
End Sub
----------------------
Private Sub Form_Unload(Cancel As Integer)
′记得关闭打开的数据集,释放资源
ADORst.Close
ADOCon.Close
Set ADORst = Nothing
Set ADOCon = Nothing
End Sub
----------------------
Private Sub PreView_Click()
′显示打开文件的公用对话框,选择需要加入数据库的图片
CDlg.Filter = 〃位图(*.bmp)|*.bmp〃
CDlg.ShowOpen
FileName = CDlg.FileName
PicBox.Picture = LoadPicture(FileName) ′预览图片
End Sub
----------------------
Private Sub Save_Click()
ADORst.AddNew ′新增纪录
ADORst(〃姓名〃).Value = Names.Text ′给动态集的第一个字段赋值
ADORst(〃编号〃).Value = Numb.Text ′给动态集的第二个字段赋值
Set ADOFld = ADORst(〃照片〃) ′给ADODB.Field对象赋值
Call SaveToDB(ADOFld, FileName)
′调用子程序,给第三个字段(image)赋值
ADORst.Update
End Sub
----------------------
Private Sub Update_Click()
′重新打开纪录集,刷新纪录
ADORst.Close
ADOCon.Close
Set ADORst = Nothing
Set ADOCon = Nothing
ADOCon.Open Constr
ADORst.Open 〃table〃, ADOCon, adOpenDynamic, adLockOptimistic
Set AdoCtr.Recordset = ADORst
End Sub