Делегаты, а они есть? | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Добрый день.
А есть в FoxPro что-то вроде C# - ских делегатов ? |
Re: Делегаты, а они есть? | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
А работающие с фоксом просто обязаны знать про "C# - ских делегатов"? Странно только почему по этой же логике работающие с C# не знают возможностей фокса... Что именно надо? ------------------ Лень - это неосознанная мудрость. |
Re: Делегаты, а они есть? | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Не обязаны, потому и тема создана в разделе "Не фоксом единым". Надо узнать, а есть в FoxPro что-то вроде C# - ских делегатов. Ну вот например, в C# есть аксессоры, в FoxPro это _ACCESS и _ASSIGN. Ну хочется тоже самое только с делегатами. |
Re: Делегаты, а они есть? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
C# свойства лишь схожи с фоксовыми access/assign методами, но далеко не идентичны им.
Делегатов в фоксе нет, то что есть ещё более отдалённо "похоже" на этот самый "типизированный указатель на метод" (даже более простого си-подобного "указателя на функцию" в фоксе нет). Где-то можно использовать банальный макро, где-то использовать BINDEVENT() - кстати, в его описании фигурирует слово delegate, правда оно закавычено, т.е. это "ну типа делегат" Как такового же C# делегата в не строго типизированном языке и быть не должно - т.к. делегат в C# это просто пользовательский тип (хоть и особого рода), ну и потом объект этого типа служащие для замены тех самых "указателей на функцию" из старого доброго нешапрованного си "Хотеться" должно решить задачу/закодировать логику определённым образом, а не тупо "делегата как в шарпе". Вот если будет озвучена задача, которую ты пытаешься при помощи делегата решить, тогда и можно будет подбирать наиболее подходящий аналог. ------------------ WBR, Igor |
Re: Делегаты, а они есть? | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Ответ на незаданный вопрос. КАКОЙ функционал у ваших "C# - ских делегатов" ищется в фоксе? Или вы считаете, что слово делегаты одинаково понимается и имеется во всех языках? Цитата:Вот и напишите ЧТО делают делегаты в C# дабы знающие фокс могли написать вам какими средствами сие реализуется в фоксе. ------------------ Лень - это неосознанная мудрость. |
Re: Делегаты, а они есть? | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Нет, конечно я так не считаю, но всегда есть самое распространённое понятие.
Ну понятное дело, я просто пытаюсь найти замену. На замену Get и Set отлично подходят access/assign. Герберт Шилдт - C# 4.0. Полное руководство - 2011 страница 473. Ну ладно, я тут немного туплю с "Обработчиками событий", никак не могу для себя решить как правильно всё это делать. Извините за не очень удобочитаемый (программный) текст, но я хочу увидеть общее решение. Вот есть приложение. Форма с ТексБоксом в который пользователь вносит текст, по нажатию кнопки нужно сохранить этот текст в файл по указанному пользователем пути. Делаем классы. Делаем Класс ы. Класс Папка Метод Создать Класс ТекстовыйФайл Метод Создать Метод Открыть Метод ЗаписатьСтроку Метод Сохранить Метод Удалить Метод Закрыть Класс Настройки Свойство ПутьУказанныйПользователем Класс СамоПроверка Метод ПроверитьСуществованиеПапки Метод ПроверитьСуществованиеФайла Метод ПроверитьУказанПутьИлиНет Обработчик события «Клик» объект «Кнопка» Если ПроверитьУказанПутьИлиНет = Ложь Return Если ПроверитьСуществованиеПапки = Ложь Папка.Создать(ПутьУказанныйПользователем) Если ПроверитьСуществованиеФайла = Истина ТекстовыйФайл.Удалить(Настройки.ПутьУказанныйПользователем) ТекстовыйФайл.Создать(Настройки.ПутьУказанныйПользователем) ТекстовыйФайл.Открыть(Настройки.ПутьУказанныйПользователем) ТекстовыйФайл.ЗаписатьСтроку ТекстовыйФайл.Сохранить(Настройки.ПутьУказанныйПользователем) ТекстовыйФайл.Закрыть Иначе ТекстовыйФайл.Создать(Настройки.ПутьУказанныйПользователем) ТекстовыйФайл.Открыть(Настройки.ПутьУказанныйПользователем) ТекстовыйФайл.ЗаписатьСтроку ТекстовыйФайл.Сохранить(Настройки.ПутьУказанныйПользователем) ТекстовыйФайл.Закрыть ********************************************************************************** P.S. Может лучше кодом сделать? (Я могу! =)) Собственно вопрос заключается в обработчике событий. Можно ли его сделать как отдельный класс или это всегда будет метод? Не могу понять как правильно делаются "Обработчики событий" |
Re: Делегаты, а они есть? | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
Ошибаетесь, не всегда. Иногда его вообще нет. Цитата:Вот это сверхнаглость. Предлагаете нам искать сие творение и его изучать только лишь для помощи вам? Рыло не треснет? Цитата:Написанием методов для обработки событий. ------------------ Лень - это неосознанная мудрость. |
Re: Делегаты, а они есть? | |
---|---|
PaulWist Сообщений: 14625 Дата регистрации: 01.04.2004 |
В фоксе событие всегда ассоциировано с одноименным методом, те (в примитивном случае) у кнопки в событии Click пишешь код (= messagebox('Hello word')) - этот код будет выполнен при нажатии на кнопку, так же он будет выполнен при вызове Кнопка.Click() ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Делегаты, а они есть? | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Объяснить лучше чем Герберт Шилдт я не смогу. Выкладывать страницы про делегаты из книги как-то глупо. Если не хотите не изучайте, но я изучаю и создавая эту тему я рассчитывал на людей которые тоже это изучают. Вот сейчас я делают так: На событие "клин" какой нибудь кнопки у меня вызывается процедура которая уже вызывает необходимые процедуры и функции. Или правильно будет эти процедуры и функции написать в самом методе "клик" избегая дополнительной упаковки в процедуру? А вообще я думал создать Класс для этих процедур, то есть упаковывать их не в процедуру, а в класс, только вот не знаю насколько это будет правильно. |
Re: Делегаты, а они есть? | |
---|---|
ssa Сообщений: 13008 Откуда: Москва Дата регистрации: 23.03.2005 |
И не надо. Цитата:Не глупее, чем задавать вопрос про наличие в фоксе чего-то, что есть в хрен знает каком языке. Цитата:Спасибо за указание, но что мне делать я давно решаю сам. Цитата:И с какого перепуга вы на это рассчитывали? Цитата:Вполне нормальное решение. Цитата:Можно и так. Цитата:Вы сначала критерии оценки правильности сформулируйте. ------------------ Лень - это неосознанная мудрость. |
Re: Делегаты, а они есть? | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Как же не надо, если вы просите объяснений.
C# не хрен знает какой, а вполне набирающий обороты современный язык. Ну и чудненько.
Ну я считаю FoxPro умирающим языком программирования и люди чтобы не потерять работу должны изучать другой язык программирования, я говорю про относительно молодых людей, а не про пожилых которые доживают свой век вместе с FoxPro. Надеюсь говоря такое, я не кого не расстраиваю. В связи с выше сказанным, я и рассчитывал, что на форме посвященному программированию на FoxPro может найтись человек или группа людей заинтересованных в изучении другого языка программирования, например C#. Повторяюсь, тема была создана в разделе "Не фоксом единым". Подобный раздел так же предполагает наличие людей разбирающихся не только в FoxPro на форму FoxPro.
Можно по разному, главное выяснить как делать правильно. Выдумывать разнообразные варианты исполнения одного и того же замысла можно очень долго и выдумать их в этом процессе очень много. Но я уверен, что я не единственный кто задавал когда либо подобным вопросом и люди намного умней меня уже давно нашли относительно оптимальный путь для решения типовых задач связанных с созданием "Обработчиков событий". Вот я и решил спросить у опытных людей как сделать правильно, ибо мои изыскания по данному вопросу затянулись и начали порождать новые вопросы, что еще больше меня путает. Мне нежен совет или ссылка на литературу. |
Re: Делегаты, а они есть? | |
---|---|
PaulWist Сообщений: 14625 Дата регистрации: 01.04.2004 |
1. "Классика" говорит, что для "общей функциональности" необходимо написать класс (например, кнопки для открытия/закрытия файла), а затем этот класс субклассировать для открытия/закрытия txt, dbf, pdf итд, те код будет лежать в событии/методе самого класса (обычно в классе добавляют пользовательский метод, что бы код реакции был "один", а вызов мог быть из нескольких мест, например Кнопка.Click, Кнопка.KeyPress итд), те класс будет самодостаточным и изолированным от других объектов. 2. Для объектов контейнеров обычно код прописывают в пользовательских методах контейнера верхнего уровня. 3. Для "общих" задач (как открытие-закрытие файла, установление соединения с сервером итп) обычно используется класс-посредник (в нём пишется код, а затем из кнопки вызывается пользовательский метод класса-посредника), ... правда в отладке не очень удобно, приходится этот посредник выгружать-инициировать, вот в этом случае можно использовать подход когда из посредника вызываются prg (процедуры-функции), НО повторю, только для отладки. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Делегаты, а они есть? | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если внимательно следить за имеющимися у них "ограничениями и особенностями", то да, это "аналог". Обработчики событий "встроены" в фоксовые классы. То же "нажатие на экранную кнопку", т.е. событие Click ВСЕГДА имеет жёстко связанный с ним обработчик события - который является методом этого же класса с точно таким же именем. И большая часть кода имеющего дело с "событиями" в фоксе реализуется ИМЕННО через написание кода в данном методе-обработчике. Непосредственно, без позднего связывания. Никакие делегаты при этом не требуются вообще. Просто в фоксе иная парадигма "событий и обработчиков" нежели в C#. Да, в какой-то период времени (не изначально - в 7 или даже 8 версии, если я не ошибаюсь) в фокс добавили возможность "динамически" связывать некоторый метод с некоторым событием (для чего и служит делегат в C#). Заодно и добавили функцию которая "вызывает срабатывание события". Что позволяет в некоторой степени эмулировать подход C# - т.е. писать отдельные методы, а потом явно их "связывать" с определёнными событиями, ну а заодно и создавать свои собственные события (что до этой версии фокса было в принципе невозможно сделать в рамках встроенного языка фокса). Только для решения прикладных задач в 99% случаев это вообще не требуется. Для более-менее "грамотного" рисования формы по указанному сценарию достаточно всего ничего - создать в форме метод реализующий "логику" и в методе-обработчике Click соответствующей кнопки прописать его вызов. Всё. Если "логика" уже написана в каком-то классе, то помещаем на форму экземпляр этого класса (если он визуальный - визуально "бросаем", если невизуальный - создаём свойство для хранения ссылки и потом в коде через CreateObject создаём экземпляр и помещаем ссылку на него в свойство). Не, оно, конечно, можно при помощи BINDEVENTS() напрямую привязать соответствующий метод к событию Click нужной кнопки (или ещё к какому другому событию) - только практической пользы в этом лично я не вижу. "Динамика" нужна весьма нечасто. В том же шарпе в варианте приложений для десктопа, как правило все эти "связки метода с событием" прописаны совершенно статично, и вообще в генерируемом коде (том, который создаёт визуальный редактор форм в VisualStudio) - т.е. это там как раз стараются "скрыть сложность" всех этих делегатов/event-ов и предоставить программисту простой способ решения задачи - тюкнул по имени события в окошке свойств для нужного элемента - вбил в появившемся методе-заготовке нужный код. Обработчик события не может быть классом - ни в фоксе, ни в шарпе. Это всегда метод. Код в шарпе всегда находится внутри того или иного метода - у него просто нет других конструкций для выражения "действий" кроме методов. В фоксе ещё исторически есть "процедуры и функции" - но их по сути можно рассматривать как статические методы "безымянного" объекта. Т.е. то что в шарпе можно записать как res = SomeClass.MyStaticMethod(param1); в фоксе запишется как res = MyFunction(param1) При том если писать в шарпе код в том же самом классе SomeClass, то префикс - имя класса - вполне можно и не прописывать, и синтаксис получится вообще идентичным. ------------------ WBR, Igor |
Re: Делегаты, а они есть? | |
---|---|
Chips Автор Сообщений: 93 Дата регистрации: 11.02.2016 |
Большое спасибо всем за ответы.
В ходе беседы я усвоил несколько важных вещей, вопросы конечно остались, но это уже для другой темы. |
Re: Делегаты, а они есть? | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Трудно понять, что здесь можно понять.
Все же - что это за "делегаты", и можно ли их создать в фоксе? |
© 2000-2024 Fox Club  |