实在没办法,各路数据库高手进来看看。 100元人民币解决这问题!!!!!!!!!(0分)

  • 主题发起人 主题发起人 devexpress
  • 开始时间 开始时间
D

devexpress

Unregistered / Unconfirmed
GUEST, unregistred user!
类型 单号 名称 单位 数量 单价 总价
山东(地区分组)
采购商品 CS-01-02 威龙特级酒 瓶 20 1.5 30
采购商品 CS-01-03 珠江啤酒 瓶 20 1.5 30
采购商品 CS-01-04 杭州原装酒 瓶 20 1.5 30
小计: 90

空一行

深圳
采购商品 CS-01-05 威龙特级酒 瓶 20 1.5 30
采购商品 CS-01-06 珠江啤酒 瓶 20 1.5 30
采购商品 CS-01-07 杭州原装酒 瓶 20 1.5 30
小计: 90

合计 180



如上述表格, 另外在"总价"的控件用 美元符表示的。像账务用的那种控件。
每格一行用不同的颜色表示。 

我刚刚下了ehlib,sncCurrency但不知道上面的这种表格用什么方法可以实现。
另外还有隔行用不同的颜色表示

我的 qq:15405747, 问题解决,一定付款.
 
快点帮帮我呀! 火急!!!!!!!!!
 
DevExpress Grid
 
这种输出可以采用临时表的方法,很简单嘛!
设计一张与你上面字段一样的数据库表(有必要的话也可以加几个辅助字段)
在你输出报表前,填写此表,数据怎末填应该知道吧
至于空行,显示颜色啥的都由你控制阿
显示颜色也可以借助第三方控件
 
to: devexpress
亏你还叫devexpress呢,用CJF说的dxdbgrid呀!
如果你不嫌麻烦,也可以用stringgrid来做,绝对灵活。
 
我在用Devexpress Grid, 但是有一些问题呀! 对地区进行分组时, 他前面老是显示一个加
号, 要去掉这个加号,

另外今天下午在dbgrid里把sncCurrency加上了,实现了这种美元金额显示, 另外解决了。
隔行显示。
我用的是dbgrid, 但是要 实现速达的那样,好像不是那么简单。 

 
qrband add; type = rtpagehead qrlabels = caption(类型 单号 名称 单位 数量 单价 总价);
qrband add; type = rtgrouphead qrdbtext.field = 地区
qrband add; type = rtdetail qrdbtext.field =类型 单号 名称 单位 数量 单价 总价
qrband add; type = rtgroupfoot qrdbtext = 小计 ; haschild = true;
qrband add; type = rtpagefoot qrexpr = 总计

上面给的提示不知你看不看得懂,不懂晚上再说。
 
谢谢上面的这位兄弟, 你的意思是实现打印对吗? , 我的意思是想做成这种表格
 
没有那个加号你怎么展开和合拢呀?
如果没看错,好象是画了个报表
 
下面是我做的源程序, 功能是实现用sncCurrency在表格里显示金额, 另外隔行显示不同颜色

unit dbtest;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, DBGrids, ExtCtrls, DBCtrls, StdCtrls, Mask, ComCtrls, Grids,
sncCurrency, sncDBCurrency, ToolWin, ADODB;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
sncDBCurrencyInplaceEdit: TsncDBCurrencyEdit;
ToolBar1: TToolBar;
DBNavigator1: TDBNavigator;
ADOQuery1: TADOQuery;
procedure SetHighLightColor;
procedure SetNormalColor;
procedure DBGrid1ColEnter(Sender: TObject);
procedure DBGrid1ColExit(Sender: TObject);
procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
procedure sncDBCurrencyInplaceEditEnter(Sender: TObject);
procedure sncDBCurrencyInplaceEditExit(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure sncDBCurrencyInplaceEditMoveOut(Sender: TObject;
var Key: Word; Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;

const
CurrencyFieldSet: array[0..2] of string=('dj', 'Freight', 'AmountPaid');

var
Form1: TForm1;

implementation

{$R *.DFM}

function CheckCurrencyField(FieldName: String): Boolean;
var
I: Integer;
begin
Result := False;
for I:=0 to Length(CurrencyFieldSet)-1 do
begin
if (FieldName=CurrencyFieldSet) then
begin
Result := True;
Break;
end;
end;
end;

procedure TForm1.SetHighLightColor;
begin
sncDBCurrencyInplaceEdit.Color := clHighLight;
sncDBCurrencyInplaceEdit.Font.Color := clWhite;
end;

procedure TForm1.SetNormalColor;
begin
sncDBCurrencyInplaceEdit.Color := DBGrid1.Color;
sncDBCurrencyInplaceEdit.Font.Color := DBGrid1.Font.Color;
end;

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
if CheckCurrencyField(DBGrid1.SelectedField.FieldName) then
begin
sncDBCurrencyInplaceEdit.DataField := DBGrid1.SelectedField.FieldName;
sncDBCurrencyInplaceEdit.Tag := 1;
end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
if CheckCurrencyField(DBGrid1.SelectedField.FieldName) then
begin
sncDBCurrencyInplaceEdit.Visible := false;
sncDBCurrencyInplaceEdit.Tag := 0;
end;
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (key<>chr(9)) and CheckCurrencyField(DBGrid1.SelectedField.FieldName) then
begin
sncDBCurrencyInplaceEdit.SetFocus;
SendMessage(sncDBCurrencyInplaceEdit.Handle, WM_Char, WORD(Key), 0);
end;
end;

procedure TForm1.sncDBCurrencyInplaceEditEnter(Sender: TObject);
begin
SetNormalColor;
end;

procedure TForm1.sncDBCurrencyInplaceEditExit(Sender: TObject);
begin
SetHighLightColor;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
sncDBCurrencyInplaceEdit.Color := DBGrid1.Color;
sncDBCurrencyInplaceEdit.Font.Assign(DBGrid1.Font);
sncDBCurrencyInplaceEdit.Tag := 0;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
OldColor, OldFontColor: TColor;
begin
if CheckCurrencyField(Column.FieldName) then
begin
if (gdFocused in State) then
begin
sncDBCurrencyInplaceEdit.Left := Rect.Left + DBGrid1.Left+2;
sncDBCurrencyInplaceEdit.Top := Rect.Top + DBGrid1.top+2;
sncDBCurrencyInplaceEdit.Width := Rect.Right-Rect.Left;
sncDBCurrencyInplaceEdit.Height := Rect.Bottom- Rect.Top;
SetHighLightColor;
if (sncDBCurrencyInplaceEdit.Tag=1) and not sncDBCurrencyInplaceEdit.Visible then
sncDBCurrencyInplaceEdit.Visible := True;
end
else
begin
OldColor := sncDBCurrencyInplaceEdit.Color;
OldFontColor := sncDBCurrencyInplaceEdit.Font.Color;
SetNormalColor;
DrawCurrencyFrame(DBGrid1.Canvas, Rect, sncDBCurrencyInplaceEdit, Column.Field.AsFloat);
sncDBCurrencyInplaceEdit.Color := OldColor;
sncDBCurrencyInplaceEdit.Font.Color := OldFontColor;
end;
end;
//隔行显示不同颜色
if not Odd(TDBGrid(Sender).DataSource.DataSet.RecNo) then begin
TDBGrid(Sender).Canvas.Brush.Color := clSkyBlue;
TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

end;


procedure TForm1.sncDBCurrencyInplaceEditMoveOut(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
case Key of
VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT:
begin
DBGrid1.SetFocus;
SendMessage(DBGrid1.Handle, WM_KEYDOWN, WORD(Key), 0);
end;
end;
end;

end.


上面的这段代码是我用dbgrid实现的, 但是我把dbgrid换成了dxDBGrid1(改名为dbgrid)
就出错。
if CheckCurrencyField(DBGrid1.SelectedField.FieldName) then  //这句错

[Error] dbtest.pas(79): Undeclared identifier: 'SelectedField'


 
急!!!!!!
 
你研究研究dev带的例子呀,所有的效果都有的。要什么你就照着做就行了呗!
 
我把dbgrid换成了dxDBGrid1(改名为dbgrid)
就出错。
括号里是一个字符类型,取字段的名称。用delphi自带的dbgrid下面的语句可以通过。
if CheckCurrencyField(DBGrid1.SelectedField.FieldName) then  //这句错

[Error] dbtest.pas(79): Undeclared identifier: 'SelectedField'

换了dxgrid就不行了。


 
dxDbGrid与Delphi自带的DBGrid原理不一样,其数据可以实现自动单批量调动,
你取字段的方法不对,在procedure TForm1.dxDBGrid1CustomDrawCell(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxTreeListColumn;
ASelected, AFocused, ANewItemRow: Boolean; var AText: String;
var AColor: TColor; AFont: TFont; var AAlignment: TAlignment;
var ADone: Boolean);中应该取TdxDBTreeListColumn(AColumn).Field
 
你光改名哪行呀,dxdbgrid根本就没有这个方法,当然会出错了。
 
to shinings, 上面的那段代码是在dbgrid里用的,把它哪到
dxdbgrid里用就出错了。 应该怎样写呢
procedure TForm1.DBGrid1CustomDraw(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxDBTreeListColumn;
const AText: String; AFont: TFont; var AColor: TColor; ASelected,
AFocused: Boolean; var ADone: Boolean);
var
OldColor, OldFontColor: TColor;
begin
if not Odd(TDBGridEH(Sender).DataSource.DataSet.RecNo) then begin
TDBGrid(Sender).Canvas.Brush.Color := sncDBCurrencyInplaceEdit.Color;
TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol,Column,State);//这句出错了
end;

[Error] dbtest.pas(189): Undeclared identifier: 'DBGridCustomDraw'
[Error] dbtest.pas(189): Undeclared identifier: 'State'
还有这句也出错了。
if CheckCurrencyField(DBGrid1.SelectedField.FieldName) then
 
老兄呀!你怎末还想着DBGrid呀
我说过的dxDBGrid与DBGrid的父类完全不同啊
你的强制转换TDBGrid(Sender)是错的,奇怪dxDBGrid已经提供了ACanvas,干吗还要自己
去找,总之忘掉DBGrid吧

换成取dxDBGrid对象的方式
 
不是跟你说了吗,DefaultDrawColumnCell跟SelectedField是dbgrid里的方法和属性,
dxdbgrid中没有,你这样调用它当然出错了,不出错才怪了呢。
dxdbgrid里有一个currency类型的column,你指定显示格式就可以了,很方便的
另外你想控制颜色也很容易,你看看它带的demo,其中有一个就是隔行换颜色的
 

procedure TForm1.DBGrid1CustomDraw(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; ANode: TdxTreeListNode; AColumn: TdxDBTreeListColumn;
const AText: String; AFont: TFont; var AColor: TColor; ASelected,
AFocused: Boolean; var ADone: Boolean);
var
OldColor, OldFontColor: TColor;
begin
if not Odd(DBGrid1.DataSource.DataSet.RecNo) then
AColor:= sncDBCurrencyInplaceEdit.Color;
end;
 
真的是不理解,dxdbgrid已经把很多工作都给你做好了,你干什么不用呢,非要自己写一
大堆代码,如果说你是出于学习的目的,还可以理解,不过也不值得提倡,大家都象你这样
学习,得到猴年才能成高手呀,估计还没成高手已经被饿死了。
老兄,好好研究研究别人的控件是怎么用的吧,人家写控件的人水平可比你高多了,你能想
到的人家早都想到了,就看你会不会用了。
说话可能难听了点,你可别生气。
 
后退
顶部