Как стать автором
Обновить

Комментарии 11

Увы, ksGetTextLength даёт длину строки только с умолчательным шрифтом. Если шрифт/шрифты иной/иные, то работает некорректно.

Нужен минимальный тест, чтобы понять в чём проблема.

Какой тест? У этой функции только один параметр - это сам текст (ну ещё и стиль, но он здесь не при чём). Какой шрифт она при этом берёт? Естественно, умолчательный.

Тест - это ваша программа с этой функцией "ksGetTextLength", которая у вас не работает. Чтобы разработчики сразу могли проверить API на ваших данных. А то они скажут, что у них всё работает, а с тестом так просто отмазаться не получится))

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, ksTLB, LibTool, LIBdb, LDefin2D, LDefin3D, ksConstTLB,
  Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  procedure PrepareKompas;
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

var kompas:KompasObject;
Model: ksDocument3D;
Part: ksPart;
PlaneXY, Sketch: ksEntity;
SketchDefinition: ksSketchDefinition;
Document2D : ksDocument2D;
PlaneOffsetDefinition: ksPlaneOffsetDefinition;

procedure TForm2.PrepareKompas;
begin
Kompas:= KompasObject( CreateOleObject('Kompas.Application.5') );
Model:=ksDocument3D(kompas.Document3D());
Model.Create(FALSE,TRUE);
Part:=ksPart(Model.GetPart(pTop_Part));
end;

procedure TForm2.Button1Click(Sender: TObject);
var t1,t2:double;s:string;
begin
PrepareKompas;
PlaneXY:=ksEntity(Part.GetDefaultEntity(o3d_planeXOY));

Sketch:=ksEntity(Part.NewEntity(o3d_sketch));
SketchDefinition:=ksSketchDefinition(Sketch.GetDefinition());
SketchDefinition.SetPlane(PlaneXY);
Sketch.Create();
Document2D:=ksDocument2D(SketchDefinition.BeginEdit());

s:='^(Arial)A~';
t1:=Document2D.ksGetTextLength(s,1);

s:='^(Times New Roman)A~';
t2:=Document2D.ksGetTextLength(s,1);

Memo1.Lines.Add(FloatToStr(t1));
Memo1.Lines.Add(FloatToStr(t2));

SketchDefinition.EndEdit();
kompas.Visible:=True;
end;

end.

Пришлите ещё ссылку на архив с вашим проектом (можно в личку).

Ответили:

да, ksGetTextLength рассчитывает длину текста для умолчательных параметров.
Если нужно что-то другое, то нужно создавать полноценный текст и использовать ksGetTextLengthFromReference.

Ну да, так и вынужден делать. А потом удалять.

И, главное, что мне их ответ? Я это и без них знал. А надо сделать так, чтобы рассчитывалось правильно в любом случае.

Если при этом в самом тексте есть переключение шрифта, оно игнорируется. При этом ksGetTextLengthFromReference нормально работает, но приходится потом удалять не нужные объекты.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий