Как выводить текст

Автор Борис_С, 29.10.18, 16:06:47

« назад - далее »

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

Борис_С

Всем доброго дня!

Столкнулся с такой проблемой. Вывожу текст с помощью такой процедуры.

function DrawDocText(Text: string; CurX, CurY, FontSize: Double;
                  bBold: Boolean; FontColor: TColor; Angle: Double): Reference;
begin
  try
    par.Init;
    with par do
    begin
      x := CurX; //левая верхняя точка
      y := CurY;
      height := FontSize; //высота
      width := 5; //ширина
      ang := Angle; //угол наклона текста
      //hFormat := 0;
    end;
    Doc[NumDoc].ksParagraph(par); //создаем абзац

    itemParam.Init;
    ItemParam.s := Text;

    itemFont.Init;
    with itemFont DO
    begin
      SetBitVectorValue(NEW_LINE, true);  //c новой строчки
      FontName:='Arial';
      Color := FontColor;   //цвет шрифта
      if bBold then
        SetBitVectorValue(BOLD_ON, true);
      SetBitVectorValue(ITALIC_OFF, true);
      Height := FontSize; //высота текста в мм
      ksu := 1;
    end;
    Doc[NumDoc].ksTextLine(itemParam); //выводим текст
    DrawDocText := Doc[NumDoc].ksEndObj;
  except
    on e:Exception do
    begin
       Screen.Cursor := crDefault;
       Application.MessageBox(PChar(e.message), 'ERROR', MB_OK OR MB_ICONERROR);
       Application.Terminate;
       exit
    end;
  end;
end;

Переменные
  par: ksParagraphParam;
  itemParam: ksTextItemParam;
  itemFont: ksTextItemFont;
создаю в начале программы
    par := ksParagraphParam( kompas.GetParamStruct(ko_ParagraphParam) );  // параметры абзаца
    itemParam := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam)); // параметры текста
    itemFont := ksTextItemFont(itemParam.GetItemFont); // параметры шрифта

В программе создаю несколько графических документов.
Для первых 3-х документов все работает нормально.
На 4-ом - ошибка на операторе  par.Init; Текст ошибки - "Параметр является обязательным."
Что бы это значило?
Буду признателен за любую помощь.

Лучше создавать эти переменные для каждого текста внутри функции.

Борис_С

Разобрался. Проблема была в другом.
Я определил переменную Doc: array[1..3] of ksDocument2D;
Для каждого нового документа инициализировалась
переменная   Doc[NumDoc] := ksDocument2D(kompas.Document2D);
NumDoc - номер документа
После того, как я превысил размерность этого массива программа вылетала.

Кстати, нельзя ли обойтись одной переменной ksDocument2D.
После формирования нового документа как-то ее чистить и далее использовать
для формирования следующего документа?

Переменная может быть и одна, но для каждого нового документа её нужно инициализировать.
+ Благодарностей: 1

Борис_С

Спасибо. Все работает.
А в конце работы программы надо как-то освобождать память?

Вы об этом писали, когда Вопросы задавали?
Что Вам нужно освободить, Вы не одной динамической переменной не показали?

Борис_С

  par: ksParagraphParam;
  itemParam: ksTextItemParam;
  itemFont: ksTextItemFont;
  Doc: ksDocument2D;
создаю
    par := ksParagraphParam( kompas.GetParamStruct(ko_ParagraphParam) );  // параметры абзаца
    itemParam := ksTextItemParam( kompas.GetParamStruct(ko_TextItemParam)); // параметры текста
    itemFont := ksTextItemFont(itemParam.GetItemFont); // параметры шрифта
   Doc := ksDocument2D(kompas.Document2D);

Эти переменные надо освобождать?

При закрытии программы сами освободятся.
+ Благодарностей: 1

Борис_С