• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Вертикальный текст в таблице

Автор redfox, 12.08.13, 21:29:15

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

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

Sprinter500

Ух-ты как сложно! Я бы в жизнь не догадался. Вынесу этот участок в отдельную процедуру. Спасибо большое!!! Буду пробовать. Если без проблем заработает, то останется только разобраться проблему подключения IKompasDocument2D1 и с вытаскиванием таблицы из массива SAFEARRAY

Sprinter500

Sabahs, если не трудно, пожалуста выложи полный текст процедуры - чтобы все объявление посмотреть и чем заканчивается.

+ Благодарностей: 1

Sprinter500

Организвал так:
...
                                     if pCellText.Str<>'@' then MATR[RW-RW1,CL-CL1]:= pCellText.Str
                                     else MATR[RW-RW1,CL-CL1]:= READVERTICAL(pCellText); //Вызов процедуры в случае нечитаемости текста
...
//Сама процедура:
function READVERTICAL(pText : IText): widestring;
var
I,J,K : integer;
S : Widestring;
pText1 : IText;
pTextLine1:ITextLine;
pTextItem:ITextItem;
begin
  I:=pText.Count;
  Dec(I);
  S:='';
  while I<>-1 do
    begin
      pTextLine:=pText.TextLine;
      if pTextLine<>nil then
        if pTextLine.TextLineType=ksTLVerticalText then pText1:=pTextLine.TextLineData as IText;
          if pText1<>nil then
            begin
              K:=pText1.Count;
              Dec(K);
              while K<>-1 do
                begin
                  pTextLine1:=pText1.TextLine[K];
                  if pTextLine1<>nil then
                    begin
                      S:=S+pTextLine1.Str;
                      J:=pTextLine1.Count;
                      Dec(J);
                      while J<>-1 do
                        begin
                          pTextItem:=pTextLine1.TextItem[J];
                          if pTextItem<>nil then S:=S+pTextItem.Str;
                          Dec(J);
                        end;
                    end;
                  Dec(K);
                end;
            end;
         Dec(I);
    end;
  result:= S;
end;

Sprinter500

Код рабочий, но есть одно маленькое НО, даже смешное: текст выводится двойной (например было '123' а вывелось '123123'. Сейчас буду разбираться почему :)

Sprinter500

Еще уточнение: в таблице вертикально написано 'стальной лист' в две строки, выводит 'листлистстальнойстальной'. Разибираюсь ...
Предыдущий пример про 123 был в одну строку.

S:=S+pTextLine1.Str; убери строку, код элементарный.
+ Благодарностей: 1

Sprinter500

Для правильного порядка надо: S:=S+pTextLine1.Str  и S:=pTextItem.Str+S;
Вопрос к Sabahs - понял что надо убрать S:=S+pTextLine1.Str . А изначальная задумка использования:

                     while J<>-1 do
                        begin
                          pTextItem:=pTextLine1.TextItem[J];
                          if pTextItem<>nil then S:=S+pTextItem.Str;
                          Dec(J);
                        end;
                    end;

и
                  if pTextLine1<>nil then
                    begin
                      S:=S+pTextLine1.Str;
                      J:=pTextLine1.Count;
                      Dec(J);


какая?
Не выйдет ли потом боком отказ от чего то? Можешь рассказать вкратце о назначении каждого блока?


Sprinter500

Хотел сказать что будет если оставлю только:
                  if pTextLine1<>nil then                      S:=pTextLine1.Str+#13+#10+S;

Это тоже работает и меньше кода. Только не понятно на какие грабли наступаю

Sprinter500

Или оставлю только:
                  if pTextLine1<>nil then
                    begin
                      J:=pTextLine1.Count;
                      Dec(J);
                      while J<>-1 do
                        begin
                          pTextItem:=pTextLine1.TextItem[J];
                          if pTextItem<>nil then S:=pTextItem.Str+#13+#10+S;
                          Dec(J);
                        end;

Что будет и то и то работает по отдельности. В справке все настолько сухо, что чайнику такому как я непонятно.
Вам, Sabahs, огромная благодарность за помощь!!!!!  Когда там конкурс среди форумчан, буду голосвать за Вас!!!
Как кстати лучше обращаться на ВЫ или на ТЫ ? :)
                    end;

Разница в том, что текст состоит из строк, строка может содержать разный текст, жирный, курсив, разный шрифт и т.д.
В справке вполне понятно написано.
+ Благодарностей: 1

Sprinter500

Кажется понял, если не нужно вытаскивать составляющие строки по отдельности для их раздельной обработки, то можно брать строку целиком. В любом случае код с чтением по составляющим возможно пригодится в будущем. В любом случае наша с Вами беседа полезна не только для меня, но и для всех читающих эту ветку, в т.ч чайникам. Так как в справке по API не хватает "жизненных" примеров, и поймет ее сразу только высококлассный специалист. Спасибо Вам!

Sprinter500

Я в таблице организовывал чтение ячеек по номеру строки и столбца. Тут пришла мысль: возможно ли чтение необходимых ячеек рчным выделением или предварительно выделенного диапазона ячеек? Если да, то через ISelectManager ? Я конечно еще не разобрался в причине нежелания интерфейса iKompasDocument2D1 подключаться. Но думаю вот-вот решу эту проблему. Поэтому сразу заглядываю вперед. В общем если  считывание выделенных ячеек возможно, то как?

Тут экспериментировать нужно, т.к. таблица сама сложный составной объект, не считая, что ячейка может тоже содержать составные объекты, нужно смотреть, что выдаст ISelectManager в массив.

Sprinter500

Sabahs, у тебя какая версия КОМПАСа ? У меня 13-ая. Я тут решил 30-дневку 15-й версии постаить, даже в ней твой пример выдает "Interface not supported" . Может дело в Delphi, где-нибудь какую-нибудь галочку надо поставить или что то в этом духе?

P.S. Программы,написанные на Delphi на API7, успешно работавшие на 13-ке, вдруг престали работать - даже при старте выдается то же "Interface not supported". Проги на API5 написанные на VB работают на ура. Речь про 32-битку. Походу что то поменялось в API7 что даже подключаться как следует не хочет - создается теневой процесс Компаса при запущенном.

P.P.S Кстати не знаешь почем проги компилированные Delphi весят так много - у меня приложение 12МБ, то же самое с VB - около 0,1 МБ.? Это как-то решается?

V15 и V13 отличаются, модули Компаса на новые заменили?
Версия Компаса у меня, всегда самая последняя.

Sprinter500

Конечно заменил. API7 конечно вещь хорошая, но ненадежная. Вообще может я что то упустил, в плане подключения модулей? Как все надо правильно делать?

Я ненадёжности API7 не замечал, работает надёжно на все 100%.
Из последнего прикрепленного проекта - винегрет, иначе я назвать не могу, по убирать все модули Компаса оставив ksApi7 и ksConstTLB, модуль ksAuto вообще не должен подключаться для exe, иначе потянет все dll Компаса, т.е. модули должны подключаться только те, что нужны. По убирать в проекте все лишние объявленные переменные и работать на нормальных интерфейсах, а не Disp-интерфейсах.
Где в Unit1 используются подключенные модули Компаса, зачем они там?
+ Благодарностей: 1

Sprinter500

Щас попрбовал запустить программу (которая не хотела работать на 30-дневках 14-й и 15-й под Win8) на компе с 14-й версией но под Win7 - на удивление никаких ошибок. Может проблема в том что на компе где Delphi установлена Win8 ? Как решить эту проблему если дело в этом, без переустновки винды или Delphi на Win7?

На счет винегрета - почищу - посмотрю что получится.