Как перевести код VB в C# CLI

Автор Борис_С, 22 декабря 2021, 18:32

0 Пользователи и 1 гость просматривают эту тему.

Борис_С

Всем доброго дня!
Есть такой код на VB:

oTCurs = ThisComponent.Text.createTextCursor()
ThisComponent.CurrentController.select(oTCurs) 
oVCurs = ThisComponent.CurrentController.getViewCursor()

Он позволяет сформировать визуальный курсор в том месте, где находится текстовый.
Мне нужно перевести этот код в код на C# CLI.
Попробовал воспользоваться MRI.
MRI сформировал такой код:

Sub Snippet
  Dim oText As Variant
  Dim oObj1 As Variant
  Dim oCurrentController As Variant
  Dim oObj2 As Boolean

  oText = ThisComponent.getText()
  oObj1 = oText.createTextCursor()
  oCurrentController = ThisComponent.getCurrentController()
 
  oObj2 = oCurrentController.select(getCurrentController())
End Sub

На C# это выглядит так:

using System;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.text;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.view;

public class Snippet {
public void snippet(XComponentContext xContext, object oInitialTarget)
{
try
{
XTextDocument xTextDocument = (XTextDocument) oInitialTarget;
XText xText = xTextDocument.getText();

XSimpleText xSimpleText = (XSimpleText) xText;
XTextCursor xTextCursor = xSimpleText.createTextCursor();

XModel xModel = (XModel) oInitialTarget;

XController xController = xModel.getCurrentController();

XSelectionSupplier xSelectionSupplier = (XSelectionSupplier) xController;

bool bselect = xSelectionSupplier.select(getCurrentController());

}
catch (IllegalArgumentException e)
{
// select
Console.WriteLine(e.Message);
}
}

C# ругается на оператор
bool bselect = xSelectionSupplier.select(getCurrentController());

В справке по API пишут, что оператор Select должен иметь такой параметр: [in] any    xSelection
Буду признателен за любую помощь.

sokol92

Добрый день! Вы в тексте MRI потеряли getViewCursor.
Владимир.

mikekaganski

Цитата: Борис_С от 22 декабря 2021, 18:32
Есть такой код на VB:

oTCurs = ThisComponent.Text.createTextCursor()
ThisComponent.CurrentController.select(oTCurs) 
oVCurs = ThisComponent.CurrentController.getViewCursor()

...
MRI сформировал такой код:

Sub Snippet
  Dim oText As Variant
  Dim oObj1 As Variant
  Dim oCurrentController As Variant
  Dim oObj2 As Boolean

  oText = ThisComponent.getText()
  oObj1 = oText.createTextCursor()
  oCurrentController = ThisComponent.getCurrentController()
 
  oObj2 = oCurrentController.select(getCurrentController())
End Sub


Вы неправильно определили аргумент для вызова select. В исходном коде туда передаётся oTCurs - результат, полученный от createTextCursor. У Вас этот результат сохранён в oObj1, а в select Вы отправили getCurrentController().
С уважением,
Михаил Каганский

Борис_С

#3
При вызове метода Select появляется окошко, в котором нужно ввести входной аргумент.
Я нажимаю на кнопку 3 точки, а далее выбираю interface. Далее выбираю строчку CreateTextCursor() и получаю код.

bool bselect_2 = xSelectionSupplier.select(createTextCursor());

но это тоже неверно.
М.б. нужно как-то иначе.


mikekaganski

Цитата: Борис_С от 22 декабря 2021, 19:35При вызове метода Select появляется окошко, в котором нужно ввести входной аргумент.
Я нажимаю на кнопку 3 точки

Не нажимайте, а введите прямо oObj1.
С уважением,
Михаил Каганский

Борис_С

Я это сделал. Код не изменился.

Борис_С

Разобрался. Вот код:

using System;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.text;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.view;

public class Snippet {
public void snippet(XComponentContext xContext, object oInitialTarget)
{
try
{
XTextDocument xTextDocument = (XTextDocument) oInitialTarget;
XText xText = xTextDocument.getText();

XSimpleText xSimpleText = (XSimpleText) xText;
XTextCursor xTextCursor = xSimpleText.createTextCursor();

XModel xModel = (XModel) oInitialTarget;

XController xController = xModel.getCurrentController();

XSelectionSupplier xSelectionSupplier = (XSelectionSupplier) xController;

bool bselect = xSelectionSupplier.select(new uno.Any(typeof(XTextCursor), xTextCursor));

}
catch (IllegalArgumentException e)
{
// select
Console.WriteLine(e.Message);
}
}