全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1001
推到 Plurk!
推到 Facebook!

自製的元件屬性為什麼無法讀到正確值

尚未結案
19830625
一般會員


發表:2
回覆:2
積分:0
註冊:2004-07-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-22 23:27:28 IP:211.76.xxx.xxx 未訂閱
以下是自製.h的檔案 #ifndef RESH #define RESH //-------------------------------------------------------------------    #include  #include #include #include <Forms.hpp> //-------------------------------------------------------------------- class PACKAGE TRES : public TGraphicControl { private: float FRes; protected: public: __fastcall TRES(TComponent* Owner); __published: __property float Res = {read = FRes, write = FRes}; }; //-------------------------------------------------------------------- #endif 以下是.cpp的檔案 //-------------------------------------------------------------------- #include #pragma hdrstop #include "RES.h" #pragma package(smart_init) //-------------------------------------------------------------------- static inline void ValidCtrCheck(TRES *) { new TRES(NULL); } //-------------------------------------------------------------------- __fastcall TRES::TRES(TComponent* Owner) : TGraphicControl(Owner) { FRes = 10000; } //-------------------------------------------------------------------- namespace Res { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TRES)}; RegisterComponents("元件", classes, 0); } } //-------------------------------------------------------------------- 做好之後我的元件有顯示屬性Res 可是我拉一個Label 在Button1Click下打入Label->Caption=RES->Res 卻顯示一大推亂數不是應該要顯示1000嗎 我自製元件那裡有少寫或寫錯的 麻煩各位大大幫忙 發表人 - 19830625 於 2004/12/22 23:32:02
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-23 01:24:42 IP:211.76.xxx.xxx 未訂閱
19830625你好: 試著在default的值寫在property 裡面: 例如: __property TBorderWidth BorderWidth = {read=FBorderWidth, write=SetBorderWidth, default=0};
19830625
一般會員


發表:2
回覆:2
積分:0
註冊:2004-07-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-28 01:47:21 IP:211.76.xxx.xxx 未訂閱
default加入還是不行 剛學元件的屬性製作,所以程式不知對不對 我做2個簡單的元件麻煩大大幫我看看好了
//--------------------------------------------------------------------
#ifndef LineH
#define LineH
//--------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
//--------------------------------------------------------------------
enum TLineStyle {lineStyle1,lineStyle2};
class PACKAGE TLine : public TGraphicControl
{
private:
        float FB;
        TLineStyle FLineStyle;
        void __fastcall SetLineStyle(TLineStyle Value);
protected:
        virtual void __fastcall Paint(void);
        virtual void __fastcall SetB(float value);
public:
        __fastcall TLine(TComponent* Owner);
__published:
        __property float B = {read = FB, write = SetB};
        __property TLineStyle LineStyle = {read = FLineStyle, write = SetLineStyle};
};
//--------------------------------------------------------------------
#endif
//--------------------------------------------------------------------
#include 
#pragma hdrstop    #include "Line.h"
#pragma package(smart_init)
//--------------------------------------------------------------------
static inline void ValidCtrCheck(TLine *)
{
        new TLine(NULL);
}
//--------------------------------------------------------------------
__fastcall TLine::TLine(TComponent* Owner)
        : TGraphicControl(Owner)
{
        Width = 30;
        Height = 10;
        FB = 100;
}    void __fastcall TLine::SetLineStyle(TLineStyle Value)
{
        FLineStyle = Value;
}    void __fastcall TBJT::SetVB(float value)
{
        FVB = value;
}    void __fastcall TLine::Paint(void)
{
        float x;
        Canvas->Pen->Width = 1;
        Canvas->Pen->Style = psSolid;
        switch(FLineStyle)
        {
        case lineStyle1:
                Height = 10;
                x = Width;                    Canvas->MoveTo(0,5);
                Canvas->LineTo(x,5);
                FB = 100;
                break;            case lineStyle2:
                Width = 10;
                x = Height;                    Canvas->MoveTo(5,0);
                Canvas->LineTo(5,x);
                FB = 100;
                break;
        }
}
//--------------------------------------------------------------------
namespace Line
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TLine)};
                 RegisterComponents("線路", classes, 0);
        }
}
//--------------------------------------------------------------------
上面的程式我有做2個不同的Style結果在讀FB的值是亂碼 而下面的另一個程式我可以讀到FBㄉ值不過我只做一個Style就可以 我做的所有元件都是這樣不知道為什麼
//--------------------------------------------------------------------
#ifndef BJTH
#define BJTH
//--------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
//--------------------------------------------------------------------
class PACKAGE TBJT : public TGraphicControl
{
private:
        float FB;
        float FVB;
        float FVC;
protected:
        virtual void __fastcall Paint(void);
        virtual void __fastcall SetB(float value);
        virtual void __fastcall SetVB(float value);
        virtual void __fastcall SetVC(float value);
public:
        __fastcall TBJT(TComponent* Owner);
__published:
        __property OnClick;
        __property OnMouseMove;
        __property float B = {read = FB, write = SetB};
        __property float VB = {read = FVB, write = SetVB};
        __property float VC = {read = FVC, write = SetVC};
};
//--------------------------------------------------------------------
#endif

