[Delphi:90541] Delphi 環境とC++Builder環境

88 views
Skip to first unread message

seizo

unread,
Jul 12, 2008, 11:39:24 PM7/12/08
to Del...@ml.users.gr.jp
自作のコンポーネントが、Delphi 環境では動くのですが、C++Builder では
動かず困っています。どなたかお助け下さい。
(Delphi4 と C++Builder5 を使用)
このコンポーネントの宣言部は、以下の様なものです。

/////////////////////////////////////////////////////////////////////
{ パラメータ保存用コンポーネント TParameter }
unit Param;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type

EValueName = class(Exception);

TParameter = class(TComponent)
private
{ Private 宣言 }
FParams: TStringList; // 各パラメータの格納領域
FDir: String; // パラメータ保存ファイルを置くフォルダ
FFileName: String; // パラメータ保存ファイル名
FExeName: String; // アプリケーションの実行ファイル名
function GetParam(Index: Integer): String;
function GetSValue(const Name: String): String;
function GetBValue(const Name: String): Boolean;
function GetIValue(const Name: String): Integer;
function GetYValue(const Name: String): TFontStyles;
function GetFValue(const Name: String): Extended;
function GetDir: String;
function GetFileName: String;
function GetFullName: String;
function GetExeName: String;
procedure SetParam(Index: Integer; const Value: String);
procedure SetSValue(const Name, Value: String);
procedure SetBValue(const Name: String; Value: Boolean);
procedure SetIValue(const Name: String; Value: Integer);
procedure SetYValue(const Name: String; Value: TFontStyles);
procedure SetFValue(const Name: String; Value: Extended);
procedure SetDir(const Value: String);
procedure SetFileName(const Value: String);
procedure SetExeName(const Value: String);
protected
{ Protected 宣言 }
function GetCount: Integer; virtual;
public
{ Public 宣言 }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function Add(const S: String): Integer; virtual;
function IndexOfName(const Name: String): Integer;
procedure Init; virtual;
procedure Clear; virtual;
procedure Insert(Index: Integer; const S: String); virtual;
procedure Delete(Index: Integer); virtual;
procedure LoadFromFile; virtual;
procedure SaveToFile; virtual;
{ プロパティ宣言 }
property Params[Index: Integer]: String read GetParam write SetParam;
property SValues[const Name: String]: String read GetSValue write SetSValue;
property BValues[const Name: String]: Boolean read GetBValue write SetBValue;
property IValues[const Name: String]: Integer read GetIValue write SetIValue; default;
property YValues[const Name: String]: TFontStyles read GetYValue write SetYValue;
property FValues[const Name: String]: Extended read GetFValue write SetFValue;
published
{ Published 宣言(プロパティ宣言) }
property Dir: String read GetDir write SetDir;
property FileName: String read GetFileName write SetFileName;
property FullName: String read GetFullName;
property ExeName: String read GetExeName write SetExeName;
property Count: Integer read GetCount;
end;

/////////////////////////////////////////////////////////////////////

C++Builder では、このコンポーネントのインストール及びフォームに配置する
ところまでは問題ないのですがアプリケーション作成時に以下の様なエラーが
出て、配列プロパティ BValues[] と YValues[] がプロパティであると認めて
もらえません。

/////////////////////////////////////////////////////////////////////

[C++エラー] Param.hpp(60): ) expected
[C++エラー] Param.hpp(62): ) expected
[C++エラー] Param.hpp(95): 'GetBValue' is not a member of 'Param:TParameter'.
[C++エラー] Param.hpp(97): 'GetYValue' is not a member of 'Param:TParameter'.

/////////////////////////////////////////////////////////////////////

Param.hpp のエラーが出た 60, 62, 95, 97 の各行は次の様な感じです。

/////////////////////////////////////////////////////////////////////

(60行目) bool __fastcall GetBValue(const System::AnsiString Name);
(62行目) Graphics::TFontStyles __fastcall GetYValue(const System::AnsiString
Name);
(95行目) __property bool BValues[System::AnsiString Name] = {read=GetBValue,
write=SetBValue};
(97行目) __property Graphics::TFontStyles YValues[System::AnsiString Name] =
{read=GetYValue, write=SetYValue};

