2009-12-02 2 views
2

Я пытаюсь получить решение TwainDotNet, которое я нашел здесь (C# TWAIN interaction), чтобы скомпилировать, и я нахожусь на своем пути.Как реализовать автоматические свойства в VS 2005 для обратного вызова делегата

Это решение было очевидно разработано в VS 2008, и я работаю в 2005 году (на данный момент нет выбора). Я потратил, вероятно, WAY много времени на то, чтобы все это скомпилировалось в 2005 году, и я уменьшил свои ошибки до двух, причем обе ошибки были одной и той же проблемой.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 

namespace TwainDotNet.WinFroms 
{ 
    /// <summary> 
    /// A windows message hook for WinForms applications. 
    /// </summary> 
    public class WinFormsWindowMessageHook : IWindowsMessageHook, IMessageFilter 
    { 
    IntPtr _windowHandle; 
    bool _usingFilter; 

    public WinFormsWindowMessageHook(Form window) 
    { 
     _windowHandle = window.Handle; 
    } 

    public bool PreFilterMessage(ref Message m) 
    { 
     if (FilterMessageCallback != null) 
     { 
     bool handled = false; 
     FilterMessageCallback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled); 
     return handled; 
     } 

     return false; 
    } 

    public IntPtr WindowHandle { get { return _windowHandle; } } 

    public bool UseFilter 
    { 
     get 
     { 
     return _usingFilter; 
     } 

     set 
     { 
     if (!_usingFilter && value == true) 
     { 
      Application.AddMessageFilter(this); 
      _usingFilter = true; 
     } 

     if (_usingFilter && value == false) 
     { 
      Application.RemoveMessageFilter(this); 
      _usingFilter = false; 
     } 
     } 
    } 

    public FilterMessage FilterMessageCallback 
    { 
     get; 
     set; 
    } 
    } 

} 

Сбой компиляции в свойстве доступа к экземпляру делегата.

ОШИБКА: «TwainDotNet.WinFroms.WinFormsWindowMessageHook.FilterMessageCallback.get» должен объявить тело, потому что оно не отмечено реферата или ехЬегп

Вот интерфейс IWindowsMessageHook, что этот класс реализует:

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace TwainDotNet 
{ 
    public interface IWindowsMessageHook 
    { 
    /// <summary> 
    /// Gets or sets if the message filter is in use. 
    /// </summary> 
    bool UseFilter { get; set; } 

    /// <summary> 
    /// The delegate to call back when the filter is in place and a message arrives. 
    /// </summary> 
    FilterMessage FilterMessageCallback { get; set; } 

    /// <summary> 
    /// The handle to the window that is performing the scanning. 
    /// </summary> 
    IntPtr WindowHandle { get; } 
    } 

    public delegate IntPtr FilterMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled); 
} 

Я признаю себя новичком-делегатом, и я здесь не в порядке. Как я могу дублировать эту функциональность в VS 2005?

Спасибо за внимание.

ответ

0

Просто используйте поддержка поле:

private FilterMessage m_FilterMessageCallback; 
public FilterMessage FilterMessageCallback 
{ 
    get { return m_FilterMessageCallback; } 
    set { m_FilterMessageCallback = value; } 
} 

код в ваш интерфейс

FilterMessage FilterMessageCallback { get; set; } 

имеет кстати. не имеет ничего общего с C# 2.0/3.0, это обычное определение inteface с помощью setter и getter.

+0

Спасибо большое, ребята. Я просто не знал, что компилятор VS 2008 может делать под капотом - я предполагаю, что это версия этой самой вещи? – Ducain

+0

Да, это совсем не то же самое. – tanascius

0

Событие может быть желательным, но как свойство делегата:

private FilterMessage filterMessageCallback; 
public FilterMessage FilterMessageCallback 
{ 
    get {return filterMessageCallback;} 
    set { filterMessageCallback = value;} 
} 

Чтобы избежать реберный случай (токарно-гонки/null), вы также можете:

public bool PreFilterMessage(ref Message m) 
{ 
    FilterMessage callback = FilterMessageCallback; 
    if (callback != null) 
    { 
    bool handled = false; 
    callback(m.HWnd, m.Msg, m.WParam, m.LParam, ref handled); 
    return handled; 
    } 

    return false; 
} 
0

Заливка в пробелах в декларации собственности - ничего не происходит:

private FilterMessage _filterMessageCallback; 

public FilterMessage FilterMessageCallback 
{ 
    get { return _filterMessageCallback; } 
    set { _filterMessageCallback = value; } 
}