IDragDrop.ReadParams

Синтаксис Fore

ReadParams(Source: Variant): IDragDropParams;

Синтаксис Fore.NET

ReadParams(Source: Object): Prognoz.Platform.Interop.Forms.IDragDropParams;

Параметры

Source - объект, содержащий данные аргумента события. В качестве значения данного параметра должен передаваться объект, содержащий данные в формате «P4_CONTROL».

Описание

Метод ReadParams считывает и преобразует информацию аргумента события, возникающего при перетаскивании данных в .NET-компонент.

Комментарии

При обработке событий .NET-компонента параметры отслеживаемого события доступны в свойстве E. В событиях перетаскивания данные параметры будут иметь тип System.Windows.DragEventArgs. Для преобразования к формату «P4_CONTROL» можно использовать соответствующие .NET-методы данного типа. После преобразования для передачи данных в метод ReadParams предварительно необходимо поместить их в поток с помощью метода ObjectToStream.

Пример

Для выполнения примера предполагается наличие формы, расположенного на ней компонента TreeList с наименованием «TreeList1» и компонента NetControlBox с наименованием «NetControlBox1». Для компонента «TreeList1» свойству AllowDrag установлено значение True.

Class TESTForm: Form
    NetControlBox1: NetControlBox;
    TreeList1: TreeList;
    
    Run: IForeNETRuntime;
    Asm: IForeNETRuntimeAssembly;
    RichObj: IForeNETRuntimeObjectInstance;
    
    Sub TESTFormOnCreate(Sender: Object; Args: IEventArgs);
    Var
        Typ: IForeNETRuntimeType;
    Begin
        Run := ForeNETAssemblyClass.Runtime;
        Asm := Run.SystemAssembly("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
        Typ := Asm.Type("System.Windows.Forms.RichTextBox");
        NetControlBox1.CreateControl(Typ);
        RichObj := NetControlBox1.Control;
        RichObj.InvokeMethod("Set_Text""Исходный текст");
        RichObj.InvokeMethod("Set_AllowDrop"True);
        //Подписка компонента RichTextBox на события
        NetControlBox1.AttachHandler("DragDrop");
        NetControlBox1.AttachHandler("DragOver");
    End Sub TESTFormOnCreate;

    Sub TreeList1OnBeginDrag(Sender: Object; Args: IBeginDragEventArgs);
    Begin
        //Инициализация процесса перетаскивания
        TreeList1.DoDragDrop(TreeList1.FocusedNode.Text, DragDropEffects.Copy);
    End Sub TreeList1OnBeginDrag;

    Sub NetControlBox1OnEvent(Sender: Object; Args: INetControlBoxEventArgs);
    Var
        Obj1, Obj2, Obj3: IForeNETRuntimeObjectInstance;
        Arg: IForeNETRuntimeMethodArgs;
        Bind: IForeNETRuntimeMethodBinding;
        v: Variant;
        EventParams: IDragDropParams;
    Begin
        Select Case Args.EventName
            //Обработка события DragOver
            Case "DragOver":
                Obj1 := Args.E;
                v := Obj1.InvokeMethod("Get_Data"New Variant[0]);
                Obj2 := Run.VariantToObject(v) As IForeNETRuntimeObjectInstance;
                Arg := Run.CreateArgs(1);
                Bind := Run.CreateBinding(1);
                Bind.Types.Item(0) := Asm.Type("System.Windows.Forms.DragDropEffects");
                //Проверка типа перетаскиваемых данных
                //Если данные имеют тип, отличный от P4_CONTROL, то прием данных запрещен
                If Obj2.InvokeMethod("GetDataPresent""P4_CONTROL"As Boolean Then
                    Arg.Value(0) := DragDropEffects.Copy;
                Else
                    Arg.Value(0) := DragDropEffects.None;
                End If;
                Obj1.Type.Method("Set_Effect", Bind).Invoke(Obj1, Arg);
            //Обработка события DragDrop
            Case "DragDrop":
                //Получаем параметры события
                //Параметры имеют тип System.Windows.Forms.DragEventArgs
                Obj1 := Args.E;
                //Получаем значением свойства DragEventArgs.Data
                //и преобразуем полученные данные к типу
                //IForeNETRuntimeObjectInstance для дальнейшей работы.
                //Полученный объект имеет тип System.Windows.Forms.DataObject
                v := Obj1.InvokeMethod("Get_Data"New Variant[0]);
                Obj2 := Run.VariantToObject(v) As IForeNETRuntimeObjectInstance;
                //Выполняем метод IDataObject.GetData для получения данных
                //в формате P4_CONTROL
                v := Obj2.InvokeMethod("GetData""P4_CONTROL");
                Obj3 := Run.VariantToObject(v) As IForeNETRuntimeObjectInstance;
                //Помещаем полученный объект в поток и преобразуем с помощью метода
                //ReadParams для использования в Fore
                EventParams := DragDrop.ReadParams(Run.ObjectToStream(Obj3));
                //Устанавливаем полученные данные в качестве текста
                //компонента RichTextBox
                RichObj.InvokeMethod("set_Text", EventParams.Data);
        End Select;
    End Sub NetControlBox1OnEvent;

End Class TESTForm;

При создании формы в компонент «NetControlBox1» будет загружен  .NET-компонент RichTextBox. RichTextBox будет подписан на обработку двух событий: DragOver - наступает при перетаскивании данных над компонентом; DragDrop - наступает после окончания перетаскивания данных в области компонента. В событии OnEvent написаны два обработчика для событий компонента RichTextBox. Процесс перетаскивания инициализируется при попытке перемещения вершины в компоненте «TreeList1». В качестве переносимых данных будет использоваться текст сфокусированной вершины. При прохождении курсора в области компонента «RichTextBox» будет произведена проверка переносимых данных. При окончании переноса в области компонента «RichTextBox» текст, полученный из аргумента события, будет установлен в качестве текста компонента.

См. также:

IDragDrop