我爱builder

C++Builder 程序员博客

比如TShapeEx::public TCustomControl
{
    TShape* FShape;
    __property TShape Shape = {read = FShape, write = SetShape, default = 0};
};
怎样在设计对话框时,将Shape的设置也自动保存起来?

不行啊,还是无法将Shape的内容保存到对话框dfm中去。

C/C++ code
/* 请将属性声明为published 一般大多数公用的属性会自动存储数据到dfm文件中 下次当调用这些文件时会自动恢复 */

楼上的老兄,我的的确是published的,只有这样在编辑框中属性栏才可以更改Shape的设置。但问题是更改过后,它不会保存到dfm文件中,是不是跟TShape指针有关,还是哪个地方需要设置?研究好几天了,都没找到问题点。

C/C++ code
一般公用的内建类型的属性,设置stored= true是总是存储,可能只对Boolean,int,等Set,TStringList 重用的属性类型支持。 我怀疑是属性数据类型的原因 TShape 属性,可能需要你自己定义方法来读写这样的属性数据 [code=C/C++]void __fastcall DefineProperties(TFiler *Filer)

你需要重载这个方法来实现存储TShape类型的数据。[/code]

你创建FShape的时机?

TShape 继承于TPersistent,一般不需要自己编写Filer

我把CPP文件帖出来,你帮看看
//—————————————————————————

#include <vcl.h>

#pragma hdrstop

#include "SharpeEx.h"
#pragma package(smart_init)
//—————————————————————————
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
#define SHAPE_MARGIN 5
static inline void ValidCtrCheck(TSharpeEx *)
{
    new TSharpeEx(NULL);
}
//—————————————————————————

//—————————————————————————
namespace Sharpeex
{
    void __fastcall PACKAGE Register()
    {
        TComponentClass classes[1] = {__classid(TSharpeEx)};
        RegisterComponents("Shui", classes, 0);
    }
}
//—————————————————————————

__fastcall TSharpeEx::TSharpeEx(TComponent* Owner)
    : TCustomControl(Owner)
{
    FShape = new TShape(this);
    FShape->Parent = this;
    FShape->Left = 2;
}
__fastcall TSharpeEx::~TSharpeEx()
{
    FShape->Parent = NULL;
    delete FShape;
}
void __fastcall TSharpeEx::Paint()
{
    if(FShape->Width != ClientRect.Width() - SHAPE_MARGIN)
        FShape->Width = ClientRect.Width() - SHAPE_MARGIN;
    if(FShape->Height != ClientRect.Height() - SHAPE_MARGIN)
        FShape->Height = ClientRect.Height() - SHAPE_MARGIN;
    Canvas->Brush->Color = Color;
    Canvas->Rectangle(ClientRect);
}

void __fastcall TSharpeEx::Assign(TPersistent* Source)
{
    TSharpeEx *pSrc = dynamic_cast <TSharpeEx*>(Source);
    TCustomControl::Assign(Source);
    FShape->Assign(pSrc->Shape);
    Invalidate();
}

void __fastcall TSharpeEx::CreateWnd(void)
{
    TCustomControl::CreateWnd();
    FShape->Left = 2;
    FShape->Top = 2;
}

头文件是这样的:
//—————————————————————————

#ifndef SharpeExH
#define SharpeExH
//—————————————————————————
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#pragma link "CANVASEX"
//—————————————————————————
class PACKAGE TSharpeEx : public TCustomControl
{
private:
    TShape* FShape;
    void __fastcall SetShape(TShape* pShape){ FShape->Assign(pShape);};
protected:
    virtual void __fastcall Paint();
    virtual void __fastcall Assign(TPersistent* Source);
public:
    __fastcall TSharpeEx(TComponent* Owner);
    virtual  __fastcall ~TSharpeEx();
virtual void __fastcall CreateWnd(void);
__published:
    __property TShape* Shape = { read = FShape, write = SetShape,stored = true };
};
//—————————————————————————
#endif

控件TCompoent有一个方法,叫 Loaded,这个方法是在系统加载了窗体资源后调用的。你可以重载这个方法,在这个方法中跟踪查看一下FShape的值是多少,是否系统已经加载了。通常情况下,需要自己处理加载资源后的处理,比如重绘。

