关于网友提出的“ 又回来了,经过半年的修行后写了DB加速器”问题疑问,本网通过在网上对“ 又回来了,经过半年的修行后写了DB加速器”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 又回来了,经过半年的修行后写了DB加速器
描述: 在知道OFFICE中的ACCESS其实是不如DELPHI之后,闭关修练了半年,终于:
1.掌握了ADO控件及EHLIB的用法.
2.掌握了控件及IDE扩展的开发.
3.写了一个ADO和EHLIB的扩展库.叫DB加速器.方便做二层数据库开发.
4.发现有了这套东西之后,数据库开发效率高了十倍.
5.见到有说TDBImage不能绑定加载JPG文件之后,又自行开发了TXImage(DB加速器的一部分源码).
TXImage的源码如下.有兴趣的朋友可以看看有什么不足之处.
TXImage=class(TImage)
private
FDataLink: TFieldDataLink;
MyPopMenu: TPopupMenu;
ExtFileName:String;
function GetDataField: string;
function GetDataSource: TDataSource;
procedure SetDataField(const Value: string);
procedure SetDataSource(const Value: TDataSource);
procedure DataChange(Sender: TObject);
procedure UpdateData(Sender: TObject);
procedure OnLoadMenuClick(Sender:TObject);
procedure OnDelMenuClick(Sender:TObject);
function CheckBlobField:TBlobField;
protected
procedure Loaded;override;
procedure DblClick; override;
public
constructor Create(AOwner:TComponent);override;
destructor Destroy; override;
procedure LoadPicture(FileName:String='');
procedure DelPicture;
published
property DataField: string read GetDataField write SetDataField;
property DataSource: TDataSource read GetDataSource write SetDataSource;
end;
{ TXImage }
constructor TXImage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnUpdateData := UpdateData;
end;
destructor TXImage.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited;
end;
function TXImage.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TXImage.SetDataSource(const Value: TDataSource);
begin
if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
FDataLink.DataSource := Value;
if Value <> nil then Value.FreeNotification(Self);
end;
function TXImage.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
procedure TXImage.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
end;
procedure TXImage.UpdateData(Sender: TObject);
var PicField:TBlobField;
mm:TMemoryStream;
begin
PicField:=CheckBlobField;
if ExtFileName='' then
PicField.Clear
else begin
// PicField.Clear;
mm:=TMemoryStream.Create;
mm.Write(extFileName[1],Length(ExtFileName)); //先把文件扩展名写入流
if Assigned(Picture.Graphic) then
Picture.Graphic.SaveToStream(mm); //再把图片也写入流
mm.Position:=0;
PicField.LoadFromStream(mm);
mm.Free;
end;
end;
procedure TXImage.DataChange(Sender: TObject);
var PicField:TBlobField;
mm:TMemoryStream;
NewGraphic: TGraphic;
GraphicClass: TGraphicClass;
begin
PicField:=CheckBlobField;
if PicField.IsNull then begin
ExtFileName:='';
Picture.Graphic:=nil;
end
else begin
mm:=TMemoryStream.Create;
PicField.SaveToStream(mm);
mm.Position:=0;
SetLength(ExtFileName,4);
mm.Read(ExtFileName[1],4); //先读出扩展名
GraphicClass := nil; //再读出图片数据到图片中
if (ExtFileName ='.WMF') or (ExtFileName='.EMF') then
GraphicClass := TMetafile;
if (ExtFileName='.ICO') then
GraphicClass:=TIcon;
if (ExtFileName='.BMP') then
GraphicClass:=TBitmap;
if (ExtFileName='.JPG') then
GraphicClass:=TJPEGImage;
if GraphicClass = nil then
raise Exception.Create('无效的扩展名!');
NewGraphic := GraphicClass.Create;
NewGraphic.LoadFromStream(mm);
Picture.Assign(NewGraphic);
NewGraphic.Free;
mm.Free;
end;
end;
procedure TXImage.Loaded;
var MenuItem:TMenuItem;
begin
inherited;
if PopupMenu=nil then begin
MyPopMenu:=TPopupMenu.Create(self);
MenuItem:=TMenuItem.Create(MyPopMenu);
MenuItem.Caption:='加载图片(&L)...';
MenuItem.OnClick:=OnLoadMenuClick;
MyPopMenu.Items.Add(MenuItem);
MenuItem:=TMenuItem.Create(MyPopMenu);
MenuItem.Caption:='删除图片(&D)...';
MenuItem.OnClick:=OnDelMenuClick;
MyPopMenu.Items.Add(MenuItem);
PopupMenu:=MyPopMenu;
end;
end;
procedure TXImage.OnLoadMenuClick(Sender: TObject);
begin
LoadPicture();
end;
procedure TXImage.OnDelMenuClick(Sender: TObject);
begin
DelPicture;
end;
procedure TXImage.LoadPicture(FileName: String);
var Dlg:TOpenDialog;
Picfield:TBlobField;
begin
Picfield:=CheckBlobField;
FDataLink.Edit;
if FDataLink.Editing then begin
if FileName='' then begin
Dlg:=TOpenDialog.Create(nil);
Dlg.Filter:= '*.jpg|*.jpg|*.bmp|*.bmp|*.ico|*.ico';
if dlg.Execute then
FileName:=dlg.FileName;
Dlg.Free;
end;
if FileName<>'' then begin
Picture.LoadFromFile(FileName);
ExtFileName:=UpperCase(ExtractFileExt(FileName));
FDataLink.Modified;
FDataLink.UpdateRecord;
end;
end;
end;
procedure TXImage.DelPicture;
var
PicField:TBlobField;
begin
Picfield:=CheckBlobField;
FDataLink.Edit;
if FDataLink.Editing then begin
ExtFileName:='';
Picture.Graphic:=nil;
UpdateData(self);
end;
end;
function TXImage.CheckBlobField: TBlobField;
begin
if FDataLink.Active then
if (FDataLink.Field is TBlobField) then begin
Result:=TBlobField(FDataLink.Field);
exit;
end;
Picture.Graphic:=nil;
if FDataLink.Active then
raise Exception.Create('DataField是BlobField才能正常工作!')
else
abort;
end;
procedure TXImage.DblClick;
begin
LoadPicture();
inherited;
end;
解决方案1: 顶楼主的开源精神~~~顶楼主的钻研精神~~~
解决方案2: 好强啊。。支持。
解决方案3: 又想起那个帖子了,呵呵
解决方案4: 呵呵,还记得以前你那篇惊天动地的贴子:)
代码没仔细看,因为除了在IDE中,真的不习惯在WEB中看代码,不整齐,
不过相信是好的
解决方案5: 楼上所言,的长贴在哪,~~~~仰慕呀~~~
解决方案6: 想当年那贴。。。真TMD长。。。。
现在认识了在知道OFFICE中的ACCESS其实是不如DELPHI之后
///////////
汗一个....
解决方案7: 呵呵,有点意思,看到你就又想起那个超长帖子了。
解决方案8: 佩服楼主的锲而不舍的求取精神.
解决方案9: 顶楼主的开源精神~~~顶楼主的钻研精神~~~
解决方案10: 顶楼主的开源精神~~~顶楼主的钻研精神~~~
以上介绍了“ 又回来了,经过半年的修行后写了DB加速器”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3227525.html