Создание COM-объекта в форме C # - PullRequest
0 голосов
/ 06 октября 2018

Моя первая консольная программа на C # работает хорошо, поэтому я перехожу к программе, использующей формы.У меня есть label1, lable2 a button1, и я хочу создать button2.все работает, но не могу понять, как использовать тот же COM-объект в button2 без необходимости определять его снова.

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();
    }
}

}

Я получаю сообщение об ошибке "имя scope не существует "в button2_click.CMD был определен в button1_click, поэтому не существует в button2_click, и я могу понять это, но почему не существует область действия, когда она определена в Form1_load и / или даже в main?Я не знаю, как объявить это и сделать его видимым во всех функциях Form1, не выпуская и не переопределяя его в каждой кнопке действия.Есть ли способ сделать это?спасибо

1 Ответ

0 голосов
/ 06 октября 2018

вы можете переместить его в более высокую область видимости, то есть прямо под объявлением класса и оставить его пустым (нулевым), тогда вы можете получить доступ к нему с помощью button2, но он всегда будет нулевым, пока вы не назначите его первой кнопкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...