Как предложил Мэтт Balent, вместо того, чтобы определять структуру специально для передачи некоторых параметров в окне, вы можете создать специальный объект, передаваемый OpenWithParm()
и которые могут быть получены в open()
с message.powerobjectparm
(потому что вы можете пройти любой powerobject к этому методу).
Посредством расширения вы можете создать общий тип объекта, который может принимать произвольное количество именованных параметров типа any
, которые вы можете получить по их имени в событии open()
способом, аналогичным структуре. Это своего рода словарь бедного человека.
Вот Exemple на основе некоторого существующего кода:
- на
nv_va_arg
объекта (например, переменных типа аргументов языка C) - источник копируется из объекта «редактировать источник» контекстное меню, чтобы воссоздать объект, добавить новый «пользовательского класса» объект с именем nv_va_args
, сохраните его, то правой кнопкой мыши «источник редактировать» и вставьте следующий код:
forward
global type nv_va_args from nonvisualobject
end type
end forward
global type nv_va_args from nonvisualobject autoinstantiate
end type
type variables
private:
string _is_names[]
any _ia_items[]
end variables
forward prototypes
public subroutine add_item (string as_name, any aa_val)
private function integer search (string as_name)
public subroutine set_item (string as_name, any aa_val)
public function any get_item (string as_name)
private subroutine set_item (integer ai_index, string as_name, any aa_val)
public function integer size()
public function string get_name (integer ai_index)
public function any get_item (integer ai_index)
end prototypes
public subroutine add_item (string as_name, any aa_val);
/* add a new item if not already present */
int idx
idx = search(as_name)
if idx = -1 then
idx = upperbound(_is_names) + 1
set_item(idx, as_name, aa_val)
end if
end subroutine
private function integer search (string as_name);
/* search for an item */
int i, n
n = upperbound(_is_names)
for i = 1 to n
if _is_names[i] = as_name then return i
next
return -1
end function
public subroutine set_item (string as_name, any aa_val);
/* public setter */
int idx
idx = search(as_name)
if idx =-1 then
idx = upperbound(_is_names) + 1
end if
set_item(idx, as_name, aa_val)
end subroutine
public function any get_item (string as_name);
/* get the named item */
int idx
any la_val
idx = search(as_name)
if idx > 0 then
la_val = _ia_items[idx]
end if
return la_val
end function
private subroutine set_item (integer ai_index, string as_name, any aa_val);
/* internal setter */
_is_names[ai_index] = as_name
_ia_items[ai_index] = aa_val
end subroutine
public function integer size();
/* return the number of elements */
return upperbound(_is_names)
end function
public function string get_name (integer ai_index);
/* return the name of the nth item */
string ls_ret = ""
if ai_index > 0 and ai_index <= upperbound(_is_names) then
ls_ret = _is_names[ai_index]
end if
return ls_ret
end function
public function any get_item (integer ai_index);
/* get the named item */
any la_val
if ai_index > 0 and ai_index <= upperbound(_is_names) then
la_val = _ia_items[ai_index]
end if
return la_val
end function
on nv_va_args.create
call super::create
TriggerEvent(this, "constructor")
end on
on nv_va_args.destroy
TriggerEvent(this, "destructor")
call super::destroy
end on
- exampl е заполнения параметров, вы можете использовать любое имя и любой тип, который будет храниться во внутреннем
any
массиве nv_va_args
объекта:
nv_va_args lva_args
//set some values
lva_args.add_item("arg_1", 42)
lva_args.add_item("arg_2", "foo bar")
//change a value
lva_args.set_item("arg_2", "foo baz")
openwithparm(w_test, lva_args)
- 2 примеры аргументов ВОССТАНОВЛЕНИЕ, заложенную в
open()
случае из окно. Обратите внимание, что поиск объекта из message
объекта должен быть сделан в начале мероприятия для не теряет свою ценность (message
объекта является глобальным объектом, который может быть перезаписан довольно быстро)
powerobject lpo_arg //do not create it, as it is autoinstanciated
lpo_arg = message.PowerObjectParm //make immediate copy of the message
nv_va_args lva_args
if isvalid(lpo_arg) and not isnull(lpo_arg) then
lva_args = lpo_arg
end if
//example: enumerate all the parameters
string ls_msg = "", ls_class
int i
any la_val
for i = 1 to lva_args.size()
ls_msg = ls_msg + lva_args.get_name(i) + ': '
la_val = lva_args.get_item(i)
ls_class = classname(la_val)
if ls_class = "string" or ls_class = "long" then
ls_msg = ls_msg + string(la_val, "[general]")
else
ls_msg = ls_msg + '[' + ls_class + ']'
end if
ls_msg = ls_msg + "~r~n"
next
messagebox("list of parameters", ls_msg)
//example: just get a named parameter
string ls_name = "arg_2"
la_val = lva_args.get_item(ls_name)
ls_msg = ls_name + " is " + string(la_val, "[general]")
messagebox("named parameter", ls_msg)
мне нужно делать создать структуру с именем lstr_declaredstr? –
Да, создайте структуру. Является опцией для прохождения параметров –
А потом и в w_wantparm мне нужно создать структуру lstr_declaredstr? –