Цвет текста в ячейке таблицы

Автор Sprinter500, 22.09.14, 20:21:52

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

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

Sprinter500

Добрый день! Пробую получить цвет текста в ячейке таблицы. В SDK написано что надо получить интерфейс ITextFont из интерфейса ITextitem. Но ITextFont не значится в списке членов ITextitem. Поэтому пробую получить через "as", но вылазит ошибка. Подскажите где я ошибся и как надо правильно (в примере кода - функция, она получает переменную тип IText):

function GetColorOfText(pText3 : IText): long;
var
I : integer;
ResCLR: long;
pTextLine3:ITextLine;
pTextItem3:ITextItem;
pTextFont3:ITextFont;
begin
  I:=pText3.Count;
  Dec(I); ResCLR:=0;
  while I<>-1 do
    begin
      pTextLine3:=pText3.TextLine;
      if pTextLine<>nil then pTextItem3:=pTextLine3.TextItem[0];
      if pTextItem3<>nil then pTextFont3:=pTextItem3 as ITextFont;
      ResCLR:= pTextFont3.Color;
      if ResCLR>0 then ShowMessage('Цвет: '+inttostr(ResCLR)+' '+inttostr(pText3.Count)+' '+inttostr(I));
      Dec(I);
    end;
  Result:= ResCLR;
end;


P.S. Все остальное жизненно-необходимое задано ранее.

Для начала, неплохо индекс указать pTextLine3:=pText3.TextLine[0];
Какая ошибка и после какой строки?

Sprinter500

1. Не знаю как так из буфера обмена вставилось сюда, но у меня был задан индекс, правда не ноль а I.
2. Ошибка в выделенной жирным строке.
3. First chance exception at $005EC125. Exception class $C0000005 with message 'access violation at 0x005ec125: read of address 0x00000000'. Process XXXXX.exe (752)

Sprinter500

Немного поправил код - сделал условия вложенными - теперь конечно не выкидывает с ошибкой, но и ничего не возвращает, так как
pTextItem3 = nil.

function GetColorOfText(pText3 : IText): long;
var
I : integer;
ResCLR: long;
pTextLine3:ITextLine;
pTextItem3:ITextItem;
pTextFont3:ITextFont;
begin
  I:=pText3.Count;
  Dec(I); ResCLR:=0;
  while I<>-1 do
    begin
      pTextLine3:=pText3.TextLine;
      if pTextLine<>nil then
        begin
          pTextItem3:=pTextLine3.TextItem[0];
          if pTextItem3<>nil then
            begin
              pTextFont3:=pTextItem3 as ITextFont;
              if pTextFont3<>nil then
                begin
                  ResCLR:= pTextFont3.Color;
                  if ResCLR>0 then ShowMessage('Цвет: '+inttostr(ResCLR)+' '+inttostr(pText3.Count)+'  '+inttostr(I));
                end;
            end;
        end;
      Dec(I);
    end;
  Result:= ResCLR;
end;

Sprinter500

Еще внес изменения:

function GetColorOfText(pText3 : IText): long;
var
I : integer;
ResCLR: long;
pTextLine3:ITextLine;
pTextItem3:ITextItem;
pTextFont3:ITextFont;
begin
  I:=pText3.Count;
  Dec(I); ResCLR:=0;
  ShowMessage('a');
  while I<>-1 do
    begin
      pTextLine3:=pText3.TextLine;
      ShowMessage('b');
      if pTextLine<>nil then
        begin
          pTextItem3:=pTextLine3.TextItem[0];
          ShowMessage('c');
          if pTextItem3<>nil then
            begin
              pTextFont3:=pTextItem3 as ITextFont;
              if pTextFont3<>nil then
                begin
                ShowMessage('d');
                  ResCLR:= pTextFont3.Color;
                  ShowMessage('Цвет: '+inttostr(ResCLR)+' '+inttostr(pText3.Count)+'  '+inttostr(I));
                end;
            end;
        end;
      Dec(I);
    end;
  Result:= ResCLR;
end;


Сообщения выводятся только по уровень 'b'. Значит я не прав и ошибка чуть ранее в строке:
pTextLine3:=pText3.TextLine[0];   //

if pTextLine<>nil then поменяйте на if pTextLine3<>nil then
+ Благодарностей: 1

Sprinter500

 :-)))

Ларчик просто открывался. Заработался видать сегодня )))) Спасибо. Жаль, что тему открыл. Думал что с интерфейсами ошибся - сразу не ждал что с наскоку попаду, а ошибся в другом. )

Sprinter500

Что то у меня обратная операция придания цвета тексту ячейки не срабатывает. Операцию pDrawTable.Update провожу. Но цвет текста остается неизменным. Аварйино ничего не завершается, никакие ошибки не вылазят - просто ничего не происходит.

Аналогично и с остальными свойствами в ITextFont. В SDK сказоно что свойства в ITextFont можна как считывать так и задавать.

Может я чего-то не учел? Например какой-нибудь аналог операции pDrawTable.Update нужен?

Если нужен пример кода то выложу вечером - после 18.00 (мск).

Какое отношение pDrawTable.Update имеет до текста?

Sprinter500

Ну работа же с таблицей - вызывается процедура (либо функция), которая работает только по настройкам шрифта, для каждой ячейки, а потом pDrawTable.Update.


Щас пробежался еще раз по SDK  -  в ITextItem есть метод Update. Наверно его надо использовать для настроек шрифта. ITextFont Как то ранньше не заметил его наличие. Вечером попробую, отпишусь что получится.

Вы меняете ITextItem, поэтому его в первую очередь нужно обновить.
+ Благодарностей: 1

Sprinter500

Да именно это и надо было добавить. Теперь все работает.

dosart

Вопрос не в тему, но вдруг. Как отобразить в тексте непечатные символы, а именно символы греческого алфавита. Например, альфа, бета и т.д.

Slaviation

ЦитироватьВопрос не в тему, но вдруг. Как отобразить в тексте непечатные символы, а именно символы греческого алфавита. Например, альфа, бета и т.д.
Пример на Python.
+ Благодарностей: 1

ТрындецЪ

Цитата: Slaviation от 27.09.17, 14:22:27
Пример на Python.
Не у всех этот шрифт есть в системе.
Может, лучше из таблицы спецсимволов?
+ Благодарностей: 1

Slaviation

ЦитироватьМожет, лучше из таблицы спецсимволов?
Вполне.
+ Благодарностей: 1

dosart

Спасибо за ответы.
Как можно поставить верхний и нижний индекс?

ТрындецЪ

Цитата: dosart от 28.09.17, 16:23:21
Как можно поставить верхний и нижний индекс?
Ищите в справке КОМПАС-3D (не SDK!) по запросу "управляющие символы".


Slaviation

ЦитироватьКак можно поставить верхний и нижний индекс?
В приложении пример создания таблицы. Цветные греческие буквы - спецзнаками, верхний и нижний индексы.
+ Благодарностей: 2