2015-07-20 74 views
-2

我想知道如何用C++ Builder编写下面的代码,用用Do Begin语句类似于Delphi。用C++ Builder做Do Begin语句

我试过with ComboBox->Text .... do ... try,它不工作。我试过只用do ComboBox->Text .... try,也没有工作。

if (ComboBox->Text.operator==(String("C++ Builder XE7"))) 
    { 
    try 
    { 

    // do something 

    if ((Form1->Memo1->Lines->Text).Pos("<") !=0) 
     { 

     // do something 

     } 
    } 
catch(Exception &ex) 
    { 
    ShowMessage(ex.ToString()); 
    } 


if (ComboBox->Text.operator==(String("C++ Builder XE8"))) 
    { 
    try 
    { 

    // do something 

    if ((Form1->Memo1->Lines->Text).Pos("<") !=0) 
     { 

     // do something 

     } 
    } 
catch(Exception &ex) 
    { 
    ShowMessage(ex.ToString()); 
    } 
+1

C++没有'with'语句。如果您在C++中寻求_exception safety_,您应该查看[RAII](https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization) – myaut

+1

@myaut:Delphi的'with'语句与异常处理无关。也许你正在考虑.NET的'using'语句? –

+0

这是C++吗?什么是所有这些对象?你为什么要调用'operator ==()'而不是'=='?读者在这里工作并不多,或者简单理解。 –

回答

1

在C++中没有等效于Delphi的with语句。在C++中最好的做法是使用指针/引用,例如:

TComboBox *cb = ComboBox; 
TStrings *lines = Form1->Memo1->Lines; 

if (cb->Text == "C++ Builder XE7") 
{ 
    try 
    { 
     // do something 

     if (lines->Text.Pos("<") != 0) 
     { 
      // do something 
     } 
    } 
    catch(const Exception &ex) 
    { 
     ShowMessage(const_cast<Exception&>(ex).ToString()); 
    } 
} 

if (cb->Text == "C++ Builder XE8") 
{ 
    try 
    { 
     // do something 

     if (lines->Text.Pos("<") != 0) 
     { 
      // do something 
     } 
    } 
    catch(const Exception &ex) 
    { 
     ShowMessage(const_cast<Exception&>(ex).ToString()); 
    } 
} 
+0

'@Remy:'所以我在使用'catch(const Exception&ex)'的时候出现了一些错误信息。这些错误是'E2522非const函数_fastcall异常:: toString()为const对象调用'和'E2285找不到'运算符UnicodeString :: =(TByteDynArray)'的匹配项。所以通过使用'catch(Exception&ex)'不会在我的C++ Builder XE8中导致任何错误。非常感谢,雷米。 –

+1

为了性能和安全性,您应该总是通过const引用来捕获异常对象。然而,如果你需要对它们调用一个'const'方法,比如'ToString()',那么你可以使用'const_cast'。我已经更新了我的答案以表明这一点。 –

+0

现在完全正常工作:-)。非常感谢,雷米。 :-) –