C# Ошибка «Нет перегруженного метода . который соответствует делегату ..»
Здравствуйте, уважаемые программисты!
Обращаюсь к вам за помощью, особенно к Вам, Алексей aka kpblc (может вспомните меня, Вы этим маем в Инфарс г.Москва у нас преподавали курс)
Я инженер-технолог отдела САПР, который неудачно пожелал начать программировать под автокад)))
Начальство сразу поставило задачку (еще в начале лета) — адаптировать, созданную панельку для AutoCAD 2009-2011 (которая формирует таблицу экспликацию зданий и сооружений) под более поздние версии AutoCAD 2013. Код написан на C#, как мне объяснили на скорую руку. Если надо объяснить суть работы панельки, то постараюсь объяснить позже, но пока мне кажется может кто-то сможет и так сразу подсказать где копать..
В общем сейчас под 2011-й автокад панелька работает прекрасно. Под 13-й панель уже не работает, надо подключать другие библиотеки и т.д. Я вроде б всё нашла и заменила всё необходимое, из 60 ошибок и 100 предупреждений, осталась только одна ошибка — «Ошибка 38 Нет перегруженного метода для «docColDocDeact», который соответствует делегату «Autodesk.AutoCAD.ApplicationServices.DocumentCollectionEventHandler» ..\SAPRLibrary\Class1.cs»
Как помните, у меня совершенный ноль в програмировании на C#.. но, к сожалению, кроме как к вашему форуму, если честно обратиться не кому Понимаю, что может быть одного кода файла Class1.cs будет не достаточным и может спрашиваю элементарное, но все равно прошу вашей помощи. Спасибо!
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Windows; using Autodesk.AutoCAD.Interop; namespace SAPRLibrary < public class Class1 : IExtensionApplication < Autodesk.AutoCAD.Windows.PaletteSet ps = null; System.Windows.Forms.UserControl myCtrlsnos = null; System.Windows.Forms.UserControl myCtrlpir = null; public void Initialize() < >public void Terminate() < >public void docBeginDocClose(object senderObj, DocumentBeginCloseEventArgs docBegClsEvtArgs) < if (this.ps != null) < this.ps.Visible = false; >> void docColDocDeact(object senderObj, DocumentCollectionEventArgs docColDocActEvtArgs) < if (this.ps != null) < this.ps.Visible = false; >> [CommandMethod("СНОС")] public void listSnos() < Document acDoc = Application.DocumentManager.MdiActiveDocument; Editor ed = acDoc.Editor; try < ed.WriteMessage("\n"); if (this.ps == null) < ed.WriteMessage("Загрузка панели САПР . \n"); this.ps = new Autodesk.AutoCAD.Windows.PaletteSet("Панель САПР"); this.ps.Style = PaletteSetStyles.ShowCloseButton | PaletteSetStyles.ShowAutoHideButton | PaletteSetStyles.ShowTabForSingle; this.ps.MinimumSize = new System.Drawing.Size(222, 500); //this.ps.Dock = DockSides.None; myCtrlsnos = new Snos(); this.myCtrlpir = new pir(); this.ps.Add("Учет ПИР", this.myCtrlpir); this.ps.Add("СНОС", myCtrlsnos); this.ps.Visible = false; acDoc.BeginDocumentClose += new DocumentBeginCloseEventHandler(docBeginDocClose); Application.DocumentManager.DocumentToBeDeactivated += new DocumentCollectionEventHandler(docColDocDeact); ed.WriteMessage("Загрузка выполнена\n"); >this.ps.Visible = !this.ps.Visible; > catch < ed.WriteMessage("Ошибка отображения панели"); >> [CommandMethod("ЗСНОС")] public void LoadCUI() < Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; object oldCmdEcho = Application.GetSystemVariable("CMDECHO"); object oldFileDia = Application.GetSystemVariable("FILEDIA"); Application.SetSystemVariable("CMDECHO", 0); Application.SetSystemVariable("FILEDIA", 0); try < doc.SendStringToExecute( "_.cuiload snos ", false, false, false ); doc.SendStringToExecute( "(setvar \"FILEDIA\" " + oldFileDia.ToString() + ")(princ) ", false, false, false ); doc.SendStringToExecute( "(setvar \"CMDECHO\" " + oldCmdEcho.ToString() + ")(princ) ", false, false, false ); >catch (Autodesk.AutoCAD.Runtime.Exception e) < ed.WriteMessage("Ошибка загрузки кнопки " + e.Message); >finally < ed.WriteMessage("СНОС установлен."); >> > >
Нет перегруженного метода, который соответствует делегату
Что делать? — для начала указать что за ошибка и почему вы думаете, что каллбек для таймера вдруг будет принимать строку как параметр.
25 авг 2018 в 11:00
Нет перегруженного метода для «Switch», который соответствует делегату «TimerCallback»
25 авг 2018 в 11:12
Ну то есть вам прямо текстом написано что не так — сигнатура вашего Switch не совпадает с тем, что ожидает каллбек таймера. Согласно докам метод должен быть void и принимать параметр как object , а у вас вместо объекта — строка.
25 авг 2018 в 11:30
да и логика вашего Switch непонятна — почему вы решили, что таймер, которому дела нет до каких то команд, вдруг начнет посылать команды в метод Switch ? Он этого делать сам не будет, вам надо писать какую то доп логику для того, чтобы в ваш метод посылались команды, что вы хотите
25 авг 2018 в 11:32
ну тогда вам нужен метод, что принимает object как параметр (а уже в этом методе вызывайте что хотите) + вам надо будет сделать таймер полем класса, иначе GC его уничтожит. И это вроде все, что вам необходимо для решения вашей задачи.
Ошибка компилятора CS0123
Ни одна перегрузка для метода «метод» не соответствует делегату «делегат».
Не удалось создать делегат, поскольку не использовалась правильная сигнатура. Экземпляры делегата должны объявляться с такой же сигнатурой, как и в объявлении делегата.
Чтобы устранить эту ошибку, исправьте либо метод, либо сигнатуру делегата. Дополнительные сведения см. в разделе Делегаты.
Следующий пример приводит к возникновению ошибки CS0123.
// CS0123.cs delegate void D(); delegate void D2(int i); public class C < public static void f(int i) <>public static void Main() < D d = new D(f); // CS0123 D2 d2 = new D2(f); // OK >>
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Routed Event Handler Делегат
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет метод, который будет обрабатывать различные перенаправленные события, не содержащие данных события, помимо тех, которые являются общими для всех перенаправленных событий.
public delegate void RoutedEventHandler(System::Object ^ sender, RoutedEventArgs ^ e);
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
type RoutedEventHandler = delegate of obj * RoutedEventArgs -> unit
Public Delegate Sub RoutedEventHandler(sender As Object, e As RoutedEventArgs)
Параметры
Объект, к которому присоединен обработчик событий.
Комментарии
Делегат RoutedEventHandler используется для любого перенаправленного события, которое не сообщает сведения о конкретном событии в данных события. Существует множество таких перенаправленных событий; Известные примеры: Click и Loaded.
Наиболее примечательное различие между написанием обработчика для перенаправленного события в отличие от общего события CLR заключается в sender том, что событие события (элемент, к которому прикреплен и вызывается обработчик) не может считаться источником события. Источник передается как свойство в данных события (Source). Разница между sender и Source является результатом перенаправления события в различные элементы во время обхода перенаправленного события через дерево элементов.
Вы можете использовать или sender Source для ссылки на объект, если вы намеренно не заинтересованы в поведении маршрутизации прямого или восходящего перенаправленного события и планируете обрабатывать перенаправленные события только в элементах, где они впервые возникают. В этом случае и sender Source являются тем же объектом.
Если вы намерены использовать преимущества, присущие перенаправленным событиям, и записывать обработчики соответствующим образом, два наиболее важных свойства данных событий, с которыми вы будете работать при написании обработчиков событий, — это Source и Handled.
Для определенных сочетаний входных событий и классов элементов управления WPF элемент, вызывающий событие, не является первым элементом, который имеет возможность его обработки. Если событие ввода имеет предварительную версию события, то корень дерева элементов имеет первую возможность, может задать для true значение Handled в общих данных события и может повлиять на то, как входное событие передается оставшимся элементам в маршруте события. Поведение обработки предварительного просмотра может привести к тому, что определенное перенаправленное событие не вызывается должным образом. Дополнительные сведения см. в разделе Обзор событий предварительного просмотра и ввода.
Методы расширения
Получает объект, представляющий метод, представленный указанным делегатом.