C++Builder 程序员博客
StringGrid1显示单元格如何控制显示的内容在中央?(包括上下中央,左右中央)
不过这样标题栏颜色也没了,可以改回DefaultDrawing = true;
再在上面代码前加一句: StringGrid1->Canvas->FillRect(Rect); //填充单元格画布
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
StringGrid1->Cells[1][1]="中华人民";
}
//—————————————————————————
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
if (ARow==1 && ACol==1)
{
StringGrid1->Canvas->Brush->Color=clRed;
StringGrid1->Canvas->FillRect(Rect);
StringGrid1->Canvas->Font->Color=clWhite;
String s=StringGrid1->Cells[ARow][ACol];
int txtwidth =StringGrid1->Canvas->TextWidth(s); //文本宽度
int txtheight=StringGrid1->Canvas->TextHeight(s);
StringGrid1->Canvas->TextOut(
Rect.Left+(Rect.Width()-txtwidth)/2,
Rect.Top+(Rect.Height()-txtheight)/2,
StringGrid1->Cells[1][1]);
}
}
多谢!
4 Sep
用GifImage组件显示动画后CPU占用高资源怎么解决?
显示少量动画没事,显示几十个gif动画后CPU占用资源急剧上升,几乎耗尽!
没有别的办法?
4 Sep
虽然是老问题,但是大家似乎都忽略了一个问题,if(dbgrd1->DataSource->DataSet->RecNo%2),在用RecNo判定时,只对特定数据库有用,所以对于SQL,根本没有用,也不会看到隔行显示的结果,,在SQL中建立id字段,此句改为 if(Query1->FieldByName("id")->AsInteger%2),就解决问题啦!完整代码如下:
if(Query1->FieldByName("id")->AsInteger%2)//关键语句
{
suiDBGrid1->Canvas->Brush->Color=0×00FFF5E8;
suiDBGrid1->Canvas->Font->Color=clBlack;
}
else
{
suiDBGrid1->Canvas->Brush->Color=0×00E8E8E8;
suiDBGrid1->Canvas->Font->Color=clBlack;
}
suiDBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
顶!
19 Aug
这个问题,我从delphi版块中查到了汉化的办法(作者是StarRains(星雨)):
1. 打开文件consts.pas(在Delphi安装目录的\source\vcl下)
2. 将以下资源字符串常量的值进行改动:
SMsgDlgWarning = '警告';
SMsgDlgError = '错误';
SMsgDlgInformation = '信息';
SMsgDlgConfirm = '确认';
SMsgDlgYes = '(&Y)是';
SMsgDlgNo = '(&N)否';
SMsgDlgOK = '确定';
SMsgDlgCancel = '放弃';
SMsgDlgHelp = '(&H)帮助';
SMsgDlgHelpNone = '无效的帮助';
SMsgDlgHelpHelp = '帮助';
SMsgDlgAbort = '(&A)放弃';
SMsgDlgRetry = '(&R)重试';
SMsgDlgIgnore = '(&I)忽略';
SMsgDlgAll = '(&A)全部';
SMsgDlgNoToAll = '(&o)全不';
SMsgDlgYesToAll = '(&A)全是';
—- 经过这样改动后,对应按钮的热键仍然可以使用。
3.打开文件dialogs.pas(在Delphi安装目录的\source\vcl下)
4.查到ButtonCaptions:
把 ButtonCaptions: array[TMsgDlgBtn] of Pointer = (
@SMsgDlgYes, @SMsgDlgNo, @SMsgDlgOK, @SMsgDlgCancel,
@SMsgDlgAbort,@SMsgDlgRetry, @SMsgDlgIgnore, @SMsgDlgAll,
@SMsgDlgNoToAll, @SMsgDlgYesToAll, @SMsgDlgHelp);
改为
ButtonCaptions: array[TMsgDlgBtn] of string = (
'是', '否', '确定', '取消', '退出','重试', '跳过',
'所有', '全不', 'YesToAll', '帮助');
把 LoadResString(ButtonCaptions[B]) 改为ButtonCaptions[B]
(注意共有二处)
5. 修改后编译生成dialog.dcu、consts.dcu文件。
6. 将dialog.dcu、consts.dcu文件拷贝到..\delphi6\lib目录下。
但我只要在项目中加入dialog.pas编译,就会出错!编译consts.pas倒是没问题。我用的是C++ Builder 5。
有哪位朋友试成功的吗?如果试成功的话,能否将编译好以后的dialog.dcu和consts.dcu寄给我?第一个寄给我的朋友,将得到最多的分数!进来顶贴的人也有分。我的电子邮件是puma66@sina.com
我的做法是:
1、将BCB目录下的dialogs.pas拷贝一份到你的源程序目录中,然后,修改源程序目录下的dialogs.pas文件,将ButtonCaptions改为中文,
2、运行BCB,打开你的软件project,击Project菜单的Add to project菜单项,在对话框的文件类型,选择Pascal unit(*.pas),然后将修改后的dialogs.pas添加入你的的软件porject。
3、编译你的程序,OK!
不用这么麻烦的
仅仅修改 dialogs.pas 即可
resourcestring {下面为增加的代码 仅仅修改三个}
SMsgDlgYes1 = '(&Y)是';
SMsgDlgNo1 = '(&N)否';
SMsgDlgOK1 = '(&O)确认';
var {原来的代码}
Captions: array[TMsgDlgType] of Pointer = (@SMsgDlgWarning, @SMsgDlgError,
@SMsgDlgInformation, @SMsgDlgConfirm, nil);
IconIDs: array[TMsgDlgType] of PChar = (IDI_EXCLAMATION, IDI_HAND,
IDI_ASTERISK, IDI_QUESTION, nil);
ButtonNames: array[TMsgDlgBtn] of string = (
'Yes', 'No', 'OK', 'Cancel', 'Abort', 'Retry', 'Ignore', 'All', 'NoToAll',
'YesToAll', 'Help');
ButtonCaptions: array[TMsgDlgBtn] of Pointer = ( {仅仅修改三个Caption 如SMsgDlgYes1}
@SMsgDlgYes1, @SMsgDlgNo1, @SMsgDlgOK1, @SMsgDlgCancel, @SMsgDlgAbort,
@SMsgDlgRetry, @SMsgDlgIgnore, @SMsgDlgAll, @SMsgDlgNoToAll, @SMsgDlgYesToAll ,@SMsgDlgHelp);
将 dialogs.pas 加入 Project,修改 Options
不选择 Build With Runtime Packages
我也不是很清楚 dialogs.pas 的代码已经被编译到哪个 BPL 中的
TO nikita2000,我按照你的方法成功地编译了dialogs.pas,然后将重新编译后的dialog.dcu和consts.dcu拷入到
C:\program files\Borland\CBuilder5\Lib\Obj下,覆盖原文件,但还是不行,MessageDlg中的按钮还是显示英文,不知问题出在哪里?你改了以后,能显示中文吗?
搞定!受Behard 的启发,原来编译时要不选择 Build With Runtime Packages 才行。
貌似來晚了?
6 Aug
首先谢谢您的关注!
在MM_TEXT映射模式(默认)下,我想在逻辑坐标下画个矩形(坐标点是:(0,0),(0,-100),(100,-100),(100,0)),并在设备空间显示(显示器)。我想把视口的圆点改在(200,200)来显示逻辑坐标下的矩形(即窗口圆点(0,0)
对应视口的新圆点(200,200)),可是显示不出来。郁闷!我的程序是这样写的(在此没区分语法的大小写):
1. hdc hdc=getdc(handle); //获取设备上下文句柄
2. setviewportorgex(hdc,200,200,NULL);//设置视口圆点(200,200),让窗口圆点(0,0)和它对应
3. canvas->rectangle(0,0,100,-100);//在逻辑坐标的右上角画矩形
4. releasedc(handle,hdc); //释放dc的句柄
请问大家应该如何改进,是不是要用到lptodp或dptolp啊?如果用怎么写?我觉得画图应按以下顺序:
1.设置映射模式
2.设置窗口及视口圆点
3.设置窗口及视口坐标
4.在逻辑坐标内画图
5.用lptodp或dptolp显示在显示器上
不知对不对!
还有,handle我知道是表示句柄,但是具体表示哪个句柄啊?是屏幕的?对话框的?还是哪个窗口的(如果程序有多窗口),请大家多帮助,小弟菜鸟一个!先谢谢啦
怎么这个人还没封号啊?
那个人发什么了?
怎么没人答啊!谢谢大家啦!
大家帮帮忙啊,自己先顶!
5 Aug
因为我想在DBGrid的列在被手动的时候改变它的宽度,所以该响应放在了OnDrawColomnCell里
而改变列宽的时候,又触发了OnDrawColomnCell,成了死循环
建议大版将此无赖的ID封了
这个问题中,虽然我明白了为什么显示不正常,却解决不了显示不正常,所以提一下,让大家也做个借鉴,我起这样的题目,无非是让以后在CSDN上提问的人能方便的搜到我的提问,看有没有类似的情况,我是为后人着想,你明不明白啊
眼看用CB的人越来越少,好不容易有我这么一位热心的初学者,你还打压,封我号?封我号我就没法问人问题,没法问人问题,我就没法学CB了,我没法学CB,就只能学VC,你难道想逼一个想学CB的人学VC,你用心何其毒也!
5 Aug
请高手指教
前面有很多人发过帖子问这个问题了 找找看。
老问题了
明天去公司给你代码
妖哥网站
或者ehlib控件
有非常多的类似的问题了…反正我是问过不少了……..搜索下,,答案多多
个人感觉ehlib控件不错,直接导出
贴一个以前的代码, BCB 6.0 通过,不过有好久不用BCB了
//把数据集导出到Excel void __fastcall TDM::ExportDataSetToExcel(TDataSet * DataSet) { if(!DataSet->Active) throw Exception("数据集没有打开!"); if(DataSet->RecordCount==0) throw Exception("没有可以导出的记录"); Variant excel,wb1,ws1,cell; try { excel=Variant::CreateObject("Excel.Application"); try { //excel.Exec(PropertySet("Visible")<<true); wb1=excel.Exec(PropertyGet("WorkBooks")); wb1.Exec(Procedure("Add")); wb1=excel.Exec(PropertyGet("ActiveWorkbook")); Variant v=wb1.Exec(PropertyGet("Worksheets")); ws1=v.Exec(PropertyGet("Item")<<1); int fc=DataSet->Fields->Count; int i=0,j=0; DataSet->DisableControls(); DataSet->First(); for(j=0;j<fc;j++){ ws1.Exec(PropertySet("Cells")<<1<<j+1 <<DataSet->Fields->Fields[j]->DisplayLabel); } while(!DataSet->Eof){ i++; for(j=0;j<fc;j++){ ws1.Exec(PropertySet("Cells")<<i+1<<j+1 <<DataSet->Fields->Fields[j]->Value); } DataSet->Next(); } excel.Exec(PropertySet("Visible")<<true); } catch (Exception &e){ try{ excel.Exec(Procedure("Quit")); } catch(…) { } Application->ShowException(&e); } } __finally { DataSet->EnableControls(); } } //—————————————————————————
ehlib
如果只想简单的转换成.xls,可用文本格式的xls,既快又简单,
唯一的缺点不含控制格式.
列与列用 tab:chr(8)隔开,行与行用 \r\n隔开,
文本格式,写起来太方便了;
5 Aug
设置了DataSource,DataSource1也连接了Table
就是DBList中没有显示数据
qry->Close(); qry->SQL->Clear(); qry->SQL->Add("select description from userTest"); qry->Open(); while(!qry->Eof) { DBListBox1->Items->Add(qry->Fields->Fields[0]->AsString); qry->Next(); }
一个DBListBox只能显示一个字段中的数据。
楼上的正解,需要手动加进去的.
原来这样,那和TList有什么区别?都需要手动加。。。
还有假如手动加进去了,选择某个记录是不是记录指针就指到数据库的那条记录了呢?
上面写错了,是TListBox
简单的区别就是dblistbox是和数据库相联系的,你可以为它设置一个表和字段,这样就可以关联到数据库中的数据了,比如当你给dblistbox赋值了后,选中其中一项,那么就等于指针指向了这条记录(如果你有dbgrid连接到同样的表的话,就可以看到这个dbgrid的记录指针在移动),而listbox是没有这个特性的,顶多可以把数据表的值付给它,但之后就完全跟数据库没有关系了.
那DBGrid只显示一个字段也就等于DBListBox
而且还没DBListBox那么麻烦
是啊 DBListBox只能显示一个字段,显示的字段多了很麻烦的。用DBGrid多方便啊。
ADOTable1->Open();
ADOTable1->First();
while(!ADOTable1->Eof){
//以添加Name这列为例
DBListBox1->Items->Append(ADOTable1->FieldByName("Name")->AsString) ;
//或
//DBListBox1->Items->Add(qry->Fields->Fields[0]->AsString);
ADOTable1->Next();
}
3 Aug
VCL是不允许直接对MDIChild子窗体进行ShowModal()的,而且如果让MDIChild成为整个应用程序的模态窗口似乎也没什么意义。
我看见过一些程序(不是BCB或Delphi写的),在一个子窗体Form1中ShowModal另一个子窗体Form2,此时的Form1是不响应操作的(只能先关闭Form2),而另一个子窗体Form3和主窗体是可以响应的。
我想这在BCB下肯定也可以实现吧?
把Enabled设为false恐怕不合适,因为我不知道Form2什么时候关闭,如果在Form2的OnClose事件中写Form1->Enabled=true;有几点不妥:
1.将使程序变得复杂,不符合模块高内聚低耦合的原则.
2.而且Form2也不一定由Form1打开,也许被直接打开或第三者打开或者不是模态显示.
3.Form2被ShowModal后必须在Form1上层显示,但其他Form可以把它覆盖。
3.再者我希望它返回ModalResult。
我不一定要使用ShowModal这个函数,肯定应该有API可以实现的吧,有些软件更牛,当ShowModal了另一个子窗体后,虽然自己的界面不能响应,但窗口标题还是可以响应,可以最大化和移动等。
可以使用API函数:SetWindowPos()
设置置顶:SetWindowPos(form2->hwnd, -1, 0, 0, 0, 0, 3)
取消置顶:SetWindowPos(form2->hwnd, -2, 0, 0, 0, 0, 3)
我不是要它置顶,而是要它对于建立它的Owner窗体来说是模态显示的,即不关闭是不能响应Owner窗体的点击的,但其他窗体不受限制。
该回复于2008-07-10 02:43:22被版主删除
楼主说的是非MDI程序中 确实是可以的,
正如1楼的 所述。。showmodal的说明!
前面的人说的很多了
学习啦
楼主说的是非MDI程序中 确实是可以的,
29 Jul
本人做了一个股金管理的软件,数据库存的是jpg文件,经过转换后为什么不能在qrdbimage显示呢?单独可以输出成bmp文件!!!谢谢各位高手给予相助。
代码如下:
void __fastcall TNewForm::QuickRep1BeforePrint(TCustomQuickRep *Sender,
bool &PrintReport)
{
bmp1 = new Graphics::TBitmap();
jp1 = new TJPEGImage();
ms1 = new TMemoryStream();
// ADOQuery1-> FieldByName( "birthdate ")-> Value;
// TADOBlobstream.Create(PrintForm-> ADOQuery1-> FieldByName( "photo ")-> Value;
//TADOBlobstream.Create(((TBlobField*)(PrintForm-> ADOQuery1-> FieldByName( "photo ")))-> SaveToStream(ms), bmRead);
// SaveToStream( ms );
//ms=TBlobStream.Create(((TBlobField*)(PrintForm-> ADOQuery1-> FieldByName( "photo "))), bmRead);
// ((TBlobField*)(PrintForm-> ADOQuery1-> FieldByName( "photo ")))-> SaveToStream(ms);
ms1=PrintForm-> ADOQuery1-> CreateBlobStream(PrintForm-> ADOQuery1-> FieldByName( "photo "), bmRead);
ms1-> Position = 0;
jp1-> LoadFromStream( ms1 );
//jp1-> SaveToFile( "c:\photo1.jpg ");
jp1-> DIBNeeded();
bmp1-> Assign(jp1);
if (bmp1-> Empty==true)
{ShowMessage( "bmp文件为非法! ");
return;
}
//bmp-> LoadFromStream(ms1);
// bmp1-> SaveToFile( "c:\photo.bmp ");
photo-> Picture-> Bitmap-> Assign(bmp1);
// photo-> Picture-> Assign(bmp1);
delete bmp1;
delete jp1;
delete ms1;
}
该回复于2008-07-10 02:39:09被版主删除