Показать сообщение отдельно
Старый 19.10.2020, 01:16   #74
sergio1982
Местный
 
Регистрация: 01.09.2019
Сообщений: 424
Сказал(а) спасибо: 52
Поблагодарили 480 раз(а) в 147 сообщениях
Вес репутации: 195
sergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царствеsergio1982 - луч света в тёмном царстве
По умолчанию ключи - значения объекта


Скрытый текст

2-я версия, добавлена поддержка перебора TJSIndexedProperty.
Иногда это не работает, или нет гарантии что выведен весь массив, у этого объекта неизвестно кол-во полей, обращение к несуществующему полю может привести к зависанию, отлов ошибки не работает. В таких случаях кол-во можно ввести в ручную, если массив уже открыт, можно нажать Update.
Предыдущий пост можно удалить.
[свернуть]


Выводит в свойства ключи - значения объекта, значения можно изменить и применить. Если значение является объектом, можно перейти к нему по ссылке. Можно переходить к родительскому объекту, и возвращаться обратно. Выводит путь в подсказке (но это не точно).
Если у функции есть параметры, сначала появятся поля для ввода параметров и кнопка Call - вызвать с указанными параметрами, Cancel - отменить вызов, иначе функция запустится сразу (к функциям без параметров в начале на кнопке добавлены ">>"), будет выведен возврат функции, если функция вернёт объект, будет предложено перейти к нему.
Есть вывод результатов в файл и открытие файла в редакторе по умолчанию.

CODE



Код:
/*
http://promebelclub.ru/forum/showthread.php?p=501450#post501450

Просмотр свойств объекта

typeobject - объект исследования
    1 - выделенный
    2 - по указанию
    3 - указанный в переменной myobject

FunctionInclude - нужно ли отображать функции в результатах

Элементы управления на панели инструментов
    Owner - перейти к родительскому объекту
    Return - вернутся к предыдущему
    Update - обновить данные о объекте
    Export - сохраняет данные в файл, и открывает его в редакторе по умолчанию
    Highlighted - подсветить объект
    Exit - завершить скрипт
    IPCount - кол-во элементов для TJSIndexedProperty.
        Если автоматически определяет неправильно, то можно указать своё значение.
*/

var typeobject = 3

if (typeobject == 3) {
    var myobject = Model
}
var FunctionInclude = 1

// -------------------------------------------------

if (typeobject == 1 && !Model.Selected) {
    alert('Нужно выделить панели')
    Action.Finish();
}
if (typeobject == 1)
    var targetobject = Model.Selected
else if (typeobject == 2)
    var targetobject = GetObject("Укажите объект")
else if (typeobject == 3)
    var targetobject = myobject


if (!(targetobject instanceof Object))
    Action.Cancel();

var history = [];
var InputParam = [];
var argslenght = 0;
var text = '';
var Path = []
var Prop = Action.Properties;

ViewPath(1, targetobject)
parse();

NewButtonInput('Owner').OnChange = ButtonOwner
NewButtonInput('Return').OnChange = ButtonReturn
NewButtonInput('Update').OnChange = function () {OnClickObject(targetobject, '', 1)}
NewButtonInput('Export').OnChange = ButtonExport
NewButtonInput('Highlighted').OnChange = OnHighlighted
NewButtonInput('Exit').OnChange = function () {Action.Finish()}
ButtonCallDelimiter = NewButtonInput(' | ')
IndexedCount = NewNumberInput('IPCount');
ButtonCallDelimiter = NewButtonInput(' | ')
ButtonCallDelimiter.Visible = 0
ButtonCallCancel = NewButtonInput('Cancel')
ButtonCallCancel.Visible = 0
ButtonCallCancel.OnChange = CallBarHide
ButtonCall = NewButtonInput('Call')
ButtonCall.Visible = 0
ButtonCall.OnChange = OnButtonCall
Action.Continue();

function AddItem(key, obj) {
    if (!FunctionInclude && (obj instanceof Function))
        return
    if ((obj instanceof Function)) {
        c = Prop.NewButton((!obj.length ? ' >> ' : ' ') + obj.toString().replace("\n", ""))
        c.Name = key
        c.OnClick = OnClickFunction.bind(c, obj)
    } else if (obj instanceof Object) {
        c = Prop.NewButton(obj)
        c.Name = key
        c.OnClick = OnClickObject.bind(c, obj, key, 0)
    } else {
        c = Prop.NewString(key, obj)
        c.OnChange = OnChange.bind(c, key)
    }
    text += key + '\t\t\t' + obj + '\r\n'
}

