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

Pax Beach

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

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

  • Посещение

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

    12

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

  1. Привожу пример готового FMX приложения, которое рисует на форме с помощью интерфейса IDirect3DDevice9.

    В примере реализован вызов анонимного метода Present() интерфейса IDirect3DDevice9, имея ссылку на интерфейс и порядковый номер метода.

    Данная реализация пригодится при установке ловушек (Hooks).

     

    Вкратце, суть реализации такая:

    Объявляю процедурный тип нужного метода

    type
      TPresent9 = function(pSourceRect, pDestRect: PRect; hDestWindowOverride: HWND; pDirtyRegion: PRgnData): HResult of object; stdcall;
    

    Объявляю переменную этого типа

    var
      PPresent: TPresent9;
    begin
      ...
      IntRefToMethPtr(d3d9Dev, PPresent, 17);
      PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil);
    

    Реализую процедуру получения метода интерфейса по номеру

    procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer);
    type
      TVtable  = array [0 .. 999] of Pointer;
      PVtable  = ^TVtable;
      PPVtable = ^PVtable;
    begin
      // QI=0, AddRef=1, Release=2, etc
      TMethod(MethPtr).Code := PPVtable(IntRef)^^[MethNo];
      TMethod(MethPtr).Data := Pointer(IntRef);
    end;
    

    А теперь получаем метод интерфейса по его порядковому номеру и вызываем его

      IntRefToMethPtr(d3d9Dev, PPresent, 17);
      PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil);
    

    Благодарю за оценку этого решения на StackOverflow.

     

    Скачать пример: D3DDemo.zip

  2. 7 часов назад, Nik сказал:

    Задался тут вопросом обновления версии Android NDK...

    Delphi 10.2 Tokio:

    - android-ndk-r14b-windows-x86_64 - скомпилировалось, но при запуске приложения на андроиде сбоит и виснет;

    - android-ndk-r15-beta1-windows-x86_64 - полёт нормальный.. всё работает )

    P.S> может кому пригодится

    Скрины настроек каталогов SDK и NDK пожалуйста

  3. Мне нужно сделать снимок экрана из своего приложения в приложении DirectX (в игре).

    По-быстрому накидал приложение, исходники здесь: MakeScreenshot-Forum.zip

    screen.jpg.ee04f8b3fb65b38a05dcabf7a6ad22ef.jpg

    1. по нажатию единственной кнопки будет выполнена серия из 16 снимков экрана. Если запущен Скайп, то фотографироваться будет содержимое его окна.

    2. По нажатии CTRL+ALT+F9 будет сделан единичный снимок

    3. Label внизу показывает сколько миллисекунд затрачено на вывод снимка

    4. В комментах так же вы найдете, как работать со снимками через буфер обмена.

     

    Работа выполняется через GetDC(NULL);

    Windows 10 x64. Снимки делаются. И DirectX тоже нормально фотографируется.

    НО! только в оконных приложениях.

    Если приложение DirectX полноэкранное, то на всех снимках одна и та же картинка с первого снимка.
    То есть изменение буфера экрана в приложении ни как не отражается на снимках.

     

    Что нужно? Необходимо делать снимки конкретного приложения через интерфейс DirectX, а точнее, я так понимаю, через DirectShow. Тогда не будет разницы в окне оно или на полный экран.

    Помогите плиз, знающие люди, с решением этой задачи.

    Гарантирую вам от сообщества большой почет, от меня огромный респект, если это принесет доход, то еще и очень приятный бонус.

     

    Ссылки теме:

    1. DIRECTX FOR DELPHI

    2. unofficial version of DelphiX

    3. DirectX для начинающих

    4. MinHook - The Minimalistic x86/x64 API Hooking Library

    5. Various methods for capturing the screen

    6. Вывод графики на рабочий стол Windows с использованием оверлеев DirectX

    7. Project JEDI

    8. Реализация перехвата вызовов API — исчерпывающе про внедрение DLL, если разобраться, + это на Delphi

    UPD:

    9. Серия видео уроков Пишем D3D-хук — все понятно, только в Delphi перенести нужно.

    UPD 2:

    Научился рисовать в Direct3D и ловить интерфейс IDirect3DDevice9. Теперь делаю DLL ловушку для реализации снимков.

     

  4. Посмотрите класс, реализующий альтернативный Sleep (под катом).

    соль в следующем:

    создаем потомка TThread, запускаем, ждем завершения:

    class function TDelays.Delay(aDuration: integer): TDelay;
    begin
      if not Assigned(FList) then
        FList := TList<TDelay>.Create;
    
      Result := TDelay.Create(aDuration);
      FList.Add(Result);
      Result.FreeOnTerminate := false;
      Result.OnTerminate     := OnTerminateItem;
      Result.Start;
      Result.WaitFor;
    end;

    Работаем с ним нежно

    procedure TDelay.Execute;
    begin
      inherited;
    
      while (not Terminated) and (MilliSecondsBetween(now, FStart) < FDelay) do
      begin
        sleep(100);
      end;
    end;

    По завершении работы убиваем:

    class procedure TDelays.OnTerminateItem(Sender: TObject);
    begin
      TTask.Run(
        procedure
        begin
          try
            if Assigned((Sender as TDelay)) then
            begin
              (Sender as TDelay).Free;
              FList.Remove((Sender as TDelay));
            end;
          except
          end;
        end);
    end;

    А можем убить и досрочно:

    (TObject as TDelay).Free;

    потому что в деструкторе стоит такой код:

    destructor TDelay.Destroy;
    begin
      Terminate;
    
      if (not Suspended) then
        WaitFor;
    
      inherited;
    end;

     

    uDelays.zip

  5. 2 часа назад, Kitty сказал:

    Вроде тут похожая проблема:

    APushService is always nil

    только не поняла, а что же надо сделать?...

    Мой манифест в общей папке проекта AndroidManifest.template.xml:

    
    <?xml version="1.0" encoding="utf-8"?>
    <!-- BEGIN_INCLUDE(manifest) -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="%package%"
            android:versionCode="%versionCode%"
            android:versionName="%versionName%"
            android:installLocation="%installLocation%">
    
        <!-- This is the platform API where NativeActivity was introduced. -->
        <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
    <%uses-permission%>
    
        <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
        <application android:persistent="%persistent%" 
            android:restoreAnyVersion="%restoreAnyVersion%" 
            android:label="%label%" 
            android:debuggable="%debuggable%" 
            android:largeHeap="%largeHeap%"
            android:icon="%icon%"
            android:theme="%theme%"
            android:hardwareAccelerated="%hardwareAccelerated%">
    
    <%application-meta-data%>
    		<%services%>
            <!-- Our activity is a subclass of the built-in NativeActivity framework class.
                 This will take care of integrating with our NDK code. -->
            <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                    android:label="%activityLabel%"
                    android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                    android:launchMode="singleTask">
                <!-- Tell NativeActivity the name of our .so -->
                <meta-data android:name="android.app.lib_name"
                    android:value="%libNameValue%" />
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter> 
            </activity>
            <%activity%>
    		<service android:name="com.embarcadero.gcm.notifications.GCMIntentService" /> 
            <%receivers%>
    		
        </application>
    </manifest>
    <!-- END_INCLUDE(manifest) -->

    А такой манифест AndroidManifest.xml в паке релиз:

    
    <?xml version="1.0" encoding="utf-8"?>
    <!-- BEGIN_INCLUDE(manifest) -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="ua.com.mikros.Promo"
            android:versionCode="1"
            android:versionName="1.0.0"
            android:installLocation="auto">
    
        <!-- This is the platform API where NativeActivity was introduced. -->
        <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <permission android:name="ua.com.mikros.Promo.permission.C2D_MESSAGE" android:protectionLevel="signature" />
        <uses-permission android:name="ua.com.mikros.Promo.permission.C2D_MESSAGE" />
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    
    
        <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
        <application android:persistent="False" 
            android:restoreAnyVersion="False" 
            android:label="Promo" 
            android:debuggable="True" 
            android:largeHeap="False"
            android:icon="@drawable/ic_launcher"
            android:theme="@style/AppTheme"
            android:hardwareAccelerated="true">
    
    
    		
            <!-- Our activity is a subclass of the built-in NativeActivity framework class.
                 This will take care of integrating with our NDK code. -->
            <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                    android:label="Promo"
                    android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
                    android:launchMode="singleTask">
                <!-- Tell NativeActivity the name of our .so -->
                <meta-data android:name="android.app.lib_name"
                    android:value="Promo" />
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter> 
            </activity>
            
    		<service android:name="com.embarcadero.gcm.notifications.GCMIntentService" /> 
            <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" />
    <receiver android:exported="true" android:name="com.embarcadero.gcm.notifications.GCMNotification" android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <category android:name="ua.com.mikros.Promo" />
    </intent-filter>
    </receiver>
    
    		
        </application>
    </manifest>
    <!-- END_INCLUDE(manifest) -->

     

    В чем различия?

  6. В MIUI вообще сервисы Delphi не запускаются.

    Всем обладателям Xiaomi привет!

    Отключил энергосбережение, предоставил приложению все привилегии. Смартфон ведет себя как iPhone.

    Может кто-то знает как это лечится?

    Redmi 4, Andorid 6.0.1, MIUI Global 8.0.

  7. В итоге, я пересел обратно на съемку фото через TAction.

    В Берлине 10.1.2 для Android 6+ делаю запрос прав на камеру и доступ к внешнему хранилищу (камера не обязательно, потому что съемка ведется нативным приложением) — все нормально заработало.

  8. 1 час назад, ENRGY сказал:

    Спасибо большое за пример. 

    Вопрос, как сделать чтобы фото не добавлялось в Library?

    Читая примеры гугла, я так понял, что придется лезть в папку library и удалять последнюю фотку, если это сильно нужно.

     

  9. В 01.03.2017 в 00:28, AlexShaman сказал:

    Что-то у меня не получается.

    Такая же ошибка, как у вас, 

    добавил PhotoIntent.setFlags(TJIntent.javaclass.FLAG_ACTIVITY_NEW_TASK ); ошибка ушла, но не срабатывает callback

    Какая версия Delphi, Andorid?

    REQUEST_IMAGE_CAPTURE  поменяли?

  10. 1 час назад, Вадим Смоленский сказал:

    Перевожу большой проект из VCL в FMX. В ходе запуска на главном окне много чего рисуется и выравнивается; соответствующий код записан в FormShow. Пока всё не отработало, показывается заставка, splash window. В конце, как и положено, запускается Application.Run, на экране появляется готовая главная форма, а заставка убивается Под VCL всё это выглядело именно так. Под FMX же главная форма выводится на экран в самом начале отрисовки, вместе с заставкой, и пользователь вынужден наблюдать всю отрисовку в режиме реального времени, с мельканиями и дерганиями. Как подавить этот преждевременный вывод?

    А показывать сплэш поверх всех элементов до момента полной отрисовки не вариант?

  11. 4 минуты назад, wamaco сказал:
    
    Как то так делал, пишу по памяти....
    Все работало без установленного офиса
    
    
    Строка подключения
    СonnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source= '  + СокрЛП(ФайлEXCEL) + ';Extended Properties="Excel 8.0;HDR=YES;IMEX=1;';
    
    ADODBConnection :=  COMОбъект("ADODB.Connection");
    
    ADODBConnection.ConnectionString :=  СonnectionString;
    ADODBConnection.Open();
    
    ="SELECT * FROM ["++"$]"; //= "ADODB.Recordset");.(,);(..) THEN

    и т.д.

     

     

    Технически такое возможно, если драйвер Jet позволяет работать с файлами Excel, как с источниками данных без установленного пакета MS Office.

    Фактически ADODB дергает нужную DLL, которая определяет логику работы с источником.

  12. Сделал пример приложения для работы с Microsoft Word из приложения Delphi.

    Такое приложение может использоваться для обмена данными между объектами семейства Microsoft Office.

     

    Исходные коды приложения помогут вам понять, как работать с объектной моделью Microsoft Word.

    Чтобы лучше разобраться с нюансами Word, предлагаю ознакомиться со справочником Word VBA reference на MSDN.

    Проект создан в среде FireMonkey Delphi Berlin 10.1
    Протестирован в MS Word 2010, 2016, Windows 7x64 и 10x64.
    Чтобы посмотреть пример, просто распакуйте zip-файл проекта и щелкайте по порядку кнопки на форме.

    2017-01-20_09-16-33-768x561[1].png

     

    Скачать Delphi Word Test

     

    WordTest.zip

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