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

Mazzay

Пользователи
  • Постов

    58
  • Зарегистрирован

  • Посещение

Весь контент Mazzay

  1. А какие ещё способы проверки есть? Экранная клавиатура сама свернулась, так как на форме не стало полей для ввода текста. Но if (FService <> nil) and (TVirtualKeyboardState.Visible in FService.VirtualKeyBoardState) всё равно возвращает True.
  2. Во-во. А мне надо освободить память из-под объекта. Какие ещё ссылки на него, которые запомнил Владелец, обнулить?
  3. Или вот, в случае с Delphi: type TComponent = class(TPersistent, IInterface, IInterfaceComponentReference) private [weak] FOwner: TComponent; [weak] FOwner
  4. Кстати, в TComponent Owner объявлен как «unsafe». Почему тогда Create(Self) увеличивает счётчик ссылок дополнительно ещё на единицу? class PASCALIMPLEMENTATION TComponent : public TPersistent { ... private: __unsafe TComponent* FOwner; ... public: __property TComponent* Owner = {read=FOwner}; ... };
  5. Я и писал: Почему не нужно передавать указатель на себя потомку?
  6. Parent = NULL не могу. Мой объект — это компонент, который размещается на этом Parent. Можно сделать Owner = NULL, но это как-то, ИМХО, неправильно.
  7. Или как мне сделать, чтобы ссылок на объект не осталось, и он уничтожился? Этого недостаточно: bi->Parent = NULL;
  8. Выходит, без условной компиляции не обойтись? В деструкторах у меня уничтожаются все дочерние объекты, что в свою очередь должно убирать их с экрана, например. Писать вместо деструкторов функции типа «Hide», а память пусть остаётся занятой?
  9. bi->Parent = NULL; Если это вставить перед delete, как здесь описано, не помогает. Помогает, только если ещё и в конструкторе не указывать владельца «TPanel(NULL)», что не считаю нормальным: __fastcall TBoxItem::TBoxItem(TComponent* Owner, String fText) : TPanel(NULL) ////////////////// В результате остановился на таком варианте, но он мне тоже не нравится: bi->Parent = NULL; #if defined(__ANDROID__) || defined(__APPLE__) bi->DisposeOf(); #endif delete bi; bi = NULL;
  10. bi->Parent = NULL; Если это вставить перед delete, как здесь описано, не помогает. Помогает, только если ещё и в конструкторе не указывать владельца «TPanel(NULL)», что не считаю нормальным: __fastcall TBoxItem::TBoxItem(TComponent* Owner, String fText) : TPanel(NULL)
  11. Ничего не приходит на ум! Что я делаю не так? Под Windows delete вызывает деструктор, под Android — нет. Unit1.h #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <FMX.Controls.hpp> #include <FMX.Forms.hpp> #include <FMX.Controls.Presentation.hpp> #include <FMX.StdCtrls.hpp> #include <FMX.Types.hpp> //--------------------------------------------------------------------------- class TBoxItem : public TPanel { private: TLabel* tInfo; public: __fastcall TBoxItem(TComponent* Owner, String fText); __fastcall ~TBoxItem(); }; //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *ButtonNew; TButton *ButtonDelete; TLabel *LabelConstructor; TLabel *LabelDestructor; void __fastcall ButtonNewClick(TObject *Sender); void __fastcall ButtonDeleteClick(TObject *Sender); private: // User declarations TBoxItem *bi; public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif Unit1.cpp #include <fmx.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.fmx" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { bi = NULL; } //--------------------------------------------------------------------------- __fastcall TBoxItem::TBoxItem(TComponent* Owner, String fText) : TPanel(Owner) { Form1->LabelConstructor->Text = Form1->LabelConstructor->Text + " OK"; Parent = (TFmxObject*)Owner; tInfo = new TLabel(this); tInfo->Parent = this; tInfo->TextSettings->HorzAlign = TTextAlign::Center; tInfo->Align = TAlignLayout::Center; tInfo->Text = fText; Height = 32; Align = TAlignLayout::Bottom; } //--------------------------------------------------------------------------- __fastcall TBoxItem::~TBoxItem() { Form1->LabelDestructor->Text = Form1->LabelDestructor->Text + " OK"; delete tInfo; } void __fastcall TForm1::ButtonNewClick(TObject *Sender) { if(!bi) { bi = new TBoxItem(this, "BoxItem"); ButtonNew->Enabled = false; ButtonDelete->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TForm1::ButtonDeleteClick(TObject *Sender) { if(bi) { delete bi; // под Android деструктор не вызывается, объект не уничтожается (( bi = NULL; ButtonNew->Enabled = true; ButtonDelete->Enabled = false; } } //--------------------------------------------------------------------------- Windows (жму кнопку «new» — получаю «Constructor OK» и панель внизу экрана, жму «delete» — получаю «Destructor OK», панель удаляется) Android (жму кнопку «new» — получаю «Constructor OK» и панель внизу экрана, жму «delete» — «Destructor OK» не получаю, панель НЕ удаляется) C++Builder 10.2.3 Tokyo delete bi; не вызывает деструктор. ((
  12. Вызываю MessageDlg(text, TMsgDlgType::mtConfirmation, mbYesNo, 0, ACloseDialogProc); Под Windows на кнопках «Да» и «Нет». Под Android — «No» и «Yes». Как сделать по-русски?
  13. Собственно: for(int i = 0; i < ListView1->ControlsCount; ++i) if(dynamic_cast<TControl*>(ListView1->Controls->Items[i])->ClassNameIs("TSearchBox")) { dynamic_cast<TSearchBox*>(ListView1->Controls->Items[i])->Text = EmptyStr; break; }
  14. А ещё есть какие-нибудь варианты? C++Builder не поддерживает helper.
  15. Я к тому, что FGX установлен. Но объявления класса TfgToast нет ни в одном hpp-файле.
  16. Давно уже пользую TfgActivityDialog, но для TfgToast не нахожу объявления.
  17. Вот реальный пример, если кто не видел:
  18. Сделал выбор числа месяца скроллингом (как это реализовано на устройствах Apple). Для наглядности вот рабочий пример: https://youtu.be/F73fCMSlL7I. Но для красоты картины не хватает вывода заворачивающихся чисел в перспективе: Как сие реализовать?
  19. Многократное щёлканье получилось вот так. В объявлении класса: #ifdef __ANDROID__ _di_JAudioTrack audioTrack; TJavaArray__1<short>* samples; #endif В конструкторе: #ifdef __ANDROID__ samples = new TJavaArray__1<short>(1); samples->Items[0] = 0x0FFF; audioTrack = TJAudioTrack::JavaClass->init(TJAudioManager::JavaClass->STREAM_MUSIC, 11025, TJAudioFormat::JavaClass->CHANNEL_OUT_MONO, TJAudioFormat::JavaClass->ENCODING_PCM_16BIT, TJAudioTrack::JavaClass->getMinBufferSize(11025, TJAudioFormat::JavaClass->CHANNEL_OUT_MONO, TJAudioFormat::JavaClass->ENCODING_PCM_16BIT), TJAudioTrack::JavaClass->MODE_STREAM); #endif На событие: #ifdef __ANDROID__ audioTrack->write(samples, 0, 1); audioTrack->play(); audioTrack->stop(); #endif В деструкторе: #ifdef __ANDROID__ delete samples; #endif
  20. Спасибо большое! На Билдере получилось так: #include <AndroidApi.JNI.Media.hpp> void AndroidSound(double freqHz, int durationMs) { double Pi = 3.14159265358979323846; int count = (int)(44100.0 * 2.0 * (durationMs / 1000.0)) & ~1; TJavaArray__1<short>* samples = new TJavaArray__1<short>(count); for(int i = 0; i < count; i += 2) { short sample = (short)(Sin(2 * Pi * i / (44100.0 / freqHz)) * 0x7FFF); samples->Items[i + 0] = sample; samples->Items[i + 1] = sample; } _di_JAudioTrack audioTrack; audioTrack = TJAudioTrack::JavaClass->init(TJAudioManager::JavaClass->STREAM_MUSIC, 44100, TJAudioFormat::JavaClass->CHANNEL_CONFIGURATION_MONO, TJAudioFormat::JavaClass->ENCODING_PCM_16BIT, count * (sizeof(TJavaArray__1<short>) / 8), TJAudioTrack::JavaClass->MODE_STATIC); if(audioTrack->write((TJavaArray__1<short>*)samples, 0, count)) audioTrack->play(); delete samples; } Только при многократном вызове (у меня при прокрутке щёлкает звуком ScrollBox) получаю ошибку: Не пойму, почему. Сдаётся мне, переменную audioTrack надо как-то уничтожать. Хотя, это интерфейс…
  21. Приведённый здесь пример почему-то не обрезает выбираемые варианты звуков по длительности ADuration. uses AndroidApi.JNI.Media; procedure MakeSound(ADuration: Integer); var Volume: Integer; StreamType: Integer; ToneType: Integer; ToneGenerator: JToneGenerator; begin Volume := TJToneGenerator.JavaClass.MAX_VOLUME; // задаем громкость StreamType := TJAudioManager.JavaClass.STREAM_ALARM; ToneType := TJToneGenerator.JavaClass.TONE_DTMF_0; // тип звука ToneGenerator := TJToneGenerator.JavaClass.init(StreamType, Volume); ToneGenerator.startTone(ToneType, ADuration); end; Задаваемая длительность может только увеличить время воспроизведения, но не может уменьшить. Может есть какие-нибудь способы обрезать воспроизводимое?
  22. Не хочу добавлять компоненты и аудио-файлы в проект ради обычного воспроизведения коротенького щелчка. Никак не могу найти. Android API позволяет воспроизвести просто звук нужной длительности и частоты?
  23. Спасибо. Пригодилось.
×
×
  • Создать...