/////////////////////////////////////////////////////////////////////

また、IValues[] プロパティの宣言が、Param.hpp では、次の様になり実際には、
ディフォルトプロパティとなっていないようなのです。

/////////////////////////////////////////////////////////////////////

__property int IValues[System::AnsiString Name] = {read=GetIValue,
write=SetIValue/*, default*/};

/////////////////////////////////////////////////////////////////////

配列プロパティ BValues[] と YValues[] 以外のプロパティは、一応機能する
みたいです。どなたかお助け下さい。

なおこのコンポーネントの全ソースは以下にあります。

http://www.vector.co.jp/soft/win95/prog/se451111.html

2008.07.13(Sun) 12:08

槻 誠三(けやき せいぞう)

TAKAHASHI, Tomohiro

unread,
Jul 14, 2008, 9:42:13 AM7/14/08
to Del...@ml.users.gr.jp
高橋(智)です。

C++Builderのメーリングリストやnewsgroupで尋ねられたほうが良いのではないでしょうか?

--
高橋智宏

seizo wrote:
>
> 自作のコンポーネントが、Delphi 環境では動くのですが、C++Builder では
> 動かず困っています。どなたかお助け下さい。
> (Delphi4 と C++Builder5 を使用)

snip

TAKAHASHI, Tomohiro

unread,
Jul 14, 2008, 12:34:25 PM7/14/08
to Del...@ml.users.gr.jp
高橋(智)です。

GetBValue と GetYValue は、include\wingdi.h の中でマクロとして define されて
いるので、それと衝突していると思います。
Param.pas で宣言している GetBValue と GetYValue のメソッド名をもっと別のもの
に変更されると良いと思います。

--
高橋智宏

seizo wrote:
snip

> /////////////////////////////////////////////////////////////////////
>
> [C++エラー] Param.hpp(60): ) expected
> [C++エラー] Param.hpp(62): ) expected
> [C++エラー] Param.hpp(95): 'GetBValue' is not a member of 'Param:TParameter'.
> [C++エラー] Param.hpp(97): 'GetYValue' is not a member of 'Param:TParameter'.
>
> /////////////////////////////////////////////////////////////////////
>
> Param.hpp のエラーが出た 60, 62, 95, 97 の各行は次の様な感じです。
>
> /////////////////////////////////////////////////////////////////////
>
> (60行目) bool __fastcall GetBValue(const System::AnsiString Name);
> (62行目) Graphics::TFontStyles __fastcall GetYValue(const System::AnsiString
> Name);
> (95行目) __property bool BValues[System::AnsiString Name] = {read=GetBValue,
> write=SetBValue};
> (97行目) __property Graphics::TFontStyles YValues[System::AnsiString Name] =
> {read=GetYValue, write=SetYValue};

snip

seizo

unread,
Jul 15, 2008, 9:10:26 AM7/15/08
to Del...@ml.users.gr.jp
高橋智宏さん有難う御座います。

> GetBValue と GetYValue は、include\wingdi.h の中でマクロとして define されて
>いるので、それと衝突していると思います。

感謝感激です。コメントは付かないかも知れないとあきらめかけていましたが、
本当に助かりました。やはりどの様な現象にも必ず原因があるものですね。
本当に有難う御座います。

で、恐縮ですがもうひとつお尋ねしたい事があります。、配列プロパティ
IValues[] が、Delphi 環境ではディフォルトプロパティとなるのに C++Builder
環境ではなぜディフォルトプロパティとならないのでしょうか。この現象にも何か
原因があるとは思うのですが。

2008.07.15(Tue) 22:03

槻 誠三(けやき せいぞう)

H.Matsushima

unread,
Jul 15, 2008, 10:34:00 AM7/15/08
to Del...@ml.users.gr.jp
松島@エリーです。

seizoさんこんばんは

seizo さんは書きました:


> で、恐縮ですがもうひとつお尋ねしたい事があります。、配列プロパティ
> IValues[] が、Delphi 環境ではディフォルトプロパティとなるのに C++Builder
> 環境ではなぜディフォルトプロパティとならないのでしょうか。この現象にも何か
> 原因があるとは思うのですが。

http://support.codegear.com/article/35944
「C++Builder Tips - C++Builder プログラミング情報 - Delphi との比較 -」

上記の最後「9.その他」のように、C++Builder の言語規格にデフォルトプロ
パティという概念が無いためです。

プロパティへのアクセスに . ではなく -> を使うため、デフォルトプロパティ
を認めると構文解析に支障をきたすのかも知れません。


#新たな質問の場合、返信ではなく新規に投稿してもらえると助かります


--
松島

TAKAHASHI, Tomohiro

unread,
Jul 15, 2008, 10:07:04 PM7/15/08
to Del...@ml.users.gr.jp
高橋(智)です。

Param.hpp のクラスのメンバに
public:
int operator[](AnsiString Name) { return IValues[Name]; }
という宣言があると思いますが、それがデフォルトパラメータとして機能するのでは
ないでしょうか?

--
高橋智宏

seizo wrote:
snip

Norihiro M.

unread,
Jul 16, 2008, 1:30:09 AM7/16/08
to Del...@ml.users.gr.jp
 緑啓と申します。

 そろそろやめた方がいいかなと思いつつちょっとだけ。

Wed, 16 Jul 2008 11:07:04 +0900
"TAKAHASHI, Tomohiro" <t_tak...@mm.neweb.ne.jp>さんの
[Delphi:90553] Re: Delphi 環境とC++Builder環境
(Message ID: <487D57C8...@mm.neweb.ne.jp>)

> Param.hpp のクラスのメンバに
> public:
> int operator[](AnsiString Name) { return IValues[Name]; }
> という宣言があると思いますが、それがデフォルトパラメータとして機能するのでは
> ないでしょうか?

 これって BCB5 からあったんですね。

 使えますが、たとえばインスタンスが AParam とすると、

(*AParam)[Name]

とする必要があります。ポインタ参照より [] の方が強いからです。あ
まり見てくれは良くないので、どちらを使うかは好みですね。

 ちなみに、AnsiString が VCL なのにポインタではないのは例外です。


----------------------------------------------------------------
緑啓
ryo...@hi-ho.ne.jp

seizo

unread,
Jul 16, 2008, 9:27:52 AM7/16/08
to Del...@ml.users.gr.jp
松島@エリーさん、高橋智宏さん、緑啓さん、今晩は
コメントありがとう御座います。
槻 誠三(けやき せいぞう)です。

>上記の最後「9.その他」のように、C++Builder の言語規格にデフォルトプロ
>パティという概念が無いためです。

松島@エリーさん、良く分かりました。私の勉強不足でした。どうりでC++Builder
のコンポーネント関係のマニュアルに「ディフォルトプロパティ」という言葉が
見つからないはずです。

高橋智宏さん、緑啓さん、結果的に C++Builder 環境では「ディフォルトプロバティ」
という概念を忘れることと致しました。いろいろ有難う御座いました。

とくに高橋智宏さんのアドバイスをきっかけに9割方問題が解決致しました。
本当に有難う御座いました。

2008.07.16(Wed) 22:19
槻 誠三(けやき せいぞう)
seizo

seizo

unread,
Jul 21, 2008, 8:09:50 AM7/21/08
to Del...@ml.users.gr.jp
高橋智宏さん、松島@エリーさん、緑啓さん、
その節はいろいろとありがとう御座いました。
槻 誠三(けやき せいぞう)です。

おかげさまで本日、パラメータ保存用コンポーネントの修正版 TParameter v0.4
を Vector に UP 致しました。実際の公開は一週間後くらいだと思います

各配列プロパティの名前を以下の様に変更しました。
SValues[] ===> VStrings[] // 文字列型
BValues[] ===> VBools[] // 論理型
IValues[] ===> VIntegers[] // 整数型
YValues[] ===> VFontStyles[] // フォントスタイル型
FValues[] ===> VExtends[] // 浮動小数点型
これで、なんとか Delphi と C++Builder 両環境に対応出来たものと思います。
本当にありがとう御座いました。

2008.07.21(Mon) 21:03
槻 誠三(けやき せいぞう)
seizo


Reply all
Reply to author
Forward
0 new messages