C# 形式的 COM 对象创建

问题描述 投票:0回答:2

我的第一个 C# 控制台程序运行良好,因此我现在转向使用 Forms 的程序。我有一个label1,lable2有一个button1,我想创建一个button2。一切正常,但无法弄清楚如何在 button2 中使用相同的 COM 对象而无需再次定义它。

namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        dynamic scope = Activator.CreateInstance(Type.GetTypeFromProgID("LeCroy.XStreamDSO"));
    }

    public void label1_Click(object sender, EventArgs e)
    {

    }

    public void button1_Click(object sender, EventArgs e)
    {
        label2.Text = "reading back instrument ID";
        button1.Text = " 2s pause between successives commands...";
        dynamic scope = Activator.CreateInstance(Type.GetTypeFromProgID("LeCroy.XStreamDSO"));
        dynamic Replay = scope.InstrumentID;
        var Replayvalue = Replay.Value;
        var Replaytype = Replay.type;
        label1.Text = "You are connected to scope model:" + Replayvalue;
        label2.Text = "Going to recall default setup";
        dynamic CMD = scope.SaveRecall.Setup.DoRecallDefaultPanel.ActNow();
        System.Threading.Thread.Sleep(2000);
        label2.Text = "  all  Done!";
        System.Threading.Thread.Sleep(200);
        label2.Text += "\nTrigger mode Auto";
        CMD = scope.Acquisition.TriggerMode = "Auto";
        System.Threading.Thread.Sleep(2000);
        label2.Text += "\nShow measurements ";
        CMD = scope.Measure.ShowMeasure = true; // turn measure panel on
        System.Threading.Thread.Sleep(2000);
        label2.Text += "\nHorizontal scale up";
        CMD = scope.Acquisition.Horizontal.HorScaleUp.ActNow;
        System.Threading.Thread.Sleep(2000);
        label2.Text += "\nHorizontal scale up one more time..";
        CMD = scope.Acquisition.Horizontal.HorScaleUp.ActNow;
        System.Threading.Thread.Sleep(2000);
        label2.Text += "\nShow measurements statistics";
        scope.Measure.StatsOn = true;
        System.Threading.Thread.Sleep(2000);
        label2.Text += "\nTrigger mode Single";
        scope.Acquisition.TriggerMode = "Single";  //set single trigger mode 
        System.Threading.Thread.Sleep(2000);
        label2.Text += "\nclear all sweeps";
        CMD = scope.Measure.ClearSweeps;  //clear sweeps in messurements
        System.Threading.Thread.Sleep(2000);
        label2.Text += "\nTrigger mode Single...again";
        scope.Acquisition.TriggerMode = "Single";  //set single trigger mode 
        System.Threading.Thread.Sleep(2000);
        label2.Text = "\nall commands executed!";

        button1.Text = "click here to redo all...";

    }

    public void Form1_Load(object sender, EventArgs e)
    {

    }

    private void button2_Click(object sender, EventArgs e)
    {
        dynamic CMD = scope.SaveRecall.Setup.DoRecallDefaultPanel.ActNow();
    }
}

}

我在button2_click 中收到错误“名称 scope 不存在”。 CMD 是在button1_click 中定义的,因此在button2_click 中不存在,我可以理解这一点,但是为什么在Form1_load 和/或什至在main 中定义时范围不存在?我不知道如何声明它并使其在 Form1 的所有功能中可见,而不必在每个操作按钮中释放并重新定义它。有没有办法做到这一点? 谢谢

c# forms com
2个回答
1
投票

您可以将其移至更高的范围,即在您的类声明下方并将其保留为空(null),然后您可以使用按钮2访问它,但它始终为空,直到您首先使用按钮1分配它。


0
投票

解决了在加载的第一个表单中声明变量的问题。

© www.soinside.com 2019 - 2024. All rights reserved.