旧C++Builder FAQ - ドキュメント

Abstract: この FAQは、旧 www.borland.co.jpに掲載されていた記事を転載したものです。記事は掲載時点の情報をあるがままに掲載しており、新バージョンでのご利用においては、コンポーネントや APIの仕様変更等によりご利用いただけない場合がありますのでご留意ください。

    「データベースアプリケーション開発者ガイド」の正誤表

該当するバージョン:C++Builder 1

    「Borland C++Builder ユーザースガイド」の正誤表

第 2章 p.13

11~13 行目

[Properties]及び[Events] はそれぞれ [プロパティ]及び[イベント] です。

第 9章 p.160

[誤]

 Form1->ChangeColor;

[正]

 Form1->ChangeColor();

[誤]

 Edit1->Text = 'Frank Borland is here';

[正]

 Edit1->Text = "Frank Borland is here";

第 9章 p.162

[誤]

if (typeid(*Sender) == typeid(TEdit))
   DoSomething;
else
   DoSomethingElse;

[正]

if (dynamic_cast<TButton*>(Sender) != NULL)
   DoSomething();
else
   DoSomethingElse();

第 12章 p.259, 264

説明文の中に「ファイル(F)|新規作成(N)」を選択後、[Forms]タブを選択するという記述がありますが、正しくは[フォーム]タブです。

第 12章 p.269

編集ボックスをダブルクリックすると...とありますが、これは、p.265で配置した FilterTextを意味します。

第 12章 p.270

「DisplayCustomers のソースコードを保存する」とありますが、正しくは、DisplayCustomersFormのソースコードを DisplayCustomers.cppという名前で保存することを意味します。

第 12章 p.271

[誤] 3. DisplayCustomersフォームを選択し、[OK]ボタンを押します。

[正] 3. DisplayCustomersFormを選択し、[OK]ボタンを押します。

    「Borland C++Builderデータベースアプリケーション開発者ガイド」の正誤表

第 4章 p.34

[誤]

 TSession *IBSession
 {
    IBSession = Sessions->OpenSession("InterBaseSession");
    Database->SessionName = "InterBaseSession";
 }

[正]

 TSession* IBSession;
 TDatabase* MyDatabase = new TDatabase(this);
 IBSession = Sessions->OpenSession("InterBaseSession");
 MyDatabase->SessionName = "InterBaseSession";

第 4章 p.42

[誤]

 TempDatabase = new TDatabase(this);

[正]

 TempDatabase = new TDatabase(NULL);

[誤]

 TDatabase *MyDatabase[10];
 int MyDbCount;
 MyDbCount = 1;
    :
 MyDatabase[MyDbCount] = RunTimeDbCreate(String("MyDb" +
   IntToStr(MyDbCount)), "" );
 MyDbCount++;

[正]

 TDatabase *MyDatabase[10];
 int MyDbCount;
 MyDbCount = 0;
    :
 do {
   MyDatabase[MyDbCount] = RunTimeDbCreate(String("MyDb" +
     IntToStr(MyDbCount)), "" );
   MyDbCount++;
 } while( MyDbCount<10 );

第 4章 p.46

[誤]

 for (int i = 0; i < DataSetCount; i++)
 {
    if (typeid(DataSets[i]) == typeid(TTable))
        DataSets[i]->CachedUpdates = true;
 }

[正]

 void SetAllChechedUpdates( TDatabase* database )
 {
   for (int i = 0; i < database->DataSetCount; i++)
   {
     if( dynamic_cast<TTable*>(database->DataSets[i]) != NULL )
       database->DataSets[i]->CachedUpDate = true;
   }
 }

第 4章 p.51

7行目の下に次の行を挿入してください。

上記コードは、変数 UserNameが AnsiString型で定義され、ユーザ名として適当な値が収められていることを前提としています。

第 6章 p.75

[誤]

 CustTable.MoveBy(-2);

[正]

 CustTable->MoveBy(-2);

第 6章 p.81

[誤]

 CustTable->Filter = "State = California";
 CustTable->Filter = "PatientAge >= 18";

[正]

 CustTable->Filter = "[State] = 'California '";
 /* あるいは */
 // CustTable->Filter = "[PatientAge] >= 18";
 CustTable->Filtered = true;
 CustTable->Refresh();

第 6章 p.86

[誤]

 {
   Variant tmp(OPENARRAY(int, (0,1)), vtInteger);
   tmp << (int)("Sight Diver");
   tmp << (int)("P");
   VarArrayOf(&tmp,1);
 }

[正]

 {
   MySearchOptions << loCaseInsensitive;
   Variant values[] = {"Sight Diver","P"};
   LocateSuccess = CustTable->Locate("Company;City",
     Variant(values,ARRAYSIZE(values)-1), MySearchOptions);
 }

[誤]

 {
   Variant LookupResults;
   LookupResults = CustTable->Lookup("Company",
     "Professional Divers, Ltd.", "Company; Contact; Phone");
 }

[正]

 {
   Variant LookupResults;
   LookupResults = CustTable->Lookup("Company",
     "Professional Divers, Ltd.", "Company; Contact; Phone");
   RichEdit1->Lines->Add(LookupResults.GetElement(0));
   RichEdit1->Lines->Add(LookupResults.GetElement(1));
   RichEdit1->Lines->Add(LookupResults.GetElement(2));
 }

第 6章 p.87

[誤]

 {
   Variant tmp(OPENARRAY(int, (0, 1)), vtInteger);
   tmp << (int)("Sight Diver", 0);
   tmp << ("Christiansted", 1);
   Variant LookupResults;
   LookupResults = CustTable->Lookup("Company;City", tmp,
                     "Company;Addr1;Addr2;State;Zip");
 }

[正]

 {
   Variant Values[] = {"Sight Diver "," Christiansted "};
   Variant LookupResults;
   LookupResults = CustTable->Lookup("Company;City ",
     Variant(Values,ARRAYSIZE(Values) -1),
     "Company;Addr1;Addr2;State;Zip ");
   RichEdit1->Lines->Add(LookupResults.GetElement(0));
   RichEdit1->Lines->Add(LookupResults.GetElement(1));
   RichEdit1->Lines->Add(LookupResults.GetElement(2));
   RichEdit1->Lines->Add(LookupResults.GetElement(3));
   RichEdit1->Lines->Add(LookupResults.GetElement(4));
 }

第 6章 p.90

[誤]

 {
   TVarRec* Item1 = new TVarRec("Japan");
   TVarRec* Item2=new TVarRec("Japan");
   TVarRec* Item3=new TVarRec("Japan");
   CountryTable->InsertRecord((Item1, Item2, Item3), 3);
   delete Item1;
   delete Item2;
   delete Item3;
 }

[正]

 {
   TVarRec Items[] = {"Japan", "Tokyo", "Asia"};
   CountryTable->InsertRecord(Items, 2);
 }