function parse(Count) {
    text = ''
    Prop.Capacity = 0
    cString = Prop.NewString(targetobject)
    cString.ReadOnly = 1
    if (Count) {
        for (var i = 0; i < Count; ++i) {
            AddItem('[' + i + (targetobject[i].Name === undefined || targetobject[i].Name == '' ? ']' : ' - ' + targetobject[i].Name + ']'), targetobject[i])
        }
    } else {
        Count = 0
        for (var key in targetobject) {
            ++Count
            AddItem(key, targetobject[key])
        }
    }
    text = targetobject + '    Count: ' + Count + '    Path: ' + Path.join('.') + '\r\n\r\n' + text
    cString.Value = 'Count: ' + Count
}

function OnChange(key) {
    if (isNaN(Number(this.Value)))
        Value = this.Value
    else
        Value = parseFloat(this.Value)
    targetobject[key] = Value
    if (typeof targetobject.Build == 'function')
        targetobject.Build()
    Action.Commit();
}

function OnClickObject(obj, name, nopath) {
    if (!(obj instanceof Object))
        return
    Count = 0
    try {
        _Count = (IndexedCount.Value || obj.___Count || targetobject[name.slice(0, -1) + 'Count']
            || targetobject[name + 'Count'] || targetobject['Count'])
        if ((obj instanceof TJSIndexedProperty) && _Count) {
            Count = _Count
            obj.___Count = Count
        }
    }
    catch (e) {}

    if (nopath !== 1) {
        ViewPath(1, name)
		history.push(targetobject)
		targetobject = obj
	}
    parse(Count)
}

function ButtonReturn() {
    if (!history.length)
        return alert('история пуста')
    targetobject = history.pop()
    ViewPath(0)
    if (targetobject.___Count)
        parse(targetobject.___Count)
    else
        parse();
}

function ButtonOwner() {
    if (!targetobject.Owner)
        return alert('родительский объект отсутствует')
    OnClickObject(targetobject.Owner, 'Owner', 0)
}

function OnClickFunction(obj) {
    CallBarHide()
    if (obj.length > 0)
        return CallBarShow(obj)
    argslenght = 0;
    FunctionCall(obj, this.Name)
}

function FunctionCall(obj, Name) {
    try {
        if (argslenght) {
            args = []
            for (var k = 0; k < argslenght; k++) {
                args.push(InputParam[k].Value)
            }
            r = obj.apply(targetobject, args);
        }
        else
            r = obj.call(targetobject)
    }
    catch (e) {
        alert(e)
        return 1
    }
    if (r instanceof Object) {
        b = confirm('Перейти к ' + r);
        if (b)
            return OnClickObject(r, Name + '()', 0)
        return 1
    }
    alert(r)
}

function CallBarShow(obj) {
    CallBarObj = obj
    CallBarCheck(obj.length)
    for (var k = 0; k < obj.length; k++) {
        InputParam[k].Value = 0
        InputParam[k].Visible = 1;
    }
    ButtonCallDelimiter.Visible = 1
    ButtonCall.Visible = 1;
    ButtonCallCancel.Visible = 1;
}

function CallBarCheck(i) {
    argslenght = i;
    if (InputParam.length >= i)
        return
    for (var k = InputParam.length; k < i; k++) {
        InputParam[k] = NewNumberInput('arg ' + (k + 1));
        InputParam[k].Visible = 0;
    }
}

function CallBarHide() {
    for (var k = 0; k < InputParam.length; k++) {
        InputParam[k].Visible = 0
    }
    ButtonCallDelimiter.Visible = 0
    ButtonCall.Visible = 0
    ButtonCallCancel.Visible = 0
}

function OnButtonCall() {
    CallBarHide()
    FunctionCall(CallBarObj)
}
function OnHighlighted() {
    Model.UnHighlightAll()
    targetobject.Highlighted = 1
}

function ButtonExport() {
    system.writeTextFile('export.txt', text);
    var file = '"' + Action.Properties.AbsolutePath() + 'export.txt"'
    NewCOMObject('WScript.Shell').run(file);
}

function ViewPath(add, key) {
    if (add)
        Path.push(key == '' ? targetobject : key)
    else
        Path.pop()
    Action.Hint = Path.join('.')
}
[свернуть]

Последний раз редактировалось sergio1982; 19.10.2020 в 19:36.
sergio1982 вне форума   Ответить с цитированием Вверх
4 пользователя(ей) сказали cпасибо:
AlexBolton (22.05.2022), Ovsyanicov (14.01.2021), PravCom (22.05.2022), Максим Геннадьевич (19.10.2020)