RUS  ENG 

Подключение пользовательских надписей в C++Builder

Страницы: 1
RSS
Подключение пользовательских надписей в C++Builder
 
Здравствуйте!
Вопрос такой:
При подключении надписей к слою их можно выводить в несколько строк.
Можно ли так вывести программно пользовательскую надпись?
Пробовала "\n" и вариации на тему - нет эффекта.
 
Добрый день. Если речь идет о методе SetLabel, то добавим многострочность.
Кстати, при выводе надписей многострочность - следствие возможности вывода разных полей в разных строчках, а одно поле тоже многострочно не вывести.
 
1. В данном случае я имела в виду событие OnDrawUserLabels и метод DrawElemIDLabel. Там ведь выводится текст независимо от полей. А можно ли программно получить стандартный текст надписи, которую я перекрываю?
2. В методе SetLabel вроде можно делать перенос строк, но я его не проверяла. Кстати, этот метод создает надпись без привязки к элементу и слою? А как ее можно потом убрать?
 
1. DrawElemIDLabel выводит текст не независимо, а в соответствии с текущим шаблоном бирок. Можно создать шаблон, например, из пяти полей, каждое на своей строке. И выводить свой текст как
"Строка1\tСтрока2\tСтрока2\tСтрока4\tСтрока5" Пока так.
Текст перекрываемой надписи не получить, т.к. стандартные надписи перекрываются все сразу установкой UserLabel = TRUE и при построении даже не извлекаются.
2. В SetLabel подправил многострочный вывод. Убрать с экрана можно только перерисовкой карты.
 
Спасибо за "\t" - получилось.
Теперь возникла другая проблема - надо найти элемент в слое по ключу:
try {
Element* el = zmpMain->Map->Layers->Active->Elements->get_Item(key);
} catch(...) {
//обработка
}

Если ключ существует, все нормально, но если нет - выводится грозное сообщение:

HRCHECK
(this->get_Item(Key,(Zululib_tlb::IElement**)&pVal))Error:80040500(-2147220224)
@c:\program files\borland\cbuilder6\Imports\ZuluLib_TLB.h/2393
Press [Y]es to terminate, [N]o to continue and [C]ansel to Debug
Да Нет Отмена


Если выбрать Нет - идем дальше, Да - попадаем в catch
А как сделать, чтобы сообщение не появлялось совсем?

Я проверяла в VisualBacic, эта ошибка вполне перехватывается On Error...:
"ZuluLib exception caught with code 768"

Что вы мне можете посоветовать?

ps
Заглянула в указанный файл, там:

#if !defined(__TLB_NO_INTERFACE_WRAPPERS)

Zululib_tlb::IElement* __fastcall get_Item(long Key)
{
Zululib_tlb::IElement* pVal;
OLECHECK(this->get_Item(Key, (Zululib_tlb::IElement**)&pVal));
return pVal;
}

может, надо просто где-то #define (__TLB_NO_INTERFACE_WRAPPERS) ?
 
Это сообщение выдает С++Builder в отладчике. Так же как и сообщения о всяких exception, оно не отключается. catch'ем она потом перехватывается. Если просто #define (__TLB_NO_INTERFACE_WRAPPERS), то никаких строк типа zmpMain->Map->Layer и т.п. написать уже нельзя будет, а только так - zmpMain->get_Map(&Map); Map->get_Layers(&Layers); ...
Чтобы сообщение не возникало, строчку можно переписать так:
Element* el = NULL;
zmpMain->Map->Layers->Active->Elements->get_Item(key, &el);
if( el != NULL )
{
// делаем что-то
}
Надо также иметь в виду, что Map->Layers->Active может вернуть NULL, если слоев в карте нет.
catсh(...) весьма опасная конструкция - может скрыть серьезную ошибку.
 
Спасибо!!!
Теперь работает корректно. И, кстати, то сообщение выдавалось не только в отладчике (это можно пережить), а уже в exe-шнике.
И еще на эту же тему: Функция get_Item() и аналогичные возвращают указатель на объект Zulu. После использования объекта надо потом во всех случаях освобождать занимаемую им память методом Release()?
 
Да, Release() обязательно нужно вызывать! Единственное исключение - это когда используются т.н. smart pointers , объекты, которые сами вызывают Release() в своем деструкторе. Но в нашем случае (Element *el) это не он.
Страницы: 1