我爱builder

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]);
        }
}
多谢!

  • Filed under: C++ Builder
  • 用GifImage组件显示动画后CPU占用高资源怎么解决?
    显示少量动画没事,显示几十个gif动画后CPU占用资源急剧上升,几乎耗尽!

    引用 1 楼 yf2100 的回复:
    IE里同时显示几十个gif也会资源耗尽di~

    没有别的办法?

  • Filed under: C++ Builder
  • 虽然是老问题,但是大家似乎都忽略了一个问题,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);

    顶!

  • Filed under: C++ Builder
  • 这个问题,我从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 才行。

    貌似來晚了?

  • Filed under: C++ Builder
  • 首先谢谢您的关注!
    在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我知道是表示句柄,但是具体表示哪个句柄啊?是屏幕的?对话框的?还是哪个窗口的(如果程序有多窗口),请大家多帮助,小弟菜鸟一个!先谢谢啦

    怎么这个人还没封号啊?

    那个人发什么了?

    怎么没人答啊!谢谢大家啦!

    大家帮帮忙啊,自己先顶!

  • Filed under: C++ Builder
  • 因为我想在DBGrid的列在被手动的时候改变它的宽度,所以该响应放在了OnDrawColomnCell里
    而改变列宽的时候,又触发了OnDrawColomnCell,成了死循环

    建议大版将此无赖的ID封了

    引用 2 楼 EagleFew 的回复:
    建议大版将此无赖的ID封了

    我不就是问问题多了点吗,哪儿无赖了,难道我解决的问题没有结贴吗?

    这个问题中,虽然我明白了为什么显示不正常,却解决不了显示不正常,所以提一下,让大家也做个借鉴,我起这样的题目,无非是让以后在CSDN上提问的人能方便的搜到我的提问,看有没有类似的情况,我是为后人着想,你明不明白啊

    眼看用CB的人越来越少,好不容易有我这么一位热心的初学者,你还打压,封我号?封我号我就没法问人问题,没法问人问题,我就没法学CB了,我没法学CB,就只能学VC,你难道想逼一个想学CB的人学VC,你用心何其毒也!

  • Filed under: C++ Builder
  • 请高手指教

    前面有很多人发过帖子问这个问题了 找找看。

    老问题了
    明天去公司给你代码

    妖哥网站
    或者ehlib控件

    有非常多的类似的问题了…反正我是问过不少了……..搜索下,,答案多多

    个人感觉ehlib控件不错,直接导出

    贴一个以前的代码, BCB 6.0 通过,不过有好久不用BCB了

    C/C++ code
    //把数据集导出到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隔开,
    文本格式,写起来太方便了;

  • Filed under: C++ Builder
  • 设置了DataSource,DataSource1也连接了Table
    就是DBList中没有显示数据

    C/C++ code
    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();
      }

  • Filed under: C++ Builder
  • 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程序中 确实是可以的,

  • Filed under: C++ Builder
  • 本人做了一个股金管理的软件,数据库存的是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被版主删除

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档