Высота Firemonkey TSpinBox

Я использую C++ Builder 10.3, и мое приложение предназначено для Android. Обратите внимание, что я новичок в C++ Builder.

Я пытаюсь изменить размер и высоту шрифта TSpinBox, но не могу изменить высоту.

Я изо всех сил пытался портировать следующее решение Delphi
Firemonkey TEdit height, но без радости, и я Я полный проигрыш. AdjustFixedSize объявлен закрытым, я не думаю, что его переопределяют, я также пытался создать сеттер и вызвать его, но снова мне не удалось заставить его работать. Самая большая проблема, с которой я столкнулся, это отсутствие знаний C++ Builder.

Заголовок

class TMySpinBox : public TSpinBox{

public:
protected:
virtual void AdjustFixedSize(const TControl Ref) ;

};

Цена за тысячу показов

TMySpinBox::TMySpinBox() : TSpinBox(0){};
void TMySpinBox::AdjustFixedSize(const TControl Ref){
  SetAdjustType(TAdjustType::None);

Код

TMySpinBox* SpinBox1 = new TMySpinBox();

SpinBox1->ControlType=TControlType::Platform;
SpinBox1->Parent=Panel1->Parent;
SpinBox1->Position->Y=16.0;
SpinBox1->Position->X=16.0;
SpinBox1->Min=2;
SpinBox1->Max=99;
SpinBox1->Font->Size=48;
SpinBox1->Visible=true;
SpinBox1->Value=2;

SpinBox1->Align=TAlignLayout::None;
SpinBox1->Height=100;
Width=100;

person Anthony Higgins    schedule 30.04.2020    source источник
comment
Нет необходимости создавать подкласс TSpinEdit. Вы можете изменить его свойство Height непосредственно в дизайнере или в коде. Чтобы изменить размер шрифта, вам нужно удалить Size из TSpinEdit->StyledSettings. То же самое для Family, Style и FontColor, если вы хотите их изменить. См. этот ответ на аналогичный вопрос для правильного синтаксиса, если вы хотите внести эти изменения в код.   -  person Tom Brunberg    schedule 01.05.2020
comment
@TomBrunberg Если платформа установлена ​​​​на Windows, я могу без проблем изменить высоту в дизайнере и в коде, но установка платформы на Android в дизайнере после изменения значения высоты просто возвращается к значению по умолчанию, а SpinBox1-> Height=100 также не влияет.   -  person Anthony Higgins    schedule 01.05.2020
comment
@TedLyngmo мои навыки C ++ очень ограничены, я пытаюсь переопределить метод AdjustFixedSize элемента управления, я просто не уверен, как это сделать.   -  person Anthony Higgins    schedule 01.05.2020
comment
Да, действительно, для Android это действительно сложно сделать. Я вернусь к этому вопросу позже сегодня, если я найду какое-либо решение.   -  person Tom Brunberg    schedule 01.05.2020
comment
@TomBrunberg Возможно, я поступаю неправильно, и сейчас я в полной растерянности, поэтому любые идеи будут более чем приветствуются.   -  person Anthony Higgins    schedule 01.05.2020


Ответы (1)


Я попробовал и переместил несколько вещей - в основном в конструктор настроенного TSpinBox. Я пропустил использование AdjustFixedSize, так как это не кажется необходимым.

myspinbox.h

#ifndef myspinboxH
#define myspinboxH
//---------------------------------------------------------------------------
#include <FMX.SpinBox.hpp>

class TMySpinBox : public TSpinBox {
protected:
    // The correct signature but commented out since I didn't use it:
    //void __fastcall AdjustFixedSize(TControl* const ReferenceControl) override;
public:
    // C++ Builder constructors can be virtual and override which is not
    // standard C++. This is afaik only important if you make a custom component
    // to integrate with the IDE to support streaming it, but I'll make it
    // virtual anyway.

    // This component sets Owner and Parent to the same component. You can change that if
    // you'd like to keep them separate.
    virtual __fastcall TMySpinBox(Fmx::Types::TFmxObject* OwnerAndParent);
};

#endif

myspinbox.cpp

#pragma hdrstop

#include "myspinbox.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

__fastcall TMySpinBox::TMySpinBox(Fmx::Types::TFmxObject* OwnerAndParent) :
    TSpinBox(OwnerAndParent) // set owner
{
    // set properties
    this->Parent = OwnerAndParent;

    this->Position->Y = 16.0;
    this->Position->X = 16.0;
    this->Min = 2;
    this->Max = 99;
    this->Value = this->Min;

    this->Height = 100;
    this->Width = 100;

    // Remove the styled setting for Size to enable setting our own font size
    this->StyledSettings >>= Fmx::Types::TStyledSetting::Size;

    this->Font->Size = 48;
}

Код

// Let Panel1 own and contain the spinbox and destroy it when it itself is destroyed

TMySpinBox* SpinBox1 = new TMySpinBox(Panel1);

Отказ от ответственности: протестировано только на Windows

person Ted Lyngmo    schedule 06.05.2020
comment
Большое спасибо за код и комментарии, многому научился. К сожалению, я все еще не могу работать на Android. Если вы используете книгу стилей, вы можете заставить ее работать, установив для SetAdjustType и Align значение None, по крайней мере, теперь, используя ваш подход, я могу перейти к частным функциям, и я чувствую себя ближе к решению. огромное спасибо. - person Anthony Higgins; 11.05.2020