如果检查Loaded方法中的FShape未加载,可以考虑自己来实现储存和加载,可以查看TWriter和TReader。

谢谢三位!

  • Filed under: C++ Builder
  • 在组件上添加组件
    比如在一个Edit的组件上添加lable组件
    效果是lable和Edit组件成为一体

    根据继承关系凡是TWinControl的子控件上面应该是都可以添加新的可视控件的,当然为了效果正如所愿还是需要自行继承控件建立新的控件并修改一些属性的.这样的结果就是无法通用,可以自用,呵呵,对于数据库方面的控件我常修改,可视控件没有改过.

    是可以的。设计个组件,从TWinControl继承,
    class PACKAGE TWinControl1 : public TWinControl
    {
    private:
        AnsiString __fastcall GetCaption()
        {
            return MyLabel->Caption;
        };
        void __fastcall SetCaption(AnsiString in_str)
        {
            MyLabel->Caption=in_str;
        };
    __published:
        TEdit*  MyEdit;
        TLabel*  MyLabel;
        __property  AnsiString Caption={read=GetCaption,write=SetCaption};
    public:
        __fastcall TWinControl1(TComponent* Owner);
    }

    在 cpp文件中
    __fastcall TWinControl1::TWinControl1(TComponent* Owner)
        : TWinControl(Owner)
    {
        MyLabel=new  TLabel(this);
        MyLabel->Parent=this;
        MyLabel->Left=0;
        MyLabel->Top=0;
        MyLabel->Width=40;
        MyLabel->Height=24;

        MyEdit=new  TEdit(this);
        MyEdit->Parent=this;
        MyEdit->Left=40;
        MyEdit->Top=0;
        MyEdit->Width=40;
        MyEdit->Height=24;
    }
    编译后install即可

    TLabelEdit 的源代码.

    楼主是vb用户…………..

  • Filed under: C++ Builder
  • 我在c++ bulider 6.0 里面安装了mscom组件后

    做了一个向串口发送的程序….

    在本机运行正常,但在其它机器不能运行。。。运行就会出现class not found

    我不知道怎么把mscom一起打包过去…在c++bulider6.0 中

    那就先不打包,你除了把EXE拷到另一个电脑上之外,MSCOM也拷过去。默认是和EXE在一个目录下。

    我刚才试了还是不行

    怎么样才可以了

  • Filed under: C++ Builder
  • 在vc中我会用,我不知道在bcb中如何调用com组件,谁能搞死我具体的方法步骤呢?

    http://blog.csdn.net/akirya/archive/2008/02/17/2100501.aspx
    看delphi的方法,跟bcb的一样

    我会了,好像用的import type library。跟vc不一样啊。vc用cocreate创建对象

    该回复于2008-07-19 16:09:47被版主删除

  • Filed under: C++ Builder
  • 昨天我在公司电脑上编个程序(该工程中不包含vclskin控件),然后保存该工程,这样保存下来的工程很干净,没有obj呀,tds呀那些文件,然后回去放我电脑上运行,竟然说少一个跟vclskin控件有关的文件.难道我在有VclSkin控件的BCB下编完的工程,无法在无VclSkin控件的BCB下编译?

    用记事本或者UltraEdit-32打开你工程的bpr文件,你会看到你曾经在这个工程上添加操作过vclskin,尽管你添加后又删除了

    引用 2 楼 yumikoo 的回复:
    用记事本或者UltraEdit-32打开你工程的bpr文件,你会看到你曾经在这个工程上添加操作过vclskin,尽管你添加后又删除了

    <PACKAGES value="rtl.bpi vcl.bpi vclx.bpi WinSkinC6.bpi"/>
    人才呀,我直接删了这句,这个工程还能用吗

    担心的话,你可以保存个备份进行删除操作,建议用UltraEdit-32进行打开操作。

    <PACKAGES value="rtl.bpi vcl.bpi vclx.bpi WinSkinC6.bpi"/>
    改成
    <PACKAGES value="rtl.bpi vcl.bpi vclx.bpi"/>

    引用 3 楼 zhangwuji156 的回复:
    引用 2 楼 yumikoo 的回复:
    用记事本或者UltraEdit-32打开你工程的bpr文件,你会看到你曾经在这个工程上添加操作过vclskin,尽管你添加后又删除了
    <PACKAGES value="rtl.bpi vcl.bpi vclx.bpi WinSkinC6.bpi"/>
    人才呀,我直接删了这句,这个工程还能用吗

    //============================================
    他说的没错的,你虽然在项目中未加上包,但BCB保存的时候,他会把你电脑上面BCB上面的所有的包都加入到该项目中,而家中没有.
    这时,你得用文本编辑器,打开这个项目,把所有有关与VCLSKIN有关的包都去掉,然后再编绎.

    我是这样做的,而且做了很多次了….

    !你不该叽讽告诉你答案的人,不管他回答的对与不对.(不过,自己要小心,先把自己的东西打包或备份,再改写.)

    楼上的老兄,我哪儿有讥讽了,我说"人才呀,是诚心的夸奖!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

    引用 4 楼 yumikoo 的回复:
    担心的话,你可以保存个备份进行删除操作,建议用UltraEdit-32进行打开操作。

    好多人喜欢UltraEdit哦,我比较喜欢editplus

  • Filed under: C++ Builder
  • 关于IP*Works!组件的信息怎么这么少

    IP*Works!组件,有中文帮助文件吗?

    帮顶…………

    ——————————————————-
    万部在线免费电影
    http://176969.cn

    英文功底好的朋友费点时间翻译一下

    金山快译
    其实也不需要全部翻译的清楚的,知道些大概就能去忽悠程序了。过程中会体会。

    IP*Works是个什么组件,哪儿有下的?

    没有

    妖哥网站有下

    妖哥网站有下

  • Filed under: C++ Builder
  • 请问我从网上下的c++builder6.0中咋没有server组件页呢?

    哎呀,这个我还真不记得了,请问哪个版本的有呢?我记得网上的C++builder安装程序还挺难找的…

    比较大的都比较难找!
    实在不行,俺传你个吧,不知道qq速度怎么样

    可能也是不太完整吧,你试着添加相应组件包看有没有这个面板
    我公司电脑装的也是不完整的版本,Servers面板上组件不全……

    家里的倒是挺全的,装的是5CD的。

    我有完整版的

    699MB iso 要的话 我给个地址你下载

    qq:462511021

    有没有把组件add进来?

    [size=11px]打开Borland C++Builder开发环境,点击Component,选择 Install Packages,可以看到Design Packages里面很多没有勾上,说明其实系统已经安装了该组件,只是没有选上显示而已,只需要勾上就可以了![/size]
      或许这个问题很简单,但是多讨论解决的不仅是问题本身,而是培养解决问题的心态

    是的。还有就是学如逆水行舟,爬的有点吃力呢!
    我已经重新安装了。好了。thank you .

    引用 8 楼 wangqi400 的回复:
    是的。还有就是学如逆水行舟,爬的有点吃力呢!
    我已经重新安装了。好了。thank you .

    揭帖阿!

    引用 8 楼 wangqi400 的回复:
    是的。还有就是学如逆水行舟,爬的有点吃力呢!
    我已经重新安装了。好了。thank you .

    揭帖阿!

    引用 8 楼 wangqi400 的回复:
    是的。还有就是学如逆水行舟,爬的有点吃力呢!
    我已经重新安装了。好了。thank you .

    揭帖阿!

    不断的学习才能进步。顶一下。

    最好还是自己买一张盘吧。

        找到BPL文件,加进来就行了。你可能装的是中文版,很多组件没有,其实已经装上去了,只是没有加进来而已。

    回复内容太短了!回复内容太短了!

    俺也要下载下来学习呢,呵呵

  • Filed under: C++ Builder
  • c++  memo组件 在c++ bulider6 的哪个选项kai里

    告诉你一个控件在哪儿,不能解决你以后的需要,
    告诉你,控件那一堆,点右键,然后最下面属性那个单词,
    然后进去是所有控件,选择按名排列,就能找到你要找的控件了,
    还可以装个CnPack控件,直接输入控件名,就可以找到该控件

    不需要装什么Onpack的,BCB自带的就有
    view-comconpent list下就有,输入控件名就可以添加控件

  • Filed under: C++ Builder
  • AnsiString name = Edit1->Text;
    AnsiString code = Edit2->Text;

    AnsiString SQL = "Select * from Login where 姓名=" + name +"and 密码=" + code;

    Query1->Close();
    Query1->SQL->Clear();
    Query1->SQL->Add(SQL);
    Query1->Open();
    if(Query1->IsEmpty())
    {
          ShowMessage("用户名和密码错误");
    }

    代码如上。出现错误如下:

    AnsiString SQL = "Select * from Login where 姓名='"+ name +"' and 密码='"+ code+"' ";
    就这样~~

    AnsiString SQL = "Select * from Login where 姓名='"+ name +"' and 密码='"+ code+"' ";
    樓主試下,sql是雙引號,c++是單引號

    楼上的已经回答了。

    AnsiString SQL = "Select * from Login where 姓名=" + name +"and 密码=" + code;

    建议少用拼接的sql语句,而用下面这种方式比表直观,而且不易出错!

    C/C++ code
    ADOQuery1->Close(); AnsiString SQL = "Select * from Login where 姓名=:name and 密码=:code "; ADOQuery1->SQL->Add(SQL); ADOQuery1->Parameters->ParamByName("name")->Value ="张三" ; ADOQuery1->Parameters->ParamByName("name")->Value ="北京欢迎你" ; //(假设用户名和密码都是varchar类型的) ADOQuery1->Open(); //后续操作!

    学习了
    想问一下
    如果字段名是中文
    5楼的SQL语句能否用?

    能~~~

    学习

    哈哈,sql里字符变量需要加''

    SQL语句生成的有问题。
    这样得出来的并不是真正你想要的SQL语句,另外,生成的SQL语句中字符变量引用的"应为';
    楼主可以加上ShowMessage(SQL)调试一下,看看就知道了;

    可以用以下的方式写SQL语句。

    AnsiString SQL =  "Select * from Login where 姓名=' + name;
              SQL += "' and 密码= '" + code;
              SQL += "'";

    这样就不会出问题了。

    还有建议楼主使用下面语句时,最好去掉首尾的空格,否则有些查询时会得不到你想要的结果。
    AnsiString name = Edit1->Text;

    这样会更好些:
    AnsiString name = Edit1->Text.Trim();

    谢谢,谢谢大家的帮助!搞定了!

    引用 10 楼 utin431 的回复:
    SQL语句生成的有问题。
    这样得出来的并不是真正你想要的SQL语句,另外,生成的SQL语句中字符变量引用的"应为';
    楼主可以加上ShowMessage(SQL)调试一下,看看就知道了;

    可以用以下的方式写SQL语句。

    AnsiString SQL =  "Select * from Login where 姓名=' + name;
              SQL += "' and 密码= '" + code;
              SQL += "'";

    这样就不会出问题了。

    中午太急,忘了加上字符串的后双纠号。
    AnsiString SQL =  "Select * from Login where 姓名='" + name;
              SQL += "' and 密码= '" + code;
              SQL += "'";

  • Filed under: C++ Builder
  • 设计了一个图片浏览器。使用Image组件显示图片,利用浏览器上的“删除”功能删除正在显示的图片后,并没有立即更新显示下一张图片。请帮忙解决一下!!!!!

    看删除和调用部分的代码。

    嗯,只能看你的代码

    Image1->Picture = NULL; 加这个看看

    我的删除部分程序是这样的:

    void __fastcall TForm1::delete1Click(TObject *Sender)
    {
      if(FileExists(FileListBox1->FileName))
      {
      int yesdelete;
      yesdelete=Application->MessageBox("确定删除此吗?","删除图片!",64);
      if(yesdelete=1)
      {
        DeleteFile(FileListBox1->FileName);
        FileListBox1->Update();
      }
      }
    }

    引用 4 楼 nuptwzp 的回复:
    Image1->Picture = NULL; 加这个看看

    是一个有效的方法!!!

  • Filed under: C++ Builder
  • 类别

    最新

    标签

    链接


    存档