【问题标题】:How to check if a component is TEdit type in c++builder?如何在 c++builder 中检查组件是否为 TEdit 类型?
【发布时间】:2012-12-21 08:55:31
【问题描述】:

如何检查表单的所有组件并验证组件的类型是否为TEdit

【问题讨论】:

    标签: c++builder vcl


    【解决方案1】:

    您可以使用dynamic_cast operator

    【讨论】:

      【解决方案2】:

      如果我错了,请见谅,但 embarcadero 不会自动将所有表单组件对象指针添加到类定义(在头文件中)..

      如:

      class TFormSomeForm : public TForm
      {
      __published:
          TEdit *SomeEditBox;
          TEdit *AnotherEditBox;
      ...
      }
      

      意味着您可以从标题中分辨出哪些组件属于 TEdit 类型。
      或者您可以单击设计视图中的组件,对象检查器将显示类型。

      【讨论】:

      • 在很多情况下,有人可能需要动态迭代表单或其他容器的控件,或者检查分配给多个组件的公共事件处理程序的 Sender 类型等. 所以能够在运行时动态确定组件的类类型确实有用处。
      【解决方案3】:

      我的函数设置 TWinControl 及其子项中所有编辑的 Text 属性。

      void __fastcall SetEditsText(TWinControl* winControl, UnicodeString editsText)
      {    
          for (int c = 0; c < winControl->ControlCount; c++)
          {
              TControl* ctrl = winControl->Controls[c];
      
              TWinControl* wc = dynamic_cast<TWinControl*>(ctrl);
      
              // Check if it's grouping component
              if (wc != NULL)
              {
                  // Set edits of children
                  SetEditsText(wc, editsText);
              }
              else 
              {
                  if (ctrl->ClassType() == __classid(TEdit))
                  {
                      TEdit* ecomp = (TEdit*) ctrl;
                      ecomp->Text = editsText;
                  }
              }
          }
      }
      

      使用:

      void __fastcall TForm1::Button1Click(TObject *Sender)
      {
          SetEditsText(form1, ""); // Clear all edits
      }
      

      【讨论】:

      • 不要忘记,如果强制转换是非法的,dynamic_cast 可以抛出 std::bad_cast。您应该将此代码包装在 try/catch 中。
      • dynamic_cast 如果在引用上使用它会抛出异常,但如果在指针上使用它会返回 null。 en.cppreference.com/w/cpp/language/dynamic_cast ("...如果在指针上使用dynamic_cast,则返回new_type类型的空指针值。如果在引用上使用,则抛出异常std::bad_cast ...")
      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2013-07-14
      • 2012-12-01
      相关资源
      最近更新 更多