Получение текста с линии обозначения позиции

Автор Lex1, 09.02.07, 11:05:15

« предыдущая - следующая »

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

Lex1

Всем добрый день.
Требуется совет по получению строк текста с линии обозначения позиции.
Цель следующая: это считать с выноски текст, сравнить его с базой данный и заменить на другой.
Попытался разобраться - в итоге дошёл до того, что могу найти саму линию выноски и менять её координаты, но не более. Как считать с этой линии текст и заменить его?

Bordes

Откуда все-таки надо читать текст :?:  Из линии-выноски или из обозначения позиции :?:

В любом случае надо сначала добраться до составляющих текстовую строку Item-ов, в которых уже и можно изменить текст

Judzhin

Методом ksDocument2D::ksGetObjParam  получите параметры объекта. Для объекта выноска-позиция это интерфейс ksPosLeaderParam. Из это структуры читайте/изменяйте текст (методы GetpTextline и SetpTextline).

Lex1

Подскажите по-подробнее.
Я с апи работаю впервые. Я получаю сам идентификатор линии выноски:
GetObjParam(pObj, 0, 0, 0)=21
Имею pObj в котором ссылка на линию обозначения позиции, что мне дальше с ней делать?
НакидайтЕ примерную последовательность команд. Буду очень признателен.

Judzhin

Это должно вам помочь:

procedure  LIBRARYENTRY( comm__ : Word  );  pascal;
var
  linePar   : TextLineParam;
  itemPar   : TextItemParam;
  info      : RequestInfo;
  x, y      : Double;
  _type     : Integer;
  pObj      : Reference;
  p         : Reference;
  count,  i : Integer;
  comm      : Integer;
  param: PosLeaderParam;
begin
  FillChar( info, sizeof(info), 0 );
  info.prompt := 'Укажите выноску-позицию';
  comm := ksCursor( Addr(info), x ,y, nil );
  if ( comm <> 0 ) then
  begin
    pObj := FindObj( x, y, 10 );
    if ( ExistObj(pObj) > 0 ) then
    begin
     _type := GetObjParam(  pObj, addr(param), sizeof(param), ALLPARAM );
      if ( _type = POSLEADER_OBJ ) then
      begin
          p := param.pText;
          count := GetArrayCount(p);
          for i := 0 to count - 1 do
          begin
              GetArrayItem(p, i, Addr(linePar), sizeof(linepar));
              GetArrayItem( linepar.pTextItem, 0, Addr(itemPar), sizeof(TextItemParam) );
              if ( StrLen( itemPar.s ) > 0) then
              begin
                StrCat(itemPar.s, '0');
                SetArrayItem(linePar.pTextItem, 0, Addr(itemPar), sizeof(TextItemParam));
                ksMessage(itemPar.s);
              end;
            SetArrayItem(p, i, Addr(linePar), sizeof(linepar));
          end;
          SetObjParam(pObj, Addr(param), sizeof(param), ALLPARAM);

      end else
        Error( 'это не выноска-таблица' );
    end else
      Error( 'нет объекта' );
  end;

end;

Текст на паскале. Думаю легко разберетесь и адаптируете для своего случая.

Bordes

Здесь:
Цитата: Judzhin от 09.02.07, 13:10:42
Это должно вам помочь:

procedure  LIBRARYENTRY( comm__ : Word  );  pascal;
......
end;

Текст на паскале. Думаю легко разберетесь и адаптируете для своего случая.



Практически все, что надо. Еще только надо учесть вот эти тонкости:
1. SDK.hlp, PosLeaderParam
unsigned short   style   стиль текста,
   если style = 0, то стиль умолчательный,
   если style = INDICATIN_TEXT_LINE_ARR,  то pText - массив TEXT_LINE_ARR
***

reference   pText   динамический массив строк:
   если style = INDICATIN_TEXT_LINE_ARR, то TEXT_LINE_ARR,
   если style - другой, то CHAR_STR_ARR

2. Если pText - TEXT_LINE_ARR, то в нем может быть и не один TextItem (т.к. в данном случае рText массив TextItem-ов), т.е. чтобы достать из данной строки все куски текста, их можно так же в цикле получить, как и TextLineParam.