//------------------------------------------------------------------- #include #pragma hdrstop #include "BJT.h" #pragma package(smart_init) //-------------------------------------------------------------------- static inline void ValidCtrCheck(TBJT *) { new TBJT(NULL); } //-------------------------------------------------------------------- __fastcall TBJT::TBJT(TComponent* Owner) : TGraphicControl(Owner) { Width = 35; Height = 35; FB = 100; } void __fastcall TBJT::SetB(float value) { FB = value; } void __fastcall TBJT::SetVB(float value) { FVB = value; } void __fastcall TBJT::SetVC(float value) { FVC = value; } void __fastcall TBJT::Paint(void) { float x; x = Width; Height = 10; Canvas->Pen->Width = 1; Canvas->Pen->Style = psSolid; if (FVB > FVC) Canvas->Pen->Color = clRed; else Canvas->Pen->Color = clBlack; Canvas->MoveTo(0,5); Canvas->LineTo(x,5); FB = 100; } //-------------------------------------------------------------------- namespace Bjt { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TBJT)}; RegisterComponents("例題", classes, 0); } } //--------------------------------------------------------------------
而上面第2個程式如果我把它拉到form使用之後 照理說應該要寫BJT1->VC=Edit1->Text; 可是執行卻是錯誤的 而必須寫BJT1->VC=StrToFloat(Edit1->Text); 發表人 - 19830625 於 2004/12/28 17:29:34
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-28 12:53:27 IP:220.139.xxx.xxx 未訂閱
1. 在 BCB 的 .h/.hpp 內宣告的元件屬性 __property , 其 default 是沒有作用的, 如果真的要作,是除了在宣告時設定 default 外,還要在建構元內 自己按您宣告的 default 值設定才有作用。(因為那是 Delphi 才有的功能, BCB 只有介面相同,但建構元不會幫我們作,必需自己作。)    2. 對於自製元件的部分,我通常是沒有放在 Palette/IDE 內,而是自己去 new/delete,而按您的寫法,應該可以由 Palette 直接拉到表單內,同時, 由 Object Inspector 內就可以看到 Res,B,... 等等這些您所宣告的 __property 也可以直接由 Object Inspector 就直接設定它的數值。 如果這個部分是 OK 的,那應該在程式中使用就沒有問題,也不會有亂碼, 如果有亂碼,那在 Object Inspector 內就應該要看到亂碼才是。    一般只要在建構元中把相關的資料的初始化了,那在使用時就應該沒有問題了。    對了,請您修改您的文章,在貼程式碼時請使用以下格式: [code] // BCB, Delphi 的程式碼 [/code] 這樣,別人才能看懂您的程式,不然,有許多的大於/小於都不見了, 同時,程式碼也會變得沒有縮排而不易讀。 吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ KTOP VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com
19830625
一般會員


發表:2
回覆:2
積分:0
註冊:2004-07-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-31 20:00:23 IP:218.165.xxx.xxx 未訂閱
謝謝各位大大的幫忙 沒錯是我自己沒用好
系統時間:2024-04-28 17:58:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!