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

Kitty

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

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

  • Посещение

  • Победитель дней

    16

Сообщения, опубликованные Kitty

  1. Если кто разбирается одновременно и в Дельфи и в С++ Builder, объясните пожалуйста, что за ошибка и как это можно исправить?

    Установила этот компонент: http://www.flashavconverter.com/content/android-native-player-delphicbuilder-component

    В триал версии ограничение: Trial version does not support pause video. Мне в одном проекте надо воспроизводить видео без паузы по кругу, поэтому триал версия мне подходит.

    В C++ Builder XE 7 добавила путь к h файлам:

    C:\Users\Lena\Documents\Android_Player_Trial\Packages\XE7\Win32

    При попытке компиляции ошибка:

    TAndroidPlayer *AndroidPlayer1; <- тут

    [bccaarm Error] UnitPlayer.h(15): unknown type name 'TAndroidPlayer'

    [bccaarm Error] UnitPlayer.h(15): Fields defined in a '__published' block must be of type pointer to Delphi-style class

     

    Как это исправить? Спасибо.

  2. http://fire-monkey.ru/topic/479-ne-rabotaet-otladka/?p=3348

     

    Я все это сделала. На устройстве PIPO M7 Pro Android 4.4.2 (или также 4.2) отладка (точки останова) в С++ Builder не работает (RAD XE7 Up1).

    На других устройствах с Андроид не тестировала т.к. их у меня нет.

  3. Есть проблема - при смене ориентации экрана приложение просто закрывается.

     

    А у меня другая проблема. После вращения планшета программа перестает работать: http://fire-monkey.ru/topic/231-otklonenie-programma-ne-otvechaet-posle-vraschen/

    Помогает этот код:

    void __fastcall TForm1::FormResize(TObject *Sender)
    {
     Application->ProcessMessages();
     Sleep(5);
    }
    
  4. А если попробовать, как требует стандарт С++, оператор delete:

    buttonSub = Application->FindComponent("subButton"+IntToStr(i));
    if(buttonSub)
     {
      delete buttonSub;//проверить в точке останова, что попадаем в этот блок кода
      buttonSub = NULL;
     }
    //***
    

    ?

  5. В Андроиде есть свой MediaPlayer:

    http://developer.android.com/reference/android/media/MediaPlayer.html

    Подскажите, пожалуйста, как с его помощью запустить видео файл на воспроизведение зациклено по кругу?

    Хочется попробовать обойтись без стандартного компонента FMX TMediaPlayer.

    Дело в том, что компонент FMX TMediaPlayer не корректно работает на некоторых устройствах и имеет ряд других проблем:

    http://fire-monkey.ru/topic/330-tmediaplayer-ne-zapuskaet-video-v-nekotorykh-versiiakh-andro/

    http://fire-monkey.ru/topic/318-android-pri-zadanii-novogo-video-faila-tmediaplayer-u-menia-vyval/

     

    Спасибо.

  6. А разве бывает возможность поставить титры в разных местах видео у плеера? Если на видео ролике несколько продуктов? Кофе дымится вверху, посередине мороженное, внизу крутиться булочка и т.п. Думаю Andrey Yefimov поставил правильный диагноз - ничего не получиться в андроиде.

  7. У меня на форме табконтрол с элементами управления. Я нажимаю кнопку и запускают плеер из маркера. Это плеер МХ установленный на устройстве. Мне надо в момент запуска создать дополнительную прозрачную форму и она будет поверх видео, правильно?

  8. Подскажите, пожалуйста, можно ли реализовать следующую задачу:
    Программа запускает видео ролик, который крутиться в цикле в стандартном медиа плеере (или не стандартном, например, в MX плеере из маркета, марка плеера не принципиальна).
    Видео ролик отображает продукт на экране с его ценой. Если цена у продукта поменялась, то надо создавать новый видео ролик с новой ценой. Хотелось бы не создавать новый ролик, а чтобы было так:

    1. Создаем один раз видео ролик и отображаем продукт без его цены.
    2. Цена при старте программы читается из текстового файла и накладывается поверх видео ролика в нужном месте.
    3. Если цена поменялась (например, скачок курса доллара), то просто меняем цену в текстовом файле и перезапускаем программу. Ролик показывается уже с новой ценой.

    Есть ли возможность накладывать поверх видео в андроиде нужную информацию, т.е. можно ли как-то реализовать пункт №2? В данном случае наложить на видео информацию из текстового файла.

    Спасибо.

     

    P.S.

    Или быть может проще накладывать прозрачную картинку png с новой ценой? Новую картинку png с новой ценой проще сделать, чем делать новый видео ролик.
     

  9. Попытка №1. Помогите исправить ошибку:

    class TMyMessageDlgCloseProc1 : public TInterfacedObject, public Fmx::Dialogs::TInputCloseDialogProc
    {
    public:
    	HRESULT STDMETHODCALLTYPE QueryInterface (const GUID& riid, void** ppvObject) { return TInterfacedObject::QueryInterface (riid, ppvObject); }
    	ULONG STDMETHODCALLTYPE AddRef() { return TInterfacedObject::_AddRef(); }
    	ULONG STDMETHODCALLTYPE Release() { return TInterfacedObject::_Release(); }
    
    	void __fastcall Invoke(const TModalResult AResult)
    	{
    		if (AResult == mrYes)
    		{
    		 //***
    		}
    	}
    };
    
     _di_TInputCloseDialogProc proc = new TMyMessageDlgCloseProc1;
    MessageDlg(L"Удалить:  " + LabelSection->Text + L"?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0, proc);
    
    

    [bccaarm Error] MobUnit1.cpp(694): allocating an object of abstract class type 'TMyMessageDlgCloseProc1'
      sysmac.h(300): unimplemented pure virtual method 'QueryInterface' in 'TMyMessageDlgCloseProc1'

  10. Если найдется гуру на С++, подскажите пожалуйста, скелет вызова 3 раза анонимного метода с разными сообщениями и один раз MessageDlg для условия if. В коде после MessageDlg вызываются ShowMessage, получается надо из анонимного метода вызвать другой анонимный метод?

    void StopTimers()
    {
     MainForm->Timer1->Enabled = false;
     MainForm->Button1->Enabled = true;
    }
    
    
    void __fastcall TMainForm::ButtonDeleteClick(TObject *Sender)
    {
      try
    	 {
    	  if(LabelSection->Text != "")
    	  {
    		if (MessageDlg(L"Удалить секцию: " + LabelSection->Text + L"?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0) == mrYes)
    		{
    
    		   #ifdef __ANDROID__
    		   String path = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetSharedDownloadsPath(), L"files.ini");
    		   #elif _Windows
    		   String path = System::Ioutils::TPath::Combine(GetCurrentDir(), L"files.ini");
    		   #endif
    
    		   if(FileExists(path))
    			 {
    			  std::unique_ptr<TIniFile> FileINI(new TIniFile(path));
    			  FileINI->EraseSection(LabelSection->Text);
    			  FileINI->UpdateFile();
    
    			  if(!Control())
    				 {
    				  StopTimers();
    				  Application->Terminate();
    				  return;
    				 }
    
    			   //IniContent был заполнен в функции Control()
    			   ListView1->Items->Clear();
    			   std::map<String, std::vector<String> >::iterator It = IniContent.begin();//map был заполнен в Control()
    			   int i = 1;
    
    				 while (It != IniContent.end())
    				  {
    				   TListViewItem * item = ListView1->Items->Add();
    				   item->Text = L"№" + IntToStr(i) + " " + IniContent[(*It).first][1];//имя файла из ini
    				   item->Detail = MainForm->IniContent[(*It).first][2];//about из ini файла
    				   item->BitmapRef = Image1->Bitmap;
    				   item->Data[sText] = TValue::From<UnicodeString>((*It).first);//время из ini пишем справа в списке
    				   //ShowMessage((*It).first);
    				   It++;
    				   i++;
    				  }
    
    			  //***
    			  if(!IniContent.empty())
    			  ShowMessage(L"Секция удалена из файла расписания.");
    
    			  ChangeTabAction1->Tab = TabItem1;
    			  ChangeTabAction1->ExecuteTarget(this);
    
    			 }
    			 else
    				{
    				 ShowMessage(L"Не найден файл files.ini. Программа будет закрыта.");
    				 Application->Terminate();
    				}
    		}
    
    	  }
    	}
    	catch(Exception &E)
    		  {
    		   StopTimers();
    		   ShowMessage(L"Произошла ошибка в ButtonDeleteClick. Класс ошибки: " + E.ClassName() +
    		   L"\nСообщение ошибки: " + E.Message + L" Программа будет закрыта.");
    		   Application->Terminate();
    		  }
    }
    
    
  11. Проскочила фраза на просторах интернета:

    The catch is that the anonymous procedure is now required for Android, but implementing an anonymous procedure in C++ is more difficult than in Delphi.

     

    Все мои попытки сделать это в С++ Builder не увенчались успехом. Кто нибудь может выложить рабочий код на С++?

    Спасибо.

  12. Большое спасибо. Попробую реализовать на С++.

     

    В XE7 диалоговые окна стали не блокирующими.

     

     

    Скажите пожалуйста, а зачем все было менять если все прекрасно работало в RAD XE6 так как надо и интуитивно понятно?

    Спасибо.

  13. Вот, к примеру, код:

    catch(Exception &E)
    
                         {
    
                          ShowMessage(L"Произошла ошибка в ButtonDeleteClick. Класс ошибки: " + E.ClassName() +
    
                          L"\nСообщение ошибки: " + E.Message + L" Программа будет закрыта.");
    
                          Application->Terminate();
    
                         }
    

    В готовом APK созданном в RADXE6 я вижу окно с сообщением. Нажимаю в нем ОК и программа закрывается. Все нормально.

     

    В RADXE7 я вижу на мгновение окно с сообщением, и программа сразу закрывается сама. Даже не успеваешь прочитать, что было написано в окне сообщения.

    Как сделать, чтобы в готовом APK созданном в RADXE7 пользователь мог увидеть окно с сообщением ShowMessage и нажать в нем кнопку?

    В RADXE6 проблем нет.

    Спасибо.

  14. Здравствуйте.
    У меня есть код, который успешно без проблем отрабатывает в RAD XE6. В готовом APK нет никаких проблем.
    Если перенести этот код в RAD XE7, то в готовом APK возникает ошибка класса ENotImplemented, сообщение Blocking dialogs not implemented on this platform.
    Ошибка возникает при нажатии на кнопку, в которой есть такой код:

    if (MessageDlg(L"Удалить секцию: " + LabelSection->Text + L"?", TMsgDlgType::mtConfirmation, TMsgDlgButtons() << TMsgDlgBtn::mbYes << TMsgDlgBtn::mbNo, 0) == mrYes)
    {
    //***
    }
    

    Подскажите, пожалуйста, как исправить, чтобы работало в созданном APK из RAD XE7?
    В APK из RAD XE6 я вижу диалоговое окно без каких-либо проблем и сообщений об ошибке.
    Спасибо.

    1. Открыть пакет в RAD XE7.
    2. Правой кнопкой по пакету и Options.
    3. В появившемся окне выбрать Delphi Compiler -> Output C/C++ file generator -> Generate all C++Builder files (including package libs)
    4. Потом прописать пути в настройках студии.

    Так правильно будет или не правильно поняла?

×
×
  • Создать...