Динамически подключаемая библиотека для оптического сканера - PullRequest
1 голос
/ 06 октября 2009

Я пытаюсь реорганизовать свой проект, чтобы вместо многих функций у меня были некоторые объекты.

Я пишу приложение, которое связывается с определенным оптическим сканером через последовательный порт. Я использую обычные методы класса SerialPort

(Write, Open, Close) и некоторые расширенные методы, которые не включены в стандартный класс, например ActivateLaser (он записывает определенные байты в SerialPort).

Я сделал первый шаг: я создал новый класс, который наследует класс SerialPort, и добавил свои собственные методы, такие как ActivateLaser. Этот проект скомпилирован в dll, а затем включен в мой основной проект.

Теперь я хотел бы пойти дальше и включить прослушивание SeiralPort для моей библиотеки DLL. Как это работает сейчас: сначала я назначаю событие DataReceived своему сканеру (сканер является экземпляром моего собственного класса SerialPort):

scanner.DataReceived += MyDataReceivedEventHandler;

Затем в MyDataReceivedEventHandler я вызываю делегата, который отображает полученные данные в RichTextBox или в DataGridView:

private void MyDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e)
{
    ...
    this.BeginInvoke(new DisplayDataDelegate(DisplayData), receivedText);
    ...
}

private void DisplayData(string receivedText)
{
    // display received text in RichTextBox in one project, display received text in DataGridView in another project
}

Теперь мне интересно, как я могу реализовать прослушивание последовательного порта в классе MySerialPort. Если я просто добавлю обработчик события для DataReceived, то оператор, который связывает MyDataReceivedEventHandler со сканером, будет выглядеть примерно так:

scanner.DataReceived += scanner.MyDataReceivedEventHandler;

Я просто не знаю, как собрать все это вместе (я должен определить MyDataReceivedEventHandler в классе MySerialPort, куда я должен поместить делегат для отображения текста, как я могу сделать это возможным, чтобы показать текст в RichTextBox или в DataGridView, .)

Я знаю, что мой вопрос немного сложен, но я действительно хотел бы лучше организовать свою работу, чтобы я мог использовать свой класс MySerialPort в других проектах ...

Спасибо!

1 Ответ

1 голос
/ 06 октября 2009

Я предлагаю повысить пользовательское событие в вашей реализации SerialPort. Это событие может содержать данные, которые передаются на уровень пользовательского интерфейса вашего приложения, где вы можете отобразить их в RichTextBox. Это отделит класс сканера от элементов управления пользовательского интерфейса и означает, что вам не нужно иметь ссылку на RichTextBox в вашем классе сканера.

В качестве примера вы можете создать пользовательское событие с именем DocumentScanned и класс, производный от EventArgs с именем DocumentScannedEventArgs, для хранения данных события.

В вашей реализации SerialPort вы можете обработать событие DataReceived и, в свою очередь, вызвать событие DocumentScanned при получении новых данных. Ваш пользовательский интерфейс может подписаться на это событие, чтобы получать отсканированный текст и отображать его по своему усмотрению.

Что-то вроде (при условии, что вы используете C # 3.0):

public class DocumentScannedEventArgs : EventArgs
{
    public DocumentScannedEventArgs(string scannedText)
    {
        ScannedText= scannedText;
    }

    public string ScannedText { get; set }
}

...

public class MySerialPort : SerialPort
{
    public MySerialPort()
    {
        ...
        this.DataReceived += scanner.MyDataReceivedEventHandler;
        ...
    }

    ...

    public event EventHandler<DocumentScannedEventArgs> DocumentScanned;

    protected void OnDocumentScanned(DocumentScannedEventArgs e)
    {
        var handler = DocumentScanned;

        if (handler != null)
        {
            handler(this, e);
        }
    }

    private void MyDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e)
    {
        ...
        this.BeginInvoke(new DisplayDataDelegate(DisplayData), receivedText);
        ...
    }

    private void DisplayData(string receivedText)
    {
        // fire DocumentScanned event
        OnDocumentScanned(new DocumentScannedEventArgs(receivedText));
    }
}
...