BSOne.SFC/EM.Lib/ImageEn_SRC/Demos/Database/DBMView/umain.pas

157 lines
3.8 KiB
Plaintext

unit umain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ieview, iemview,
Db, Grids, DBGrids, DBTables, hyieutils, imageenview, ImageEnIO, StdCtrls, ExtCtrls, ComCtrls,
ieopensavedlg, iexBitmaps;
type
TMainForm = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
ImageEnMView1: TImageEnMView;
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
btnAppend: TButton;
dlgOpenImage: TOpenImageEnDialog;
procedure btnAppendClick(Sender: TObject);
procedure ImageEnMView1ImageIDRequestEx(Sender: TObject; Index, ID: Integer; var Bitmap: TIEBitmap);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
fBitmap : TIEBitmap;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
{$R WindowsTheme.res}
procedure TMainForm.btnAppendClick(Sender: TObject);
var
aBitmap: TIEBitmap;
aMemStream: TMemoryStream;
aBlobStream: TBlobStream;
sName: string;
Idx: Integer;
begin
if dlgOpenImage.Execute = False then
exit;
try
Table1.Append;
// Naturally, in this situation it would be more effective to load the blob directly from the file,
// but here I am illustrating loading via a TIEBitmap
aBitmap := TIEBitmap.create;
aMemStream := TMemoryStream.Create;
try
// Transfer the image from file to our memory stream
aBitmap.Read(dlgOpenImage.Filename);
aBitmap.Write(aMemStream, ioJPEG);
aMemStream.Position := 0;
// Transfer from the memory stream to the blobstream
aBlobStream := TBlobStream.create((Table1.FieldByName('Photo') as TBlobField), bmWrite);
try
aMemStream.SaveToStream(aBlobStream);
finally
aBlobStream.Free;
end;
// Assign a name
sName := ChangeFileExt(ExtractFilename(dlgOpenImage.Filename), '');
Table1.FieldByName('Name').AsString := sName;
Table1.Post;
// Add it to our TImageEnMView
Idx := ImageEnMView1.AppendImage;
ImageEnMView1.ImageID[ Idx ] := Table1.RecNo;
finally
aMemStream.free;
aBitmap.free;
end;
except
Table1.Cancel;
raise;
end;
end;
procedure TMainForm.ImageEnMView1ImageIDRequestEx(Sender: TObject; Index, ID: Integer; var Bitmap: TIEBitmap);
var
ms:TMemoryStream;
begin
// Go to the record of this ID
Table1.RecNo := ID;
// Load the blob into our Bitmap
ms := TMemoryStream.Create;
try
(Table1.FieldByName('Photo') as TBlobField).SaveToStream( ms );
ms.Position := 0;
fBitmap.Read( ms );
finally
ms.free;
end;
// Assign data to the TImageEnMView
Bitmap := fBitmap;
ImageEnMView1.ImageBottomText[ Index ] := Table1.FieldByName('Name').AsString;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
ImageEnMView1.SetModernStyling;
fBitmap := TIEBitmap.create;
Table1.DatabaseName := ExtractFilePath(application.exename);
Table1.Open;
Edit1Change(self);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(fBitmap);
end;
// setup correspondence between TImageEnMView and the dataset
procedure TMainForm.Edit1Change(Sender: TObject);
var
Idx : integer;
begin
if Edit1.Text <> '' then
begin
Table1.FilterOptions := [foCaseInsensitive];
Table1.Filter := 'Name='''+Edit1.text+'*''';
Table1.Filtered := true;
end
else
Table1.Filtered := false;
ImageEnMView1.Clear;
Table1.First;
while not Table1.Eof do
begin
Idx := ImageEnMView1.AppendImage;
// NOTE: Some queries and datasets do not support navigation via RecNo
// In that case, you should use an indexed field to identify and navigate records
ImageEnMView1.ImageID[ Idx ] := Table1.RecNo;
Table1.Next;
end;
end;
end.