我送,我送,我送送送——该不该用DBGrid?(200分)

  • 主题发起人 主题发起人 CJ
  • 开始时间 开始时间
menxin, 什么半透明panel的事? 我怎么不知道?
想做这种控件?
太简单了. 不值得做
 
人家要你做的那个嘛:)
 
eYes:
没收到我的mail吗?半透明panel不是做好了吗,能否给我一份? 开个价! :)
 
menxin, 要的话我临时写一个给你. 原来的那个太差, 早删除了.
 
我的还在呀,呵呵。
 
cj, 别给. 拿出去太丢人. 要的话我再写一个.
 
写一段就行,学习学习!先谢了。 :)
 
type
TPanelBorder = set of (pbInnerRaised, pbInnerSunk, pbOuterRaised, pbOuterSunk);
TTrPanel = class(TCustomPanel)
private
FTransparentRate : Integer; // 透明度

FBkGnd : TBitmap; // 背景buffer

procedure SetTransparentRate(value: Integer);

procedure WMEraseBkgnd(var Msg: TMessage); message WM_ERASEBKGND;

protected
procedure BuildBkgnd; virtual; // 生成半透明的背景
procedure SetParent(AParent : TWinControl); override;
procedure CreateParams(var Params: TCreateParams); override;
procedure Paint; override;
public
Constructor Create(AOwner: TComponent); override;
Destructor Destroy; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; // resize or move
procedure Invalidate; override;
procedure InvalidateA; virtual;
published
property TransparentRate: Integer read FTransparentRate write SetTransparentRate;
property ......
........ // 可以抄TPanel里面的
end;

procedure Register;

implimentation
procedure Register;
begin
RegisterComponent('Samples', [TTrPanel]);
end;

procedure TTrPanel.SetTransparentRate(value: Integer);
begin
if (value <0) or (value > 100) then exit;
if value <> FTransparentRate then
begin
FTransparentRate := value;
Invalidate;
end;
end;

procedure TTrPanel.WMEraseBkgnd(var Msg: TMessage);
begin
Msg.Result := 1;
end;

procedure TTrPanel.SetParent(AParent: TWinControl);
begin
inherited SetParent(AParent);
if (AParent <> nil) and AParent.HandleAllocated
and (GetWindowLong(AParent.Handle, GWL_STYLE) and WS_CLIPCHILDREN <> 0)
then
SetWindowLong(AParent.Handle, GWL_STYLE,
GetWindowLong(AParent.Handle, GWL_STYLE)
and not WS_CLIPCHILDREN);
end;

procedure TTrPanel.CreateParams(.....);
begin
inherited CreateParams(Params);
params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT;
end;

procedure TTrPanel.Paint;
begin
if not assigned(FBkgnd) then
BuildBkgnd;
bitblt(Canvas.handle, 0, 0, width, height, FBkgnd.Canvas.Handle, 0, 0, SRCCOPY);
........
........ // 画边框, 画caption等, 就不写了.
end;
type
T24Color = record
b, g, r: Byte;
end;
P24Color := ^T24Color;

procedure TTrPanel.BuildBkgnd;
var
p, p1: P24Color;
C : LongInt;
i, j: Integer;
begin
FBkgnd := TBitmap.Create;
FBkgnd.PixelFormat := pf24Bit;
FBkgnd.Width := Width;
FBkgnd.Height := Height;
if ftransparentrate > 0 then
begin
BitBlt(FBkgnd.Canvas.handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY);
if ftransparentrate < 100 then // 部分透明
begin
c := ColorToRGB(Color);
// 注意: ColorToRGB得到的颜色r, b位置与
// scanline中颜色顺序正好相反.
p1 := @c;
for i := 0 to FBkgnd.Height - 1 do
begin
p := FBkgnd.Scanline;
for j := 0 to FBkgnd.Width - 1 do
begin
p^.r := (p^.r * ftransparentrate + p1^.b * (100-ftransparentrate)) div 100;
p^.g := (p^.g * ftransparentrate + p1^.g * (100-ftransparentrate)) div 100;
p^.b := (p^.b * ftransparentrate + p1^.r * (100-ftransparentrate)) div 100;
p := pointer(integer(p)+3);
end;
end;
end;
end
else begin // 不透明
c := CreateSolidBrush(ColorToRGB(color));
FillRect(fFBkgnd.canvas.handle, c);
deleteobject(c);
end;
controlstyle := controlstyle + [csOpaque]; // 背景没有变化时的重画不会出现闪烁
end;

Constructor TTrPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fbkgnd := nil;
fTransparentRate := 0;
end;

Destructor TTrPanel.Destroy;
begin
if assigned(fbkgnd) then
fbkgnd.free;
inherited;
end;

procedure TTrPanel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
if ftransparentrate > 0 then // 移动时能获得正确的背景
invalidate;
inherited;
end;

procedure TTrPanel.Invalidate; // 刷新时重新计算背景
begin
if assigned(fbkgnd) then
begin
fbkgnd.free;
fbkgnd := nil;
controlstyle := constrolstyle - [csOpaque];
end;
inherited;
end;

procedure TTrPanel.InvalidateA; // 刷新时不重新计算背景(可以加快显示速度)
begin
inherited Invalidate;
end;

end.
 
Very Nice!! Thanks Alot!! :)
 
menxin:I will pay it to eyes for you:)
 
下一顿我请! :)
 
query+dbgrid 作显示,恶快
 
要有行列拖拉移动功能 。

 
个人感觉dbgrid主要在查询时使用(我常用它作监视工具,呵呵),要是用作数据
录入的话,如cakk所言,太不好控制,例如日期模板型的录入框它根本就无法提供,
用它作录入工具有点违背数据库程序的原则!^_^
如果程序的使用对象是熟练的录入员的话,也许可以考虑dbgrid,毕竟dbgrid是有
优点的--可以方便的进行诗句对照,但如果是普通用户的话,还是.....
 
可以把DBGRID和其他数据敏感控件结合起来用啊
 
to another_eyes: WS_CLIPCHILDREN的功能在哪?
 
Delphi带的DBGrid可没行列拖拉移动功能、汇总分组、自由排序等功能。
所以我现在改用dxDBGrid了,这东西功能很多,除以上这些小功能之外,
还有更多极好用的功能,且许多都是鼠标全程拖曳操作,时分方便,本来
在这一新版软件是我主要负责100多个报表的,结果有了它我差点没事可
作。
CJ你不妨换它试一试如何。
你若要我可EMail你。
 
dxDBGrid是不是就是Dev Express公司的那个grid? 如果是CJ恐怕早就有了. :-)
 
谢谢cAKK,那家公司的东西我有全套带源码的,不过,那个Chart没有for d5的
不晓得有没有免费升级
 
后退
顶部