Astghik
-
Постов
26 -
Зарегистрирован
-
Посещение
Активность репутации
-
Astghik отреагировална vic85 в встраивание Fire Monkey в Windows приложение
Делаем так, в dll метод создания формы может быть таким
procedure Init(ParentWindow: HWND; const Rect: Windows.TRect); stdcall; begin try StartupInput.DebugEventCallback := nil; StartupInput.SuppressBackgroundThread := False; StartupInput.SuppressExternalCodecs := False; StartupInput.GdiplusVersion := 1; GdiplusStartup(gdiplusToken, @StartupInput, nil); Form1 := TForm1.Create(nil); Form1.Show; if ParentWindow <> 0 then begin //Скроем иконку приложения с панели задач ShowWindow(ApplicationHWND, SW_HIDE); //Сменим стиль окна что бы оно не перехватывало фокус с родительского окна SetWindowLong(FmxHandleToHWND(Form1.Handle), GWL_STYLE, GetWindowLong(FmxHandleToHWND(Form1.Handle), GWL_STYLE) and (not WS_POPUP) OR WS_CHILD); //Встроим окно в родительское Windows.SetParent(FmxHandleToHWND(Form1.Handle), ParentWindow); //Установим размеры окна такими которыми инициализирована DLL SetWindowPos(FmxHandleToHWND(Form1.Handle), 0, Rect.Left, Rect.Top, RectWidth(Rect), RectHeight(Rect), 0); end; except on E: Exception do MessageBox(0, PChar(E.Message), '', 0); end; end; Эта функция создаст форму и встроит ее на хост в vcl приложении. У формы в dfm должен быть убраны границы что бы оно вписалось. Так же для того что бы форма изменяла размеры вписываясь в хост экспортируем функцию получения хэндла
function GetFormHandle: HWND; stdcall; begin Result := 0; try Result := FormToHWND(Form1); except on E: Exception do MessageBox(0, PChar(E.Message), '', 0); end; end; Собственно в хосте загружаем dll, и создаем форму кидая ее на панель
Init(panel1.Handle, panel1.ClientRect); Что бы форма меняла размер как и панель - нужно создать обработчик изменения размеров панели и там менять размер встроенной формы
procedure THostForm.Panel1Resize(Sender: TObject); var h: HWND; Rect: Windows.TRect; begin h := 0; Rect := Panel1.ClientRect; if Assigned(FGetFormHandleProc) then h := FGetFormHandleProc; if h <> 0 then SetWindowPos(h, 0, Rect.Left, Rect.Top, RectWidth(Rect), RectHeight(Rect), 0); end;
Вот так получается втсроить FMX форму из Dll в VCL приложение
-
Astghik отреагировална Barbanel в Rad Studio C++ Android 64-bit requirement
- Когда будет реализована эта фича?
- Я думаю, что ближе к никогда. Никогда вас устроит?
?
-
Astghik отреагировална denprox в Эффект тумана
не то ... туман же не делает картинку размытой...
Пока что вижу выход только такой - кинуть текстуру облачности поверх основной картинки, и подобрать прозрачность
-
Astghik отреагировална krapotkin в Print from Android(IOS)
it isn't an usual printer, so printing on it isn't usual too ))
This kind of printers have a special escape codes (as like an old good Epson matrix one) to change a print mode, so you have to get a documentation from manufacturer, where there are described
After that you can fully control your printing as you've show above - simply sending the text strings with control codes to your printer over the network.
Fast search brings this to me.
https://www.manualslib.com/manual/132455/Posiflex-Pp3000-Series.html?page=52
i guess you can send codes someway like this Socket->Write(0x9); ...
-
Astghik отреагировална ENERGY в Проверить состояние сети
Вот вариант предложенный Равилем (я его немного изменил):
Кстати на Android есть методы ОС для этого, они гораздо быстрее.
uses System.Net.HttpClient
function CheckInternet: boolean; begin Result := false; with THTTPClient.Create do try try Result := Head('http://google.com').StatusCode < 400; except end; finally Free; end; end;
-
Astghik отреагировална ENERGY в Руководства RAD Studio Mobile Tutorials - Free eBook
Кстати там уже новая версия для Берлина появилась: http://docs.embarcadero.com/products/rad_studio/radstudioBerlin/Mobile_Tutorials_en.pdf
-
Astghik отреагировална Fedor K в Открытие "своего" файла из приложения
Для открытия файла лучше пользоваться не:
TNSURL.Wrap (TNSURL.OCClass.URLWithString (StrToNSStr (PChar (URL)))); а:
TNSUrl.Wrap(TNSUrl.OCClass.fileURLWithPath(StrToNSStr(path)));
-
Astghik отреагировална Brovin Yaroslav в Фоновое выполнение операции без "замораживания" отрисовки
Вся отрисовка выполняется в главном потоке приложения. Поэтому, если вы пытаетесь выполнить скачивание файла в основном потоке, то вся отрисовка приостановится до момента окончания вашей операции. Поэтому правило хорошего тона - это вынесение долгих операций (загрузка, ответ авторизации и тд) в отдельный поток.
Примерный код приведен ниже:
1. Создаем отдельный поток, в котором вы будите скачивать файл (я поставил для эмуляции скачивания просто паузу на 5 секунд):
type TMyTask = class (TThread) protected FOnTaskStarted: TThreadMethod; FOnTaskFinished: TThreadMethod; procedure DoStarted; procedure DoFinished; procedure Execute; override; public property OnTaskStarted: TThreadMethod read FOnTaskStarted write FOnTaskStarted; property OnTaskFinished: TThreadMethod read FOnTaskFinished write FOnTaskFinished; end; Реализация:
{ TMyTask } procedure TMyTask.DoFinished; begin if Assigned(OnTaskFinished) then OnTaskFinished; end; procedure TMyTask.DoStarted; begin if Assigned(OnTaskStarted) then OnTaskStarted; end; procedure TMyTask.Execute; begin Synchronize(DoStarted); try Sleep(5000); // Эмуляция выполнения 5 Секундной задачи finally Synchronize(DoFinished); end; end; Само использование такого потока будет следующим (в моем примере после выполнения операции, появится сообщение):
TForm3 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private FMyTask: TMyTask; public procedure DoTaskStarted; // Callback, вызываемый в начале старта операции procedure DoTaskFinished; // Callback, вызываемый в конце выполнения операции. Аналог OnTerminate procedure StartMyTask; // Запуск задачи end; procedure TForm3.Button1Click(Sender: TObject); begin StartMyTask; end; procedure TForm3.DoTaskStarted; begin end; procedure TForm3.DoTaskFinished; begin ShowMessage('Выполнение задачи окончено'); end; procedure TForm3.StartMyTask; begin if FMyTask <> nil then begin FMyTasl.OnTaskStarted := nil; FMyTasl.OnTaskFinished := nil; FMyTask.Free; end; FMyTask := TMyTask.Create(True); FMyTask.OnTaskStarted := DoTaskStarted; FMyTask.OnTaskFinished := DoTaskFinished; FMyTask.Start; end; При таком подходе главный поток не будет блокироваться и будет корректно отрисовываться и работать.
-
Astghik получил реакцию от Kitty в Как программно обновить и запустить другое приложение (Андроид)?
#include <Androidapi.JNI.JavaTypes.hpp>
#include <Androidapi.Helpers.hpp>
#include <Androidapi.JNI.Embarcadero.hpp>
#include <Androidapi.JNI.GraphicsContentViewText.hpp>
for Rad Studio 10
-
Astghik получил реакцию от Rusland в Как программно обновить и запустить другое приложение (Андроид)?
_di_JIntent newIntent = TJIntent::Create();
newIntent->setAction(TJIntent::JavaClass->ACTION_VIEW);
_di_JMimeTypeMap mime = TJMimeTypeMap::JavaClass->getSingleton();
_di_JString ExtToMime = mime->getMimeTypeFromExtension(StringToJString(L"apk"));
String pth = System::Ioutils::TPath::GetPublicPath() + L"/app.apk"; // path app.apk
_di_JFile my_file = TJFile::JavaClass->init(StringToJString(pth));
_di_Jnet_Uri uri = TJnet_Uri::JavaClass->fromFile(my_file);
newIntent->setDataAndType(uri,ExtToMime);
int my_flag = TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK;
newIntent->setFlags(flag);
SharedActivity()->startActivity(newIntent);
-
Astghik получил реакцию от Kitty в Как программно обновить и запустить другое приложение (Андроид)?
_di_JIntent newIntent = TJIntent::Create();
newIntent->setAction(TJIntent::JavaClass->ACTION_VIEW);
_di_JMimeTypeMap mime = TJMimeTypeMap::JavaClass->getSingleton();
_di_JString ExtToMime = mime->getMimeTypeFromExtension(StringToJString(L"apk"));
String pth = System::Ioutils::TPath::GetPublicPath() + L"/app.apk"; // path app.apk
_di_JFile my_file = TJFile::JavaClass->init(StringToJString(pth));
_di_Jnet_Uri uri = TJnet_Uri::JavaClass->fromFile(my_file);
newIntent->setDataAndType(uri,ExtToMime);
int my_flag = TJIntent::JavaClass->FLAG_ACTIVITY_NEW_TASK;
newIntent->setFlags(flag);
SharedActivity()->startActivity(newIntent);