Delphi→C++Builderするには?

解決


吉田  2001-12-27 00:54:35  No: 392  IP: [192.*.*.*]

Delphiで、

//メッセージテンプレートの変換
                ReplaceText:=ReplaceText++ PageProducer2.Content;

とするところを、C++Builderで、

                ReplaceText=ReplaceText+PageProducer2->Content;

としたところ、
[C++エラー]:E2235メンバー関数は呼び出すかそのアドレスをとらなければならない。
というエラーメッセージが出ました。


Delphiで、

else if CompareText(TagString, 'address') = 0 then
    {POST先アドレスの挿入}
    ReplaceText := TPageProducer(Sender).Dispatcher.Request.ScriptName +TPageProducer(Sender).Dispatcher.Request.PathInfo
end;

とするところを、C++Builderで、
「      
else if(CompareText(TagString,"address")){
     //POST先アドレスの挿入
    ReplaceText=TPageProducer(Sender)->Dispacher->Request->ScriptName+TPageProducer(Sender)->Dispacher->Request->PathInfo;
  }

としたところ、
[C++エラー]:E2285'TPageProducer::TPageProducer(TObject *)'に一致するものが見当たらない。
[C++エラー]:E2459  Delphi形式のクラスは演算子newで構築しなければならない。
というエラーメッセージが出ました。

どなたかおわかりになられますか?

編集    削除
吉田  2001-12-27 00:58:03  No: 393  IP: [192.*.*.*]

すいません。説明が不足していました。
当方、C++BuilderでCGIのWebアプリを作ろうとしているのですが、Delphiの参考書しかなく、Delphi→C++Builderを試みておりますが、3点ほど不明な点がありました。
それらが、最初の書き込みの内容です。

編集    削除
にしの  2001-12-27 01:48:38  No: 394  IP: [192.*.*.*]

3点、とかかれていますが、2点までしか確認できません。エラーの数が3点ということでしょうか。

Delphi,C++Builder両方のヘルプがあるなら、見比べてみてください。
TPageProducerクラスには、Contentプロパティはありません。これは関数です。
C++の場合、引数なし関数の括弧を省略することはできません。

C++でのキャストは、型名(オブジェクト)ではなく、(型名)オブジェクト  です。
型名=クラス名ではありません。例えば
TPageProducer(Sender)は、(TPageProducer*)Sender
になります。さらにそのプロパティを参照する場合は、
((TPageProducer*)Sender)->Dispacher
になります(->演算子の優先度の関係で、括弧が必要です)。

編集    削除
にしの  2001-12-27 01:56:42  No: 395  IP: [192.*.*.*]

追記です。

else if CompareText(TagString, 'address') = 0 then
と、
else if(CompareText(TagString,"address")){
は全く逆の条件ですよ。

編集    削除
吉田  2001-12-27 02:17:23  No: 396  IP: [192.*.*.*]

にしのさんありがとうございます。

ご指摘の通り、
else if(CompareText(TagString,"address"))
ではなく、
else if(CompareText(TagString,"address")==0)
でなければならないですね。

先ほど書き忘れていましたもう一点は、下記のようなコーディングです。

Delphiで、

if DataSetPageProducer1.DataSet.Locate('CustNo',Request.QueryFields.Values['CustNo'],[])then
                Response.Content=DataSetPageProducer1.Content;
・・・
end;

とするところをC++Builderで、

if(DataSetPageProducer1->DataSet->Locate("CustNo",Request->QueryFields->Values["CustNo"],[]){
                Response->Content=DataSetPageProducer1->Content;
・・・
}

としたところ、
[C++エラー]:E2188式の構文エラー
というエラーメッセージが出ました。

編集    削除
吉田  2001-12-27 03:02:22  No: 397  IP: [192.*.*.*]

申し訳ありませんが、もう一点だけ教えて頂けないでしょうか?


TStringList型のインスタンスMessagesを用いて、
Delphiで、
Messages.Insert(0, FormatDateTime('yyyy/mm/dd',Date));
というコーディングを、
Messages->Insert(0,FormatDateTime("yyyy/mm/dd",Date));
としたところ、
[C++エラー]:E2034'TDateTime(__fastcall *)()'型は'TDateTime'型に変換できない
[C++エラー]:E2342パラメータ'DateTime'はTDateTime型として定義されているのでTDateTime(__fastcall *)()は渡せない
というエラーが出ました。

また、同様に日付関係ですが、

if TagString='Date' then
     ReplaceText:=DateToStr(Date)

を、

if(TagString=="Date"){
     ReplaceText=DateToStr(Date);

としたところ、
[C++エラー]:E2034'TDateTime(__fastcall *)()'型は'TDateTime'型に変換できない
[C++エラー]:E2342パラメータ'DateTime'はTDateTime型として定義されているのでTDateTime(__fastcall *)()は渡せない
というエラーが出ました。

たびたびすいませんが宜しくお願いいたします。

編集    削除
にしの  2001-12-27 05:37:39  No: 398  IP: [192.*.*.*]

うちの環境にC++Builderが今ないので、まちがっているかもしれませんが、Delphiから予想して書きます。

if(DataSetPageProducer1->DataSet->Locate("CustNo",Request->QueryFields->Values["CustNo"],[]){
Response->Content=DataSetPageProducer1->Content;
の、[]が間違いです。ここは、TLocateOptionsの変数を用意して、空のままで入れてやります。
# ここは、Delphiでいう集合型の空集合です。

Messages.Insert(0, FormatDateTime('yyyy/mm/dd',Date));
ここのDateは変数ではなく関数です。
前にも書きましたが、C++の場合は引数なしの関数の括弧を省略できません。
C++では、DateとDate()はまったく別の意味を持ちます。

エラーが出たとき、自前で用意した変数・関数でない場合は、ヘルプで調べて見てください。
それと、C++Builderをメインでするのなら、C++Builderの本を1冊用意しておくと便利です。
DelphiメインならDelphiの本、移植するのなら両方あるとよいです。

編集    削除
吉田  2001-12-27 07:03:57  No: 399  IP: [192.*.*.*]

にしのさんたびたびありがとうございます。
最初のですが、[]が間違っていそうなことはわかったのですが...
空の変数をTLocateOptions型で宣言するっていうことですか。
ヘルプで調べてみます。

編集    削除
吉田  2001-12-27 07:29:54  No: 400  IP: [192.*.*.*]

説明

C++Builderのヘルプで調べたところ、
「TLocateOptions 型は TTable, TQuery, TStoredProc の各コンポーネントの Locate メソッドの Options パラメータに指定できる値を定義します。
次の表に TLocateOptions 型の値の説明を示します。

値                                説明

loCaseInsensitive  キー設定項目とキー値は大文字と小文字の区別なしで一致する
loPartialKey  キー値にはキー設定項目値の一致部分だけ含むことができる。たとえば,HAM は HAMM にも HAMMER にも一致する

とあったので、
if(DataSetPageProducer1->DataSet->Locate("CustNo",Request->QueryFields->Values["CustNo"],[IoCaseInsensitive])
あるいは、
if(DataSetPageProducer1->DataSet->Locate("CustNo",Request->QueryFields->Values["CustNo"],IoCaseInsensitive)
とやってみたのですが、うまくいかないようです。

編集    削除
にしの  2001-12-27 07:53:14  No: 401  IP: [192.*.*.*]

集合型は、変数を介して指定してください。

編集    削除
吉田  2001-12-28 19:07:12  No: 402  IP: [192.*.*.*]

TLocateOptions a;
と変数を宣言して、
if(DataSetPageProducer1->DataSet->Locate("CustNo",Request-QueryFields->Values["CustNo"],a)
としたらエラーがなくなりました。
ありがとうございました。

Delphiでいう集合型の空集合は[]で記述されるそうですが、空集合でない[rfReplaceAll]
のような記述は、集合型の一種なんでしょうか?

編集    削除
にしの  2001-12-28 19:32:46  No: 403  IP: [192.*.*.*]

[rfReplaceAll]は、TReplaceFlags型の集合です。
型ではありませんが、集合です。

C++Builderだと、+演算子か、<<演算子あたりが追加だったと思います。

TReplaceFlags F;
F = F<<rfReplaceAll;

この当たりはヘルプで集合を調べてみてください。
今、Delphiの環境しかないので未確認です。

編集    削除
吉田  2001-12-28 21:06:30  No: 404  IP: [192.*.*.*]

ありがとうございます。
確認してみます。

編集    削除