ReadParams(Source: Variant): IDragDropParams;
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» текст, полученный из аргумента события, будет установлен в качестве текста компонента.
См. также: