ADOQuery1->SQL->Text = "SELECT * FROM T1, T2 WHERE T1.F1=:p AND T2.F1=:p";
ADOQuery1->Parameters->ParamValues["p"] = "01"; // 僅賦值一次
ADOQuery1->Open(); // 結果為空
BCB 內部機制:同名參數第二次引用時值為 NULL。
ADOQuery1->SQL->Text = "SELECT * FROM T1, T2 WHERE T1.F1=:p1 AND T2.F1=:p2";
ADOQuery1->Parameters->ParamValues["p1"] = "01";
ADOQuery1->Parameters->ParamValues["p2"] = "01"; // 即使值相同也需獨立參數
規則:SQL 中每個參數佔位符只能對應一次 ParamValues 賦值,重複出現需定義不同參數名。
goto EndMark;
int a = 1; // 初始化被跳過
// ...
EndMark:;
goto EndMark;
{ // 花括號構建作用域
int a = 1;
// ...
}
EndMark:;
C++ 標準禁止跳過帶初始化的變量定義。花括號將變量限制在內部作用域,goto 跳轉到作用域外,合法。但濫用 goto 損害可讀性,建議重構為結構化控制流。
new TForm2(Form1)),Form2_N 顯示模態對話框。動態創建窗口(new TForm2)在運行時分配內存並初始化;設計時創建的窗口(IDE 管理的全局變量 Form2)在程序啟動時已完成初始化。動態窗口的內存地址與設計時窗口不同,導致其他窗口持有的指針(如 Form3 中引用的 Form2)指向錯誤實例。
Form2 = new TForm2(Form1)),避免同類多實例混淆。Form3->SetTargetForm(Form2_N)),不依賴全局變量。Delphi 動態創建 Form1 := TForm1.Create(Self) 不存在此問題,因語言級別管理對象生命週期與引用更透明。C++Builder 需手動管理指針所有權。
goto,若必用請用作用域隔離初始化。