第 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);
[正] 上記二行を削除する。
第 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.以降を次のように読み変えてください。
- メッセージ構造型の参照を引数として持たせます。
- マクロを使ってメソッドをメッセージにマップします。
- メッセージメソッドの実装にコンポーネント独自の処理コードを記述します。
- 継承メッセージハンドラが有る場合にはそれを呼び出します。
[誤]
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();