Перейти к содержанию
Fire Monkey от А до Я
  • 0

Помогите перевести код с Delphi на С++ по использованию TTextLayout


antarey

Вопрос

Руководствуясь темой (Как сделать автоматическое изменение высоты TListBoxItem под содержимое текста?) переделал код на C++Builder.

 

Unit1.h

public: // User declarations
  TTextLayoutClass *FTextLyoutClass;
  TTextLayout* FTextLyout;
Unit1.cpp
//---------------------------------------------------------------------------
void TForm1::CalculateItemHeight(TObject *Sender)
{
    TListBoxItem *ListItem=dynamic_cast<TListBoxItem*>(Sender);
    if (ListItem!=NULL)
    {
        FTextLyout->BeginUpdate();
        try {
            FTextLyout->Text = ListItem->Text;
            FTextLyout->MaxSize = TPointF(ListItem->Width, 1000);
            FTextLyout->WordWrap = ListItem->WordWrap;
            FTextLyout->Font = ListItem->Font;
            FTextLyout->HorizontalAlign = ListItem->TextAlign;
            FTextLyout->VerticalAlign = ListItem->VertTextAlign;
            ListItem->Height = FTextLyout->Height;
        } __finally {
            FTextLyout->EndUpdate();
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    FTextLyout = (TTextLayout*)(new TTextLayoutClass(TTextLayoutManager::DefaultTextLayout));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    FreeAndNil(FTextLyout);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBoxItem3ApplyStyleLookup(TObject *Sender)
{
    CalculateItemHeight(Sender);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBoxItem3Resize(TObject *Sender)
{
    CalculateItemHeight(Sender);
}
//---------------------------------------------------------------------------

И получаю ошибку:

post-49-0-64464500-1395846247_thumb.png

 

Это я не правильно переделал код или же глюк студии?

На офф. форуме тоже подымался етот вопрос - но к сожалению без ответов

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Администраторы

Описанная вами проблема в вашем коде:

FTextLyout = (TTextLayout*)(new TTextLayoutClass(TTextLayoutManager::DefaultTextLayout)); 

Абсолютно неправильно создаете объект TTextLayout. Нужно так:

TTextLayoutClass textLayoutClass = TTextLayoutManager::DefaultTextLayout;
TTextLayout* FTextLyout = TTextLayoutManager::TextLayoutForClass(textLayoutClass);

Но здесь есть два важных момента. Вообще создание экземпляра переменной классового типа (Delphi) возможность языка Delphi, а не С++.

И в С++ такой поддержки нету. Поэтому подобные создания объектов по делфовым классовым значениям (class of) выносят на сторону Delphi. Что в данном случае и сделано при помощи метода класса TextLayoutForClass. Которые и осуществляет создание объекта по делфовому классу.

 

TTextLayoutClass - это наследник от TMetaClass<> и по сути внутри себя держит указатель на делфи класс. поэтому обычным оператором new объект вы не создадите.

 

P.S. 32-битная версия компилятора С++ имеет ошибку, которая исправлена в XE6. 

Ссылка на комментарий
  • 0

К сожалению только один код

 

//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TTextLayoutClass textLayoutClass;
TTextLayout *FTextLyout;


textLayoutClass = TTextLayoutManager::DefaultTextLayout;
FTextLyout = TTextLayoutManager::TextLayoutForClass(textLayoutClass);


}
//---------------------------------------------------------------------------

все остальное заремил вызывает ошибку 

 

 

post-49-0-37332800-1395913264_thumb.png

post-49-0-46336800-1395913266_thumb.png

Ссылка на комментарий
  • 0
  • Администраторы

В моем коде - это ошибка 32-битного компилятора С++. В новой версии среды она уже устранена. Остальные компиляторы работают без ошибок (Win64, OSX, iOS). 

 

В вашем коде - ошибка кода.

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...