1 unit frmMainUnit; 2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 jpeg, // 这里是一些手工的引用
8 Dialogs, DB, ADODB, StdCtrls, DBCtrls, Mask, Grids, DBGrids, Buttons, Menus, 9 ExtCtrls, ExtDlgs; 10
11 type
12 TfrmMain = class(TForm) 13 ADOConnection1: TADOConnection; 14 ADOQuery1: TADOQuery; 15 DataSource1: TDataSource; 16 DBGrid1: TDBGrid; 17 DBEdit1: TDBEdit; 18 DBComboBox1: TDBComboBox; 19 Label1: TLabel; 20 Label2: TLabel; 21 DBEdit2: TDBEdit; 22 Label3: TLabel; 23 DBEdit3: TDBEdit; 24 Label4: TLabel; 25 DBEdit4: TDBEdit; 26 Label5: TLabel; 27 BitBtn1: TBitBtn; 28 BitBtn2: TBitBtn; 29 BitBtn3: TBitBtn; 30 Label8: TLabel; 31 Panel1: TPanel; 32 Image1: TImage; 33 PopupMenu1: TPopupMenu; 34 A1: TMenuItem; 35 N1: TMenuItem; 36 B1: TMenuItem; 37 N2: TMenuItem; 38 C1: TMenuItem; 39 p1: TOpenPictureDialog; 40 p2: TSavePictureDialog; 41 procedure FormCreate(Sender: TObject); 42 procedure ADOQuery1AfterPost(DataSet: TDataSet); 43 procedure ADOQuery1BeforeEdit(DataSet: TDataSet); 44 procedure ADOQuery1NewRecord(DataSet: TDataSet); 45 procedure BitBtn2Click(Sender: TObject); 46 procedure BitBtn1Click(Sender: TObject); 47 procedure BitBtn3Click(Sender: TObject); 48 procedure A1Click(Sender: TObject); 49 procedure ADOQuery1AfterScroll(DataSet: TDataSet); 50 procedure B1Click(Sender: TObject); 51 procedure C1Click(Sender: TObject); 52 procedure Image1DblClick(Sender: TObject); 53 private
54 { Private declarations }
55 function ShowImage(DataSet: TDataSet; FieldName: string; Image: TImage; 56 Panel: TPanel): Boolean; 57 public
58 { Public declarations }
59 end; 60
61 var
62 frmMain: TfrmMain; 63
64 implementation
65
66 {$R *.dfm}
67
68
69 function TfrmMain.ShowImage(DataSet: TDataSet; FieldName: string; Image: 70 TImage; Panel: TPanel): Boolean; 71 var
72 ms: TMemoryStream; 73 JI: TJpegImage; 74 begin
75 ms := TMemoryStream.Create; 76 JI := TJpegImage.Create; 77 try
78 try // 图片均以jpg格式保存,不支持使用dbimage,都在AfterScroll事件中读取。
79 TBlobField(DataSet.FieldByName(FieldName)).SaveToStream(ms); 80 if ms.Size > 0 then
81 begin
82 ms.Position := 0; 83 JI.LoadFromStream(ms); 84 Image.Picture.Bitmap.Assign(JI); 85 if (Image.Picture.Bitmap.Width > 119) or (Image.Picture.Bitmap.Width >
86 137) then
87 Image.Stretch := True 88 else
89 Image.Stretch := false; 90 Panel.Caption := ''; 91 end
92 else
93 begin
94 Image.Picture := nil; 95 Panel.Caption := '无照片'; 96 end; 97 finally
98 FreeAndNil(ms); 99 FreeAndNil(JI); 100 end; 101 result := True; 102 except
103 result := false; 104 end; 105 end; 106
107 procedure TfrmMain.A1Click(Sender: TObject); 108 var
109 ms: TMemoryStream; 110 JI: TJpegImage; 111 begin
112 if not ADOQuery1.Active then
113 exit; 114 if p1.Execute then
115 begin
116 ms := TMemoryStream.Create; 117 JI := TJpegImage.Create; 118 try // 图片读取后都转换成jpg格式并压缩后保存到数据库中。
119 if lowercase(ExtractFileExt(p1.FileName)) = '.bmp' then
120 begin
121 Image1.Picture.LoadFromFile(p1.FileName); 122 JI.Assign(Image1.Picture.Bitmap); 123 end
124 else
125 begin
126 JI.LoadFromFile(p1.FileName); 127 Image1.Picture.Bitmap.Assign(JI); 128 end; 129 JI.CompressionQuality := 75; // 图片压缩比,越低越不清楚。
130 JI.Compress; 131 JI.SaveToStream(ms); 132 if not(ADOQuery1.State in dsEditModes) then
133 ADOQuery1.Edit; 134 TBlobField(ADOQuery1.FieldByName('fphoto')).LoadFromStream(ms); 135 if (Image1.Picture.Bitmap.Width > 119) or (Image1.Picture.Bitmap.Height >
136 137) then
137 Image1.Stretch := True 138 else
139 Image1.Stretch := false; 140 Panel1.Caption := ''; 141 finally
142 FreeAndNil(ms); 143 FreeAndNil(JI); 144 JI.Free; 145 end; 146 end; 147 end; 148
149 procedure TfrmMain.ADOQuery1AfterPost(DataSet: TDataSet); 150 begin // 保存或退出编辑状态时,显示为删除
151 BitBtn2.Caption := '删除 &D'; 152 end; 153
154 procedure TfrmMain.ADOQuery1AfterScroll(DataSet: TDataSet); 155 begin
156 ShowImage(ADOQuery1, 'fphoto', Image1, Panel1); 157 end; 158
159 procedure TfrmMain.ADOQuery1BeforeEdit(DataSet: TDataSet); 160 begin // 进入编辑状态时,显示为取消
161 BitBtn2.Caption := '取消 &D'; 162 end; 163
164 procedure TfrmMain.ADOQuery1NewRecord(DataSet: TDataSet); 165 begin // 这里处理新增
166 ADOQuery1.FieldByName('fsex').AsString := '男'; 167 end; 168
169 procedure TfrmMain.B1Click(Sender: TObject); 170 begin
171 if not ADOQuery1.Active then
172 exit; 173 if ADOQuery1.State in dsEditModes then
174 exit; 175 if TBlobField(ADOQuery1.FieldByName('FPhoto')).IsNull then
176 exit; // 如果图片为空,就没必要继续了
177 if p2.Execute then
178 if ExtractFileExt(p2.FileName) = '' then
179 TBlobField(ADOQuery1.FieldByName('FPhoto')) 180 .SaveToFile(p2.FileName + '.jpg') 181 else
182 TBlobField(ADOQuery1.FieldByName('FPhoto')).SaveToFile(p2.FileName); 183 end; 184
185 procedure TfrmMain.BitBtn1Click(Sender: TObject); 186 begin
187 ADOQuery1.Append; 188 end; 189
190 procedure TfrmMain.BitBtn2Click(Sender: TObject); 191 begin
192 if ADOQuery1.State in dsEditModes then
193 ADOQuery1.Cancel 194 else
195 if Application.MessageBox('是否删除当前记录?', '提示信息', MB_OKCANCEL +
196 MB_ICONQUESTION + MB_DEFBUTTON2) = IDOK then
197 ADOQuery1.Delete; 198 ShowImage(ADOQuery1, 'fphoto', Image1, Panel1); 199 end; 200
201 procedure TfrmMain.BitBtn3Click(Sender: TObject); 202 begin
203 ADOQuery1.Post; 204 end; 205
206 procedure TfrmMain.C1Click(Sender: TObject); 207 begin
208 if not ADOQuery1.Active then
209 exit; 210 if TBlobField(ADOQuery1.FieldByName('fphoto')).IsNull then
211 exit; 212 if MessageBox(Application.Handle, '是否清除照片?', '提示信息', 213 MB_ICONQUESTION + MB_YESNO + MB_DEFBUTTON2) = IDNO then
214 exit; 215 Image1.Picture := nil; 216 if not(ADOQuery1.State in dsEditModes) then
217 ADOQuery1.Edit; 218 TBlobField(ADOQuery1.FieldByName('fphoto')).Clear; 219 ShowImage(ADOQuery1, 'fphoto', Image1, Panel1); 220 end; 221
222 procedure TfrmMain.FormCreate(Sender: TObject); 223 begin
224 with ADOQuery1 do
225 begin
226 close; 227 sql.Text := 'select * from temployee'; 228 Open; 229 end; 230 end; 231
232 procedure TfrmMain.Image1DblClick(Sender: TObject); 233 var
234 mPoint: TPoint; 235 begin
236 GetCursorPos(mPoint); 237 PopupMenu1.Popup(mPoint.X, mPoint.Y); 238 end; 239
240 end.