【问题标题】:Delphi to C# WinForms: Iterate through form components on formDelphi 到 C# WinForms:遍历表单上的表单组件
【发布时间】:2016-07-11 14:56:54
【问题描述】:

在 Delphi 中,您可以像这样遍历表单组件(不是控件):

for i := 0 to Form1.ComponentCount - 1 do begin

但是在 c# Winforms 中我尝试了以下方法:

        foreach (var component in this.components.Components)
        {
            MessageBox.Show(component.ToString());
        }

我在 google 上找不到任何关于如何迭代组件的示例。我发现的只是如何遍历控件。

我想列出表单上的所有控件和组件。 例如,如果有 2 个按钮和 2 个图像列表,我想列出所有 4 个项目。

【问题讨论】:

  • Delphi 中的组件是什么?它与 Control 有何不同?
  • delphi 中的组件可以是任何东西,例如编辑框和图像列表。它们都保存在同一个集合中。组件列表包含给定组件拥有的所有组件,控件列表包含由给定组件作为父级的所有组件,这是唯一的区别
  • @GuidoG 不是这样。 Delphi 中的控制是指任何来自TControl 的东西。这些是视觉的,它们的识别特征是它们有一个Parent
  • 当我说它们是分开的时,我并不是说在以后的 Delphi 版本中,我是指在 Delphi 的对象层次结构中。我所说的这里有一个误解。如果我没记错的话,有些组件是 TWinControls 的后代,其他的则是 TGraphicControl 的后代?但是所有都是作为 TObject 出生的,还是我真的忘记了 Delphi 的一切?
  • TControl 从哪里继承? TPersistent 继承自 TObject ?如果我没记错的话。在 Borland 课程中,他们从未调用过控件(我将它们交给了 delphi 5)。我第一次了解控件这个术语是在 Visual Studio 中。无论如何,我想解释的是,与 Visual Studio 不同的是,Visual Studio 有 2 个集合,一个用于控件,一个用于组件,它在 Delphi 中只有一个。

标签: c# winforms delphi


【解决方案1】:

这在 c# 中并不容易
使用继承形式时也要非常小心。
与 Delphi 不同的是,在组件集合方面,非可视化设计器不支持 oop,因此为每个表单甚至为后代创建了一个新集合!

我是这样做的:(它只会列出组件而不是控件!)

IEnumerable<Component> EnumerateComponents()
{
    return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
               where typeof(Component).IsAssignableFrom(field.FieldType)
               let component = (Component)field.GetValue(this)
               where component != null
               select component;
    }

你可以这样称呼它:

foreach (Component component in EnumerateComponents())
{
    if (component is ImageList)
    {
    }
}

【讨论】:

    猜你喜欢
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多