[誤]

 {
   TLocateOptions tlo;
   tlo << loCaseInsensitive;
   if (CountryTable->Locate("Name", "Japan", tlo)) 
   {
     CountryTable->Edit();
     TVarRec *tvr1 = new TVarRec(344567);
     TvarRec *tvr2 = new TVarRec(164700000);
     CountryTable->SetFields((NULL, NULL, NULL, tvr1, tvr2), 5);
     CountryTable->Post();
     delete tvr1;
     delete tvr2;
   }
 }

[正]

 {
   TLocateOptions tlo;
   tlo << loCaseInsensitive;
   if (CountryTable->Locate("Name", "Japan", tlo))
   {
     CountryTable->Edit();
     TVarRec NewValues[] = {NULL, NULL, NULL, 344567, 164700000};
     CountryTable->SetFields(NewValues, 4);
     CountryTable->Post();
   }
 }

第 7章 p.99

[誤]

 if (CustSource->DataSet == "Customers" )
   CustSource->DataSet = "Orders";
 else
   CustSource->DataSet = "Costomers";

[正]

 if (CustSource->DataSet == Customers )
   CustSource->DataSet = Orders;
 else
   CustSource->DataSet = Customers;

第 7章 p.102

[誤]

 void __fastcall TForm1::StateChange(TObject *Sender)
 {
   char S[10];
   switch (CustTable->State)
   {
     case dsInactive: strcpy(S,"Inactive"); break;
     case dsBrowse: strcpy(S, "Browse"); break;
     case dsEdit: strcpy(S, "Edit"); break;
     case dsInsert: strcpy(S, "Insert"); break;
     case dsSetKey: strcpy(S, "SetKey"); break;
   }
 }

[正]

 void __fastcall TForm1::StateChange(TObject *Sender)
 {
   char S[10];
   switch(CustTable->State)
   {
     case dsInactive:strcpy(S,"Inactive"); break;
     case dsBrowse:strcpy(S,"Browse"); break;
     case dsEdit:strcpy(S,"Edit"); break;
     case dsInsert:strcpy(S,"Insert"); break;
     case dsSetKey:strcpy(S,"SetKey"); break;
   }
   Form1->Caption = S;
 }

[誤]

 void __fastcall TForm1::StateChange(TObject *Sender)
 {
   if (CustTable->State == dsBrowse)
      CustTableEditBtn->Enabled;
   if (CustTable->State == (dsInsert|dsEdit|dsSetKey))
      CustTableCancelBtn->Enabled;
   ...
 }

[正]

 void __fastcall TForm1::StateChange(TObject *Sender)
 {
   if (CustTable->State == dsBrowse)
      CustTableEditBtn->Enabled = true;
   if ((CustTable->State==dsInsert)||(CustTable->State==dsEdit)
      ||(CustTable->State==dsSetKey))
   {
     CustTableCancelBtn->Enabled = true;
   }
   ...
 }

第 9章 p.131

[誤]

 {
   TTable* Table1;
   Table1=new TTable(this);
   Table1->Active = false;
   Table1->DatabaseName = "d:";
   Table1->TableName = "Testtbl.db";
   Table1->TableType = ttParadox;
   Table1->FieldDefs->Clear();
   Table1->FieldDefs->Add("Field1", ftInteger, 0, false);
   Table1->FieldDefs->Add("Field2", ftInteger, 0, false);
   Table1->IndexDefs->Clear();
   TIndexOptions MyIndexOptions;
   MyIndexOptions << ixPrimary << ixUnique;
   Table1->IndexDefs->Add("Field1Index", "Field1", MyIndexOptions);
   Table1->CreateTable();
 }

[正]

 {
   TTable* Table1;
   Table1 = new TTable(NULL);
   Table1->DatabaseName = "d:";
   Table1->TableName = "Testtbl.db";
   Table1->TableType = ttParadox;
   Table1->FieldDefs->Clear();
   Table1->FieldDefs->Add("Field1", ftInteger, 0, false);
   Table1->FieldDefs->Add("Field2", ftInteger, 0, false);
   Table1->IndexDefs->Clear();
   TIndexOptions MyIndexOptions;
   MyIndexOptions << ixPrimary << ixUnique;
   Table1->IndexDefs->Add("", "Field1", MyIndexOptions);
   Table1->CreateTable();
 }

第 9章 p.136

[誤]

 Table1->FindKey(new TVarRec(Edit1->Text), vtPChar);

[正]

 Table1->FindKey(&TVarRec(Edit1->Text), 0);

第 9章 p.137

[誤]

 Table1->FindNearest(new TVarRec(Edit1->Text), vtPChar);

[正]

 Table1->FindNearest(&TVarRec(Edit1->Text), 0);

第 9章 p.141

[誤]

 if (EndVal->Text != "")
   Customers->SetRange(OPENARRAY(TVarRec, (StartVal->Text)),
     OPENARRAY(TVarRec, (EndVal->Text)));
 Customers->ApplyRange();

[正]

 if (EndVal->Text != "")
   Customers->SetRange(OPENARRAY(TVarRec, (StartVal->Text)),
     OPENARRAY(TVarRec, (EndVal->Text)));
 // Customers->ApplyRange(); // 不要

第 9章 p.149

[誤]

7.[ファイル(F)|ユニットの新規作成(U)]を選択してフォームがデータモジュールを使うことを指定します。
8.最初のグリッドコンポーネントの DataSourceプロパティを      「DataModule2.CustomerSource」に設定し、2番目のグリッドコンポーネントの Datasourceプロパティを「DatqaModule2.OrdersSource」に設定します。

[正]

7.[ファイル(F)|ユニットを使う(I)]を選択してフォームがデータモジュールを使うことを指定します。
8.最初のグリッドコンポーネントの DataSourceプロパティを「DataModule2->CustomerSource」に設定し、2番目のグリッドコンポーネントの Datasourceプロパティを「DatqaModule2->OrdersSource」に設定します。

第 13章 p.203

[誤]

 DBNavigatorAll->DataSource = CustomerCompany->DataSource
 Set<TNavigateBtn, 0, 9> btnShow;

[正]

 DBNavigatorAll->DataSource = CustomerCompany->DataSource
 Dbctrls::TButtonSet btnShow;

[誤]

 DBNavigatorAll->DataSource = OrderNum->DataSource
 Set<TNavigateBtn, 0, 9> btnShow;

[正]

 DBNavigatorAll->DataSource = OrderNum->DataSource
 Dbctrls::TButtonSet btnShow;

第 14章 p.209

10行目

[誤] 最後の手順として、実行時に Columns.Stateプロパティに csCustomizedを

[正] 最後の手順として、実行時に Columns->Stateプロパティに csCustomizedを

第 15章 p.230

[誤]

 void __fastcall UndeleteAll(TDataSet *DataSet)
 {
   DataSet->UpdateRecordTypes << rtDeleted;
   try {
     DataSet->First();
     while(!DataSet->Eof)
       DataSet->RevertRecord();
     catch(...)
       {DataSet->UpdateRecordTypes << rtDeleted;}
   DataSet->UpdateRecordTypes << rtModified,rtInserted,rtUnmodified;

[正]

 void __fastcall UndeleteAll(TDataSet *DataSet)
 {
   DataSet->UpdateRecordTypes = DataSet->UpdateRecordTypes << rtDeleted;
   try {
     DataSet->First();
     while(!DataSet->Eof) {
       DataSet->RevertRecord();
       DataSet->Next();
     }
   }
   catch(...) {}
   DataSet->UpdateRecordTypes =
     DataSet->UpdateRecordTypes <<
       rtModified << rtInserted << rtUnmodified;
 }

第 15章 p.231

下から 2行目

[誤] に示せると便利です。UpdateStatusプロパティにこの機能があります。

[正] に示せると便利です。UpdateStatusメソッドにこの機能があります。

第 15章 p.232

3行目

[誤] ます。次に示す例は OnCalcFieldsイベントハンドラで UpdateStatusプロパティを使って

[正] ます。次に示す例は OnCalcFieldsイベントハンドラで UpdateStatusメソッドを使って

[誤]

 void __fastcall TForm1::CalcFields(TDataSet *DataSet)
 {
   TStringField *Table1ModifiedRow = new TStringField(this);
   if (DataSet->UpdateStatus() != usUnmodified) 
     Table1ModifiedRow->Value = "*";
   else
     Table1ModifiedRow->Value = NULL;
 }

[正]

 void __fastcall TForm1::CalcFields(TDataSet *DataSet)
 {
   if (DataSet->UpdateStatus() != usUnmodified) 
     Table1StringCalcField->Value = "*";
   else
     Table1StringCalcField->Value = "";
 }
  • 計算項目 Table1StringCalcField が存在することが前提となっています。

17行目

[誤] 読み出し専用で実行時のみの論理型プロパティ TDataSet.UpdatesPengingは、

[正] 読み出し専用で実行時のみの論理型プロパティ TDataSet::UpdatesPengingは、

第 15章 p.234

[誤]

 {
   if (E->Errors[E->ErrorCount-1] == MyError)
     UpdateAction = uaSkip  // キー違反、このレコードをスキップする
   else
     UpdateAction = uaAbort // 原因不明、更新を中止する
 }

[正]

 {
   if (E->Errors[E->ErrorCount-1] == MyError)
     UpdateAction = uaSkip;  // キー違反、このレコードをスキップする
   else
     UpdateAction = uaAbort; // 原因不明、更新を中止する
 }

第 15章 p.236

[誤] い(サーバーでの制約による)給与項目に対する修正を行ないます。

     TIntegerField *EmpTabSalary = new TIntegerField( this );

[正] い(サーバーでの制約による)給与項目 EmpTabSalaryに対する修正を

行ないます。

     //TIntegerField *EmpTabSalary = new TIntegerField( this );
     // 上記を取り除きます。

第 15章 p.242

[誤]

 DataSet->UpdateObject->Apply(UpdateKind);

[正]

 ((TUpdateSQL*)DataSet->UpdateObject)->Apply(UpdateKind); 

第 15章 p.243

[誤] 次のコードは、テーブルコンポーネントを使って更新を実行します。

 void __fastcall TForm1::EmpAuditUpdateRecord(TDataSet *DataSet, 
   TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
 {
   TUpdateSQL *MyUpdateSQL = new TUpdateSQL(this);
   TStringField *EmpAuditSalary = new TStringField(this);
   TStringField *EmpAuditEmpNo = new TStringField(this);
   TVarRec *Field0 = new TVarRec(DataSet->Fields[0]->OldValue);
   TVarRec *Field1 = new TVarRec(DataSet->Fields[1]->NewValue);
   TLocateOptions MyLocateOptions;
   MyLocateOptions << loPartialKey;
   if (UpdateKind == ukInsert)
   {
     UpdateTable->AppendRecord((Field0, Fields1), 2);
   }
   else
     if (UpdateTable->Locate("KeyField", DataSet->Fields[0]->OldValue,
        MyLocateOptions))
     {
       switch (UpdateKind)
       {
         case ukModify:
           UpdateTable->Edit();
           UpdateTable->Fields[1]->Value = DataSet->Fields[1]->Value;
           UpdateTable->Post();
           break;
         case ukDelete:
           UpdateTable->Delete();
       }
     }
     UpdateAction = uaApplied;
   }
 }

[正] 次のコードは、テーブルコンポーネント UpdateTableを使って更新を実行します。

 void __fastcall TForm1::EmpAuditUpdateRecord(TDataSet *DataSet, 
   TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
 {
   TLocateOptions MyLocateOptions;
   MyLocateOptions << loPartialKey;
   if (UpdateKind == ukInsert)
   {
     TVarRec Field0(DataSet->Fields[0]->OldValue);
     TVarRec Field1(DataSet->Fields[1]->NewValue);
     TVarRec Flds[] = { Field0, Field1 };
     UpdateTable->AppendRecord( Flds, 1);
   }
   else
     if (UpdateTable->Locate("KeyField", DataSet->Fields[0]->OldValue,
        MyLocateOptions))
     {
       switch (UpdateKind)
       {
         case ukModify:
           UpdateTable->Edit();
           UpdateTable->Fields[1]->Value = DataSet->Fields[1]->Value;
           UpdateTable->Post();
           break;
         case ukDelete:
           UpdateTable->Delete();
       }
     }
     UpdateAction = uaApplied;
   }
 }

第 15章 p.245

[誤]

 TUpdateSQL *MyUpdateSQL = new TUpdateSQL(this);
 MyUpdateSQL->SQL(ukModify) = MyUpdateSQL -> ModifySQL;

[正]

 UpdateSQL1->SQL[ukModify] = UpdateSQL->ModifySQL;

[誤] 設定値にアクセスする必要があります。次のコードは、更新された行ごとにユニークな SQLプロパティ値を生成します。

 void __fastcall TForm1::EmpAuditUpdateRecord(TDataSet *DataSet,
   TUpdateKind UpdateKind, TUpdateAction &UpdateAction )
 {
   TUpdateSQL *MyUpdateSQL = new TUpdateSQL(this);
   TStringField *EmpAuditSalary = new TStringField(this);
   TStringField *EmpAuditEmpNo = new TStringField(this);
   switch(UpdateKind)
   {
     case ukModify:
       MyUpdateSQL->SQL[UpdateKind]->Text = 
         printf("upate emptab set Salary %d where EmpNo
           = %d", EmpAuditSalary->NewValue, EmpAuditEmpNo->OldValue );
       MyUpdateSQL->ExecSQL(Updatekind);
       break;
     case ukInsert:
       break;
     case ukDelete:
       break;
   }
   UpdateAction = uaApplied;
 }

[正] 設定値にアクセスする必要があります。次のコードは、更新された行ごとにユニーク(二つのフィールドコンポーネント EmpAuditSalary, EmpAuditEmpNoの NewValueと OldValueプロパティの値)な SQLプロパティ値を生成します。

 void __fastcall TForm1::EmpAuditUpdateRecord(TDataSet *DataSet,
   TUpdateKind UpdateKind, TUpdateAction &UpdateAction )
 {
   TUpdateSQL *UpdateSQL = (TUpdateSQL *)DataSet->UpdateObject;
   char buf[255];
   switch(UpdateKind)
   {
     case ukModify:
       UpdateSQL->SQL[UpdateKind]->Text = 
         sprintf(buf, "upate emptab set Salary %d where EmpNo = %d",
           EmpAuditSalary->NewValue, EmpAuditEmpNo->OldValue );
       UpdateSQL->ExecSQL(Updatekind);
       break;
     case ukInsert:
       // :
       break;
     case ukDelete:
       // :
       break;
   }
   UpdateAction = uaApplied;
 }

第 15 p.247

[誤]

 TStringField *EmpAuditSalary = new TStringField(this);
 TStringField *EmpAuditEmpNo = new TStringField(this);

[正] 上記二行を削除する。

    「Borland C++Builder コンポーネント開発者ガイド」の正誤表

第 2章 p.26

4行目

[誤] スの配列、コンポーネントクラスのサイズ _ 1、の 3つのパラメータを

[正] スの配列、コンポーネントクラスのサイズ - 1、の 3つのパラメータを

第 8章 p.92

[誤]

 void MyKeydownHandler( HWND hwnd. UINT nVirtKey, BOOL fDown, int ...

[正]

 void MyKeydownHandler( HWND hwnd, UINT nVirtKey, bool fDown, int ...

第 8章 p.95

[誤]

 void __fastcall WMPaint(TWMPaint* Message);

[正]

 void __fastcall WMPaint(TWMPaint& Message);

第 8章 p.96

[誤]

 void __fastcall TMyControl::WndProc(TMEssage* Message)
 {
   TWinControl->WndProc(Message);
 }

[正]

 void __fastcall TMyControl::WndProc(TMEssage& Message)
 {
   TWinControl::WndProc(Message);
 }

第 8章 p.99

リストの 4.以降を次のように読み変えてください。

  1. メッセージ構造型の参照を引数として持たせます。
  2. マクロを使ってメソッドをメッセージにマップします。
  3. メッセージメソッドの実装にコンポーネント独自の処理コードを記述します。
  4. 継承メッセージハンドラが有る場合にはそれを呼び出します。

[誤]

 void __fastcall CMChangeColor(TMessage* Message);

[正]

 void __fastcall CMChangeColor(TMessage& Message);

[誤]

 void __fastcall TMyControl::CMChangeColor(TMessage* Message)
 {
   Color = Message->LParam;
   TControl->CMChangeColor(Message);
 }

[正]

 void __fastcall TMyControl::CMChangeColor(TMessage* Message)
 {
   // 例えば Color プロパティがあれば LParam を利用して設定する
   Color = Message->LParam;
   // 継承元のメッセージハンドラがあれば呼び出す。
   //TControl::CMChangeColor(Message);
 }

第 9章 p.108

[誤]

 __property Align = {default=true};

[正]

 __property Align = {default=alBottom};

第 10章 p.116

[誤] 注意 コンポーネントウィザードを使って作成した場合は、既存のコンストラクタに color = clYellow を追加するだけですみます。

[正] 注意 コンポーネントウィザードを使って作成した場合は、既存のコンストラクタに Color = clYellow; を追加するだけで済みます。

第 12章 p.137

[誤]

 void __fastcall WMSize(TWMSize* Message);
 BEGIN_MESSAGE_MAP
 MESSAGE_HANDLER(WM_SIZE, MESSAGES::TWMSize, WMSize)

[正]

 void __fastcall WMSize(TWMSize& Message);
 BEGIN_MESSAGE_MAP
 MESSAGE_HANDLER(WM_SIZE, Messages::TWMSize, WMSize)

第 12章 p.138

[誤]

 void __fastcall TSampleCalendar::WMSize(TWMSize* Message)
 {
    int GridLines;
    Gridlines = 6 * GridLineWidth;
    DefaultColWidth = (Message->Width - GridLines) / 7;
    DefaultRowHeight = (Message->Height - GridLines) / 7;

[正]

 void __fastcall TSampleCalendar::WMSize(TWMSize& Message)
 {
    int GridLines;
    Gridlines = 6 * GridLineWidth;
    DefaultColWidth = (Message.Width - GridLines) / 7;
    DefaultRowHeight = (Message.Height - GridLines) / 7;

第 13章 p.168

[誤]

 void __fastcall CMExit(TWMNoParams* Message);

[正]

 void __fastcall CMExit(TWMNoParams& Message);

[誤]

 void __fastcall TDBCalendar::CMExit(TWMNoParams* Message)

[正]

 void __fastcall TDBCalendar::CMExit(TWMNoParams& Message)

第 14章 p.171

32行目

[誤] コンポーネントウィザードを使ってコンポーネントを作成する場合は、TAboutDlgにはすでにコンストラクタが追加されています。

[正] コンポーネントウィザードを使ってコンポーネントを作成する場合は、TAboutBoxDlgにはすでにコンストラクタが追加されています。

第 14章 p.174

[誤]

 DailogBox->Free;

[正]

 DailogBox->Free();

    「Borland C++Builderライブラリリファレンス」の正誤表

第 2章 p.7-8

スタティックランタイムライブラリに関しては次の表を参考にしてください。(これらの .LIBは C++Builderの LIBサブディレクトリにあります)

ファイル名

用途

BCBMM.LIB

String型および String型を含む構造体を戻り値や引数として使用する関数をエクスポートする .DLL及びその .DLLを使用するアプリケーションでリンクするライブラリ

C0D32.OBJ

32ビット .DLL用スタートアップモジュール

C0D32W.OBJ

32ビット .DLL用スタートアップモジュール(UNICODE 対応)

C0W32.OBJ

Win32アプリケーション用スタートアップモジュール

C0W32W.OBJ

Win32アプリケーション用スタートアップモジュール(UNICODE 対応)

C0X32.OBJ

32ビットコンソールアプリケーション用スタートアップモジュール

C0X32W.OBJ

32 ビットコンソールアプリケーション用スタートアップモジュール(UNICODE 対応)

CP32MT.LIB

VCLと Delphi例外処理のサポートを含む 32ビット GUIマルチスレッドライブラリ

CP32MTI.LIB

VCLと Delphi例外処理のサポートを含む 32ビット GUIマルチスレッドダイナミックリンクライブラリのインポートライブラリ

CW32MT.LIB

32ビットマルチスレッド用ランタイムライブラリ

FILEINFO.OBJ

オープンしているファイルハンドル情報を子プロセスに渡す

FILES.C

ファイルハンドル数を増加

FILES2.C

ファイルハンドル数を増加

GP.OBJ

例外発生時にレジスタダンプ情報を出力

IMPORT32.LIB

32ビットインポートライブラリ(Winsock 1.xを含む)

INET.LIB

インターネット API(URLMON, WININET, HLINK, MSCONF, WEBPOST)用インポートライブラリ

MATHERR.C

float及び double型のユーザー定義浮動小数点演算の例外処理の例

MATHERRL.C

long double型のユーザー定義浮動小数点演算の例外処理の例

MPR.LIB

MPR.DLL用インポートライブラリ

MSEXTRA.LIB

NTと Win95でモジュール名が異なる API用のインポートライブラリ

MSWSOCK.LIB

MSWSOCK.DLL用のインポートライブラリ

OC30.LIB

OC30.DLL用インポートライブラリ

OLE2W32.LIB

32ビット OLE 2.0 API用インポートライブラリ

OPENGL32.LIB

OPENGL32.DLL用インポートライブラリ

PRELOAD.CPP

プリコンパイルヘッダを構築するために使用するソースファイル

RPCEXTRA.LIB

NTと Win95でモジュール名が異なる RPC API用のインポートライブラリ

TH32.LIB

Win95下での 32ビット ToolHelp API用インポートライブラリ

USER32.LIB

USER32.DLL用インポートライブラリ

VCL.LIB

ビジュアルコンポーネントライブラリ

VCLD.LIB

ビジュアルコンポーネントライブラリ(デバッグバージョン)

WILDARGS.OBJ

コンソールモードアプリケーションにおいて、ワイルドカード引数を main() への引数配列に変換

WWLDARGS.OBJ

コンソールモードアプリケーションにおいて、ワイルドカード引数をmain()への引数配列に変換(UNICODE 対応)

WS2_32.LIB

32ビット WinSock 2.0 API用インポートライブラリ

ダイナミックライブラリに関しては次の表を参考にしてください。(これらの .DLLは C++Builderの BINサブディレクトリにあります)

ファイル名

用途

BCBMM.DLL

String型および String型を含む構造体を戻り値や引数として使用する関数をエクスポートする .DLL及びその .DLLを使用するアプリケーションでリンクするライブラリ BCBMM.LIBのダイナミックリンクライブラリ

CP3230MT.DLL

Delphi例外処理と VCLをサポートする CP32MTI.LIBのダイナミックリンクライブラリ

第 3章 p.190

_status87 関数の表で Win32 にチェックが付いていませんが、Win32 でもご利用頂けます。

第 3章 p.203-204

strcmpi, wcsncmpi 関数の表で Win32 にチェックが付いていませんが、Win32 でもご利用頂けます。

    SYSUTILS.HPPに定義された Delphi 2.0の VCLにはない関数のリファレンス

該当するバージョン:C++Builder 1

=====================================================================
SYSUTILS.HPP に定義された Delphi 2.0 の VCL にはない関数のリファレンスです。
=====================================================================
AnsiStrComp
-----------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall AnsiStrComp(char * S1, char * S2);
解説
    
=====================================================================
AnsiStrIComp
------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall AnsiStrIComp(char * S1, char * S2);
解説
    
=====================================================================
AnsiStrLComp
------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall AnsiStrLComp(char * S1, char * S2, Cardinal MaxLen);
解説
    
=====================================================================
AnsiStrLIComp
-------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall AnsiStrLIComp(char * S1, char * S2, Cardinal MaxLen);
解説
    
=====================================================================
AnsiStrLower
------------
構文
    #include <vcl\sysutils.hpp>
    char * __fastcall AnsiStrLower(char * Str);
解説
    
=====================================================================
AnsiStrUpper
------------
構文
    #include <vcl\sysutils.hpp>
    char * __fastcall AnsiStrUpper(char * Str);
解説
    
=====================================================================
AnsiQuotedStr
-------------
構文
    #include <vcl\sysutils.hpp>
    System::AnsiString __fastcall AnsiQuotedStr(const System::AnsiString S, char Quote);
解説
    
=====================================================================
AnsiExtractQuotedStr
--------------------
構文
    #include <vcl\sysutils.hpp>
    System::AnsiString __fastcall AnsiExtractQuotedStr(char * &Src, char Quote);
解説
    
=====================================================================
AnsiStrLastChar
---------------
構文
    #include <vcl\sysutils.hpp>
    char * __fastcall AnsiStrLastChar(char * P);
解説
    指定した文字列の最後の文字のアドレスを取得します。
戻り値
    AnsiStrLastChar は最後の文字のアドレスを返します。
=====================================================================
AnsiLastChar
------------
構文
    #include <vcl\sysutils.hpp>
    char * __fastcall AnsiLastChar(const System::AnsiString S);
解説
    指定した文字列の最後の文字のアドレスを取得します。
戻り値
    AnsiLastChar は最後の文字のアドレスを返します。
=====================================================================
LastDelimiter
-------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall LastDelimiter(const System::AnsiString Delimiters,
                                 const System::AnsiString S);
解説
    指定した文字列中に最後に表れるデリミタの位置を取得します。
戻り値
    LastDelemiter は最後に表れるデリミタの位置を文字列の先頭からのバイト数で
    返します。
=====================================================================
ByteType
--------
構文
    #include <vcl\sysutils.hpp>
    TMbcsByteType __fastcall ByteType(const System::AnsiString S, int Index);
解説
    指定した文字列とそのインデックスに位置する文字が,一バイト文字なのか,
    二バイト文字の初めのバイトなのか,二バイト目なのかを判定します。Index には
    判定したい文字の文字列中の位置を指定します。文字の先頭を表す Index 値は 0
    です。ByteType は長さのチェックを行ないません。 Index で指定する値は S で
    指定した文字列の長さより小さくなければなりません。
戻り値
    ByteType は二バイト文字をサポートするシステムでない場合には mbSingleByte が
    恒に返されます。指定した文字が完全な一バイト文字であれば mbSingleByte が,
    二バイト文字の初めのバイトであれば mbLeadByte が二バイト目であれば
    mbTrailByte を返します。
=====================================================================
StrByteType
-----------
構文
    #include <vcl\sysutils.hpp>
    TMbcsByteType __fastcall StrByteType(char *Str, Cardinal Index);
解説
    指定した文字列とそのインデックスに位置する文字が,一バイト文字なのか,
    二バイト文字の初めのバイトなのか,二バイト目なのかを判定します。Index には
    判定したい文字の文字列中の位置を指定します。文字の先頭を表す Index 値は 0
    です。StrByteType は長さのチェックを行ないません。 Index で指定する値は S
    で指定した文字列の長さより小さくなければなりません。
戻り値
    StrByteTypeは二バイト文字をサポートするシステムでない場合には mbSingleByte
    が恒に返されます。指定した文字が完全な一バイト文字であれば mbSingleByte が
    二バイト文字の初めのバイトであれば mbLeadByte が二バイト目であれば
    mbTrailByte を返します。
=====================================================================
ByteToCharLen
-------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall ByteToCharLen(const System::AnsiString S, int MaxLen);
解説
    指定した文字列の
=====================================================================
ByteToCharIndex
---------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall ByteToCharIndex(const System::AnsiString S, int Index);
解説
=====================================================================
CharToByteIndex
---------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall CharToByteIndex(const System::AnsiString S, int Index);
解説
=====================================================================
CharToByteLen
-------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall CharToByteLen(const System::AnsiString S, int MaxLen);
解説
=====================================================================
IsPathDelimiter
---------------
構文
    #include <vcl\sysutils.hpp>
    bool __fastcall IsPathDelimiter(const System::AnsiString S, int Index);
解説
=====================================================================
IsDelimiter
-----------
構文
    #include <vcl\sysutils.hpp>
    bool __fastcall IsDelimiter(const System::AnsiString Delimiters, const System::AnsiString S, int Index);
解説
=====================================================================
AnsiPos
-------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall AnsiPos(const System::AnsiString Substr, const System::AnsiString S);
解説
=====================================================================
AnsiCompareFileName
-------------------
構文
    #include <vcl\sysutils.hpp>
    int __fastcall AnsiCompareFileName(const System::AnsiString S1, const System::AnsiString S2);
解説
=====================================================================
AnsiLowerCaseFileName
---------------------
構文
    #include <vcl\sysutils.hpp>
    System::AnsiString __fastcall AnsiLowerCaseFileName(const System::AnsiString S);
解説
=====================================================================
AnsiUpperCaseFileName
---------------------
構文
    #include <vcl\sysutils.hpp>
    System::AnsiString __fastcall AnsiUpperCaseFileName(const System::AnsiString S);
解説
=====================================================================
AnsiStrPos
----------
構文
    #include <vcl\sysutils.hpp>
    char * __fastcall AnsiStrPos(char *Str, char *SubStr);
解説
=====================================================================
AnsiStrRScan
------------
構文
    #include <vcl\sysutils.hpp>
    char * __fastcall AnsiStrRScan(char *Str, char Chr);
解説
=====================================================================
AnsiStrScan
-----------
構文
    #include <vcl\sysutils.hpp>
    char * __fastcall AnsiStrScan(char *Str, char Chr);
解説
=====================================================================

    Imageコンポーネント

C++Builderの Imageコンポーネントは一種のプレースホルダコンポーネントです。

このコンポーネントを使うと、フォーム上でビットマップやメタファイルなどの画像オブジェクトを含める領域を指定できます。イメージのサイズは手動で設定するか Imageコンポーネントが実行時に画像のサイズに合わせて調整するよう設定できます。

Imageコンポーネントは常に表示しておく必要のないビットマップを保持したりアプリケーションが他の画像を生成するために必要とするビットマップを保持するためにも使えます。

    初期画像の設定

Imageコンポーネントが常に特定の画像を保持する場合、設計時に Pictureプロパティを設定できます。実行時にファイルからコンポーネントに画像をロードすることもできます。

また、グラフィックアプリケーションなどでは、Imageコンポーネントを使ってユーザーが描画可能な領域を提供することもできます。描画用の空白のビットマップを用意するには実行時にそのビットマップを作成します。

    設計時にイメージを読み込むには

  1. グラフィック互換コンポーネントをフォームに追加します。
  2. コンポーネントのサイズを自動的にグラフィックに合わせるには、グラフィックを読み込む前にコンポーネントの AutoSizeプロパティを trueに設定します。
  3. オブジェクトインスペクタで画像エディタを使うプロパティを選択します。
  4. Pictureの値列をダブルクリックするか省略記号[...]ボタンをクリックすると画像エディタが開きます。(フォーム内で Imageコンポーネントをダブルクリックしても画像エディタが開きます。)
  5. [読み込み(L)]ボタンを選択して[画像読み込み]ダイアログボックスを開きます。
  6. [画像読み込み]ダイアログボックスを使って表示したいイメージを選択し[OK]を選択します。選択したイメージが画像エディタの中に表示されます。
  7. [OK]を選択すると選択したイメージが受け入れられ[画像エディタ]ダイアログボックスが閉じます。フォーム上のコンポーネントの中にイメージが表示されます。

メモ:

グラフィックを Imageコンポーネントの中へ読み込むときImageコンポーネントの Stretchプロパティを trueに設定するとグラフィックがコンポーネントに合うよう自動的にサイズ変更されます(Stretchは、サイズに影響を及ぼしません)。

    実行時の描画用の領域の提供

Imageコンポーネントを使って空白のビットマップを配置することにより実行時にユーザーが描画するための領域を提供できます。

  1. Imageコンポーネントを含むフォームの OnCreateイベントにハンドラをアタッチします。
  2. ビットマップオブジェクトを作成します。
  3. Imageコンポーネントの Picture->Graphicプロパティにビットマップオブジェクトを割り当てます。

ビットマップを画像の Graphicプロパティに割り当てることによってビットマップのオーナーシップが画像オブジェクトに与えられます。

画像オブジェクトが廃棄されるときにビットマップが自動的に廃棄されるのでビットマップオブジェクトを廃棄するコードを指定する必要はありません。

画像には別のビットマップを割り当てることもでき、その時点で古いビットマップは廃棄され、新しいビットマップが制御の対象になります。

次に示すコードは Form1の OnCreateイベントにアタッチされるコードで幅 200ピクセル×高さ 200ピクセルの空白のビットマップを作成しフォームのイメージコンポーネント内に配置します。

//-----------------------------------------------------------------
class TForm1 : public TForm
{
  __published:        // IDE管理のコンポーネント
    TImage *Image1;
    void __fastcall FormCreate(TObject *Sender);
  private:            // ユーザー宣言
  public:             // ユーザー宣言
    __fastcall TForm1(TComponent* Owner);
};
//-----------------------------------------------------------------

//-----------------------------------------------------------------
void __fastcall TForm1::FormCreate( TObject *Sender );
{
  Graphic::TBitmap *Bitmap1;        //ビットマップを保存するための一時変数
  
  Bitmap1 = new Graphic::TBitmap;   //ビットマップオブジェクトを作成します
  Bitmap1->Width = 200;             //幅の初期値を指定します
  Bitmap1->Height = 200;            //高さの初期値を指定します
  
  //ビットマップをイメージコンポーネントに割り当てます
  Image1->Picture->Graphic = Bitmap1;
}

    グラフィックの出力

C++Builderアプリケーションからグラフィックイメージを出力するのは簡単な作業です。

出力に必要な指定は、プリンタを呼び出すフォームの uses節に Printersユニットを追加するだけです。

Printersユニットは Printerと呼ばれるプリンタオブジェクトを宣言します。

このオブジェクトは印刷されたページを表すキャンバスを持ちます。

プリンタのキャンバスにイメージをコピーする

プリンタのキャンバスは他のキャンバスと同じように使えます。

特にこれはビットマップなどのグラフィックオブジェクトの内容をプリンタに直接コピーできることを意味します。

//-----------------------------------------------------------------
class TForm1 : public TForm
{
  __published:  // IDE管理のコンポーネント
    TButton *PrintButton;
    TImage  *Image1;
    void __fastcall PrintButtonClick(TObject *Sender);
  private:      // ユーザー宣言
  public:       // ユーザー宣言
    __fastcall TForm1(TComponent* Owner);
};
//-----------------------------------------------------------------

//-----------------------------------------------------------------
void __fastcall TForm1::PrintButtonClick(TObject *Sender);
{
  // vcl\printers.hppを必ずインクルード
  Printer()->BeginDoc();  //印刷を開始します
  
  //印刷ページの左上隅に Image を描画します
  Printer()->Canvas->Draw( 0, 0, Image1->Picture->Graphic ); 
  Printer()->EndDoc();    //印刷を終了します
}
//-----------------------------------------------------------------

デバイスに依存しない印刷処理

//-----------------------------------------------------------------
void __fastcall TForm1::PrintBitmap( Graphics::TBitmap *Bitmap, int X, int Y )
{
  int infoSize, imageSize;
  ::GetDIBSizes( Bitmap->Handle, infoSize, imageSize );
  TBitmapInfo *info = (TBitmapInfo *)new Byte[infoSize];
  void *img = new Byte[imageSize];
  try {
    GetDIB( Bitmap->Handle, Bitmap->Palette, info, img );
    StretchDIBits( Printer()->Canvas->Handle,
      0, 0, X, Y,
      0, 0, info->bmiHeader.biWidth, info->bmiHeader.biHeight,
      img, info, DIB_RGB_COLORS, SRCCOPY );
  }
  catch( ... ) {
  }
  delete img;
  delete info;
}
//-----------------------------------------------------------------
#define STRETCHPRINT
void __fastcall TForm1::Print1Click(TObject *Sender)
{
    Printer()->BeginDoc();
#ifdef STRETCHPRINT
    PrintBitmap( Image->Picture->Bitmap, 800, 600 );
#else
    try {
      Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
      Bitmap->Assign( Image->Picture->Graphic );
      Bitmap->Monochrome = true;
      Printer()->Canvas->Draw( 0, 0, Bitmap );
    } catch( ... ) {}
    delete Bitmap;
#endif
    Printer()->EndDoc();
}
//-----------------------------------------------------------------

    ファイルへの画像の保存

画像を作成または変更した後、画像を後で使うために保存したい場合があります。

C++Builderの Pictureオブジェクトはグラフィックを複数の形式で保存できアプリケーション開発者は独自のグラフィックファイル形式を作成してそれらの形式も保存されるように登録できます。

Imageコンポーネントの Pictureオブジェクトの SaveToFileメソッドを呼び出す

SaveToFileメソッドは保存するファイルの名前を必要とします。

新しく作成する画像にファイル名が指定されていなかったり、ユーザーが既存の画像を別のファイルに保存する場合があります。

どちらの場合も、アプリケーションが保存を実行する前にコード例で示すようにユーザーからファイル名を取得する必要があります。

//-----------------------------------------------------------------
class TForm1 : public TForm
{
  __published:  // IDE管理のコンポーネント
    TButton *SaveButton;
    TButton *SaveAsButton;
    TImage *Image1;
    TSaveDialog *SaveDialog1;
    void __fastcall SaveButtonClick(TObject *Sender);
    void __fastcall SaveAsButtonClick(TObject *Sender);
  private:      // ユーザー宣言
  public:       // ユーザー宣言
    __fastcall TForm1(TComponent* Owner);
    String CurrentFile;
};
//-----------------------------------------------------------------

//-----------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
{
  CurrentFile = "";
}
//-----------------------------------------------------------------
void __fastcall  TForm1::SaveButtonClick(TObject *Sender);
{
  if( CurrentFile != "" )
  {
    //名前が指定済みの場合は保存します
    Image1->Picture->SaveToFile(CurrentFile);
  }
  else
  {
    //名前が指定されていない場合は名前を取得します
    SaveAszButtonClick(Sender);
  }
}
//-----------------------------------------------------------------
void __fastcall TForm1::SaveAsButtonClick( TObject *Sender );
{
  if( SaveDialog1->Execute() )  //ファイル名を取得します
  {
    //ユーザーが指定した名前を保存します
    CurrentFile = SaveDialog1->FileName;
    SaveButtonClick(Sender);  //その後通常と同様に保存します
  }
}
//-----------------------------------------------------------------

    クリップボードでのグラフィックの使い方

Windowsのクリップボードを使ってアプリケーションにグラフィックをコピーしたり貼り付けたり、他のアプリケーションとグラフィックを交換したりできます。

Delphi のクリップボードオブジェクトを使うとグラフィックを含めた異なる種類の情報を簡単に扱えます。

クリップボードへコピー

//----------------------------------------------------------------
class TForm1 : public TForm
{
  __published:  //IDE 管理のコンポーネント
    TButton *CopyButton;
    TImage *Image1;
    void __fastcall CopyButtonClick( TObject *Sender );
  private:      // ユーザー宣言
  public:       // ユーザー宣言
    __fastcall TForm1( TComponent* Owner );
};
//----------------------------------------------------------------

//----------------------------------------------------------------
//vcl\clipbrd.hppを必ずインクルード
void __fastcall TForm1::CopyButtonClick( TObject *Sender );
{
  Clipboard()->Assign( Image->Picture );
}
//-----------------------------------------------------------------

    フォームコンポーネント

フォームコンポーネントは C++Builderアプリケーションの中心的な存在です。

アプリケーションはフォームコンポーネントに他のコンポーネントを配置して設計します。

フォームはウィンドウ、ダイアログボックス、または単にデータ入力フォームなどのフォームとして使えます。

ユーザーアプリケーションで、現在アクティブではないフォームを表示するには Show または ShowModalメソッドを呼び出します。

//次のコードは現在のフォームを隠して別のフォームを表示します。
void __fastcall TForm1::Button1Click( TObject *Sender )
{
  Hide();                           //Form1 を隠す
  if( Form2->ShowModal() == mrYes ) //Form2 を表示する
  {
    //Yes で閉じたときの処理を記述
               :
  }
}

フォームを閉じるには、Close、または CloseQueryを呼び出すか ShowModalメソッドで ModalResultプロパティを使います。

//-----------------------------------------------------------------
//ShowModal で表示されたフォームをとじます。
void __fastcall TForm2::CloseButtonClick( TObject *Sender )
{
  ModalResult = mrYes;
}

//Form2 の OnCloseQuery イベントです。
//以下の処理を実装することによりフォームを閉じるときに
//確認を促すことができます。
void __fastcall TForm1::FormCloseQuery( TObject *Sender, bool &CanClose )
{
  TMsgDlgButtons  mdbtn;
  char *str = "フォームを閉じますか?";
  int ButtonSelected;

  mdbtn << mbNo << mbYes;
  ButtonSelected  = MessageDlg(str , mtInformation, mdbtn, 0);
  if( ButtonSelected == mrYes )
    CanClose = true;
  else
    CanClose = false;
}

フォームの水平、垂直スクロールバーの動作を決めるには、フォームのプロパティである HorzScrollBarと VertScrollBarオブジェクトのプロパティを設定します。

void __fastcall TForm1::FormCreate( TObject *Sender )
{
  ClientWidth = 300;

  //スクロールバー両端の小さな矢印をクリックしたとき表示がどれだけ移動するかを指定
  HorzScrollBar->Increment = 4;

  //スクロールバー上のスクロールボックスの位置
  HorzScrollBar->Position = 0;

  //Range はフォームのクライアント幅より大きくなくてはなりません
  HorzScrollBar->Range = ClientWidth + 100;

  //表示の有無
  HorzScrollBar->Visible = True;
}

フォームが最初にどのように表示されるか(最大表示、アイコン表示、通常表示)を指定するには WindowStateプロパティを使います。

void __fastcall TForm1::Button1Click( TObject *Sender )
{
  WindowState = wsMinimized;
}

フォームの外観をカスタマイズし、ユーザーがフォームとどのように対話するかを決めるには BorderStyleと BorderIconsプロパティを設定します。

フォームを最小化したときに表示するアイコンを決めるには Iconプロパティを使います。

void __fastcall TForm1::Button1Click( TObject *Sender )
{
  //最大化ボタンと最小化ボタンを削除します。
  BorderIcons = ( TBorderIcons() = BorderIcons ) >> biMinimize >> biMaximize;
}

フォーム上のどのコントロールがアクティブかを調べるには ActiveControlプロパティを使います。

void __fastcall TForm1::Button1Click( TObject *Sender )
{
  //Button1 が右側に移動する
  ActiveControl->Left = ActiveControl->Left + 1;
}

フォーム上の特定のコントロールが必ず表示されるようにするには ScrollInViewメソッドを使います。

void __fastcall TForm1::Button1Click( TObject *Sender )
{
   ScrollInView( Button2 );
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button2Click( TObject *Sender )
{
   ScrollInView( Button1 );
}

フォームには、マルチドキュメントインターフェース(MDI)アプリケーションの作成を簡単にするプロパティやメソッドが数多くあります。どのフォームがユーザーアプリケーションの親フォームでどれが子フォームかは FormStyleプロパティで指定します。1つのフォームを親として、残りを子として指定したら、子フォームは MDIChildrenプロパティでアクセスできます。ユーザーアプリケーションで開いている子フォームの数は、MDIChildCountプロパティの値です。どのフォームがアクティブな子フォームであるかを判定するには ActiveMDIChildプロパティを使います。

void __fastcall TForm1::Button1Click( TObject *Sender )
{
  TForm *BlueForm = new TForm(this);

  //BlueForm を作成してフォーカスのある MDI フォームの色を
  //Blue に変更します。
  BlueForm->FormStyle = fsMDIChild;
  Form1->ActiveMDIChild->Color = clBlue;
}

ほとんどの MDIアプリケーションにはメニューの最後に開いている子フォームやウィンドウを一覧表示するウィンドウメニューがあります。ユーザーアプリケーションのメインメニューでウィンドウメニューにする項目を WindowMenuプロパティで指定すると実行時に開いている子フォームが指定のメニューの最後に自動的に一覧表示されます。

通常、ウィンドウメニューには実行中のアプリケーションでウィンドウやフォームを扱うためのコマンドがあります。

メニューコマンドを使うには、この機能を簡単に実現する Cascade, Tile, Previous, Next, ArrangeIconsの各メソッドを OnClickイベントハンドラで呼び出します。

void __fastcall TForm1::FormCreate( TObject *Sender )
{
  //Form のプロパティの WindowMenu にメニューを指定すると
  //指定されたメニューの下にアクティブな MDI フォーム名が表示されます。
  WindowMenu = Window1;
}

フォームがアプリケーションの実行のさまざまな時点で別のメニューを表示するようにするには、使いたいメニューを Menuプロパティで指定します。

主なイベントをフォーム上の選択されたコントロールに渡すのではなくユーザーアプリケーションで処理するには、フォームの KeyPreviewプロパティを trueに設定します。

// A又は aキーが押されるとフォームの色が水色に変わり
// キーを戻すと元の色になります。
class TForm1 : public TForm
{
  __published:  // IDE 管理のコンポーネント
    TButton *Button1;

    void __fastcall FormKeyDown( TObject *Sender, WORD &Key, TShiftState Shift );
    void __fastcall FormKeyUp( TObject *Sender, WORD &Key, TShiftState Shift );
    void __fastcall FormCreate( TObject *Sender );
  private:      // ユーザー宣言
    TColor  FormColor;
  public:       // ユーザー宣言
    __fastcall TForm1( TComponent* Owner );
};
//-----------------------------------------------------------------
void __fastcall TForm1::FormCreate( TObject *Sender )
{
  KeyPreview = true;
}
//-----------------------------------------------------------------
void __fastcall TForm1::FormKeyDown( TObject *Sender, WORD &Key,
                                     TShiftState Shift)
{
  if( Key == 0x41 )
  {
    FormColor = Color;
    Color = clAqua;
  }
}
//-----------------------------------------------------------------
void __fastcall TForm1::FormKeyUp( TObject *Sender, WORD &Key, TShiftState Shift )
{
  if( Key == 0x41 )
    Color = FormColor;
}

プロパティの初期値を設定し、ユーザーがフォームと対話を始める前の処理を実行するには、フォームの OnCreateイベントハンドラを使います。

以上のプロパティ、メソッド、イベントのほかに、TFormコンポーネントではすべてのウィンドウコントロールに適用されるプロパティ、メソッド、イベントも使えます。

    STLのオンラインヘルプが見つかりません(1998/09/04)

該当するバージョン:C++Builder 3

Q:

STL(標準 C++ ライブラリ)のオンラインヘルプが見つかりません。

A:

STL(標準 C++ ライブラリ)のヘルプは ".DOC"ファイルになります。("C++Builder3インストール先\HELP\*.DOC")

なお、古い仕様に対するSTLヘルプファイルは"CD-ROM\Extras\Stlhlp"にあります。