Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Внизvar Proc: procedure а дальше что?! Найти похожие ветки
← →
Grief © (2005-05-15 10:18) [0]Помогите, пожалуйста, мне необходимо сделать переменную, которая сможет хранить указатели на процедуры с разным количеством параметров.
То есть, например, когда я делаю
var P: procedure;
А затем присваиваю:
P := GetNewLink(1, 1, I);
У меня, понятное дело, вываливается ошибка. Как этого избежать?
← →
Юрий Зотов © (2005-05-15 10:28) [1]type
TProc = procedure(Params: array of const);
var
P: TProc;
begin
P := @GetNewLink;
← →
Grief © (2005-05-15 10:39) [2]угу, пасибки.... огромное спаибки!!!!
← →
Grief © (2005-05-15 11:23) [3]А не подскажите, а как теперь эту процедуру запустить? Я и так, и сяк: Dialog[CurrentDialog].Button[I].Proc;
А он говорит, что не хватает параметров. Дело в том, что у переменной процедуры вообще не может быть параметров!
← →
Ozone © (2005-05-15 11:41) [4]Proc([<список параметров>])
← →
Grief © (2005-05-15 22:36) [5]А если их нет?
← →
Marser © (2005-05-15 23:29) [6]Согласно инструкции. Как обычную подпрограмму.
← →
Grief © (2005-05-16 13:59) [7]угу, вроде ясно, то есть Proc([]); так что ли?
← →
GrayFace © (2005-05-16 15:42) [8]угу
← →
Grief © (2005-05-19 13:59) [9]М-дя, я конечно тормоз, но
Main.Button[4].Proc := @DestroyWindow([Main.Wnd]);
Выдает ошибку Incompatible types "HWND" and "Set"
при
TButton = object
Name: string;
Position: TRectangle;
Proc: procedure(Parameters: array of const);
...
Что не так?
← →
Eraser © (2005-05-19 14:01) [10]Grief © (19.05.05 13:59) [9]
Proc: procedure(Parameters: array of const);
Ошибка.
← →
Reindeer Moss Eater © (2005-05-19 14:08) [11]... := @this_pascal_module.DestroyWindow([Main.Wnd]);
← →
Eraser © (2005-05-19 14:11) [12]Eraser © (19.05.05 14:01) [10]
Каюсь. Соврал.
← →
Grief © (2005-05-19 14:15) [13]Reindeer Moss Eater - это не шутка?
← →
Reindeer Moss Eater © (2005-05-19 14:15) [14]Reindeer Moss Eater - это ник.
← →
Reindeer Moss Eater © (2005-05-19 14:16) [15]unit Windows;
.....
function DestroyWindow(hWnd: HWND): BOOL; stdcall;
.....
← →
Grief © (2005-05-19 14:18) [16]а... имеется ввиду, что то вроде ... := Unit1.DestroyWindow([Main.Wnd]); ?
Нет, неправильно, я ведь использую обычный DestroyWindow из Windows Почему же неработает?
Eraser - а как правильно?
← →
Reindeer Moss Eater © (2005-05-19 14:18) [17]я ведь использую обычный DestroyWindow из Windows Почему же неработает?
Потому что [15]
← →
Grief © (2005-05-19 14:19) [18]ну уж не совсем тупой, это обращение...
Но как же правильно?
← →
Reindeer Moss Eater © (2005-05-19 14:20) [19]Сникерсни!
... := @this_pascal_module.DestroyWindow([Main.Wnd]);
← →
Grief © (2005-05-19 14:21) [20]как сделать ссылку переменной на ЛЮБУЮ процедуру, не обращая внимания на количество и тип параметров?
← →
Reindeer Moss Eater © (2005-05-19 14:22) [21]Ты что, совсем никакой?
Если используешь DesroyWindow из Window.pas, то зачем квадратные скобки?
← →
begin...end © (2005-05-19 14:25) [22]> Reindeer Moss Eater © (19.05.05 14:20) [19]
> ... := @this_pascal_module.DestroyWindow([Main.Wnd]);
Ну и что это за бред?
← →
Reindeer Moss Eater © (2005-05-19 14:25) [23]А что именно непонятно?
← →
begin...end © (2005-05-19 14:27) [24]> Reindeer Moss Eater © (19.05.05 14:25) [23]
Непонятно, с какого перепугу при присваивании значения переменной процедурного типа можно указывать фактические или формальные параметры.
← →
Eraser © (2005-05-19 14:29) [25]Grief © (19.05.05 14:21) [20]
как сделать ссылку переменной на ЛЮБУЮ процедуру, не обращая внимания на количество и тип параметров?
Как и ссылку на что-либо другое. Через указатель.
var
p: pointer;
Только при вызаве надо будет всё равно делать привидение типов.
← →
Reindeer Moss Eater © (2005-05-19 14:30) [26]Это не я присваиваю.
Это автор присваивает.
Я лишь понял, что у него в качестве имени процедуры взято имя DestroyWindow из windows.pas.
Отсюда коллизия имен и сообщение об ошибке
Incompatible types "HWND" and "Set"
вот и все.
Я предложил ему уточнить функцию именем модуля.
← →
Grief © (2005-05-19 14:30) [27]По порядку. Мне надо реализовать свои кнопки. Кнопка - объект, у которого есть много разных полей - картинка, позиция на экране, enable, visible и прочая... Среди них есть параметр Proc, определяющий процедуру, которая выполняется при нажатии на эту кнопочку. У процедуры может быть от нуля до бесконечности параметров. Как организовать хранение ссылок на процедуры в полях записи и как эти процедуры вызывать? Причем мне надо сохранять процедуру сразу с параметрами, а загружать с уже сохраненными параметрами. То есть Указать в начале Proc := DestroyWindow(MainWindow) а потом Proc вызывается и закрывается окошко. Как это устроить? Кстати, бес квадратных скобок он говорит, что variable requred. Кроме того, скобки мне подсказали [4] и [8]
скажи свое icq, Reindeer и я подробнее объясню, если не в лом, либо вот моя - 323626768
← →
Eraser © (2005-05-19 14:33) [28]Grief © (19.05.05 14:30) [27]
У процедуры может быть от нуля до бесконечности параметров.
Перерабатывай алгоритм. Так как ты задумал неполучится.
← →
Reindeer Moss Eater © (2005-05-19 14:35) [29]У процедуры может быть от нуля до бесконечности параметров.
Легко заменяется процедурой с одним параметром.
procedure MyProc(AParamList: TStrings);
← →
Grief © (2005-05-19 14:37) [30]Совсем? :( У меня уже есть один алгоритм, он зделан так:
var Proc: procedure;
procedure CloseMyWindow;
begin
destroyWindow(Main.Wnd);
end;
...
Proc := CloseMyDialog;
Proc;
...
Последняя строчка собственно и закрывает окошко.
Как можно избавиться от описания новой процедуры?
Дело в том, что их у меня уже больше сотни и в каждой записано по одной строчке... :(
Хотелось бы улучшить процесс инициализации моих кнопок.
P.S. привидение типов - очень страшное привИдение :))))))))
← →
Grief © (2005-05-19 14:38) [31]может тогда примерчик покажешь, Reindeer Moss Eater?
← →
Reindeer Moss Eater © (2005-05-19 14:43) [32]Каждая строка в стринглисте - один "параметр" для процедуры.
Какой еще пример нужен?
перевода строки в число когда это надо?
← →
Eraser © (2005-05-19 14:44) [33]Grief © (19.05.05 14:37) [30]
destroyWindow(Main.Wnd);
И как? AV ещё не разу не вылетела? ;-)
привИдение ;-)
может тогда примерчик покажешь
procedure MyProc(AParams: TStrings);
← →
Reindeer Moss Eater © (2005-05-19 14:47) [34]По порядку. Мне надо реализовать свои кнопки. Кнопка - объект, у которого есть много разных полей - картинка, позиция на экране, enable, visible и прочая... Среди них есть параметр Proc, определяющий процедуру, которая выполняется при нажатии на эту кнопочку. У процедуры может быть от нуля до бесконечности параметров. Как организовать хранение ссылок на процедуры в полях записи
У записи должно быть поле с таким же типом как и свойство OnClick у объекта кнопки. Вот и все.
← →
Grief © (2005-05-19 14:49) [35][32] - А не факт в том, что это будут тока строки или числа, это может быть все, что угодно!
← →
Reindeer Moss Eater © (2005-05-19 14:53) [36]И что именно из этого угодного невозможно представить строкой?
← →
Reindeer Moss Eater © (2005-05-19 14:58) [37]И вообще. В этой консерватории все не так.
Допустим ты создашь кнопку и назначишь ей обработчик имеющий много параметров. Откуда берутся эти параметры при нажатии на кнопку?
Очевидно из объекта самой кнопки.
А раз так, то нафига вообще поддержка произвольного кол-ва параметров у обработчика, когда достаточно одного сендера приведенного к типу кнопки?
Все многочисленные параметры будут и так доступны в обработчике.
В общем бред все это.
← →
Eraser © (2005-05-19 14:59) [38]Reindeer Moss Eater ©
Во-во! Если уж и проблематично строкой передать, то можно использовать массив Objects для передачи указателя на данные!
← →
Grief © (2005-05-19 14:59) [39]а потом перевод как осуществлять? Это будет еще кривее чемвариант с лишними процедурами
← →
Reindeer Moss Eater © (2005-05-19 15:00) [40]Бред Бред Бред
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.012 c