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

Поиск сообщества

Показаны результаты для тегов 'delphi'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Форумы

  • Общие вопросы
    • Анимация
    • Графика
    • Стили
    • Базы данных и REST
    • Компоненты
    • Положение, размеры, выравнивание
    • Работа с текстом
    • Приложение и формы
    • Отладка
    • Развертывание приложений
    • Вопросы по языку Object Pascal и RTL
    • Общая информация о TControl
    • События
    • Прочие вопросы
  • Вопросы по платформам
    • Android
    • iOS
    • OSX
    • Windows
    • Windows Phone
    • Linux
  • Вопросы по использованию RAD Studio
    • Лицензирование
    • Сборка проектов
    • Multi-Device Designer
    • Редактор кода
    • Вопросы
  • Обучение
    • Основная информация
    • Вопросы
    • Отзывы
  • Поиск специалистов по FireMonkey
    • Консультации
    • Ищу подрядчика
  • Дополнительные ресурсы по FireMonkey
    • Сторонние компоненты
    • Приложения, написанные с использованием FireMonkey
    • Примеры
    • Руководства
    • Шаблоны
    • Статьи и заметки
    • Информация о версиях RAD Studio
    • Новости
  • Организация работы данного форума

Поиск результатов в...

Поиск контента, содержащего...


Дата создания

  • Начало

    Конец


Дата обновления

  • Начало

    Конец


Фильтр по количеству...

Регистрация

  • Начало

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


StackOverflow


Защита от ботов


Город


Интересы

  1. Добрый день, уважаемы форумчане. Будучи больше читателем, чем писателем, я решился задать вопрос на форуме потому что не смог до конца решить задачу. А задача заключается в следующем: Необходимо разработать на Embarcadero Delphi приложение мобильной кассы для смарт-терминала MSPOS. Для этого необходимо интегрировать в Delphi работу с фискальным ядром ККТ. На сайте производителя терминалов MSPOS есть подробная информация по интерфейсу IFiscalCore фискальноого ядра ККТ. Основой интерфейса фискального ядра являются AIDL файлы описания методов, и есть примеры подключения к фискальному ядру для языка java. Если есть среди форумчан разработчики, желающие и могущие поучаствовать в интеграции фискального ядра смарт-терминала MSPOS в Embarcadero Delphi, прошу откликнуться. У меня уже есть достаточно серьезные наработки, которые могу выложить. Но есть и серьезный затык, который заставил написать здесь.
  2. Здравствуйте. Сбился со счёта дней сколько пытаюсь заставить компилировать приложения под андроид, текста будет много, постараюсь изложить все свои эксперименты и не удачи в данном деле в надежде раскрыть тайну занавеса моей ошибки. На дельфи программирую давно и скил в общем то имею, но я никогда не пробовал создавать апк файл, сейчас же загорелся идеей создать приложение под андроид. Переустановил дельфи включая галочки поддержки андроид, зашёл в папку PlatformSDKs, запустил SDK Manager обновил по рекомендациям самого SDK всё что он выделил, встречались разные ошибки в логе типа: Downloading Android Auto Desktop Head Unit emulator, revision 1.1 Download finished with wrong size. Expected 2691901 bytes, got 2615480 bytes. Запустил AVD создал виртуальное устройство андроид версии 4.4.2 устройство запустилось, зашёл в настройки активировал режим разработчика, далее в настройках разработчика включил поддержу usb отладки. Запустил дельфи, в путях SDK Manager, Android SDK 25.2.5 32 bit, SDK/NDK/Java нигде нет иконки восклицательного знака то есть всё нашлось всё чётко, в системной переменной Path тоже добавлял пути как описывалось в мануалах на разных источниках. Создаю новый проект, пустая форма, жму компилировать поначалу выходила ошибка не найден файл ..\android\EXEC после различных манипуляций, а именно оно исчезло когда я удалил папку Project в Document эта ошибка исчезла и приложение сохраняется по адресу C:\Users\Fin4\Documents\Embarcadero\Studio\Projects\Android\Debug\Project1\bin Но выходит другая ошибка говорит что моё устройство не найдено, хотя оно есть в выпадающем списке в самой дельфи, ниже прикладываю скрин с ошибкой https://prnt.sc/26w3x55 Это то на чём я остановился в данный момент. Я скопировал созданный апк с простейшей командой вывода сообщения hello world в своё созданное виртуальное андроид устройство в эмуляторе MEmu 4.2.2 версии оно установилось и запустилось, отработало без ошибок! Создал второе виртуальное устройство андроид с версией 7.1 тоже в MEmu но на этой версии андроида приложение не захотело устанавливаться выдало ошибку и закрылось, почему так? Я читал что приложения которое запускается на более поздней версии андроид должно запускаться и на более свежей версии без проблем. Запускаю AVD и там у меня создано 2 виртуальных устройства, версия 4.2.2 и версия 8.0 (в дельфи в выпадающем меню стояло устройство с версией 4.2.2 когда компилировал приложение) 4.2.2 версия запускается без проблем в AVD версия 8.0 запускается тоже без ошибок, НО само виртуальное устройство не загружается, появляется окно андроид устройства с боковыми кнопками включить, камера, повернуть вертикально и просто чёрное окно самого телефона и на этом всё. Скачивал я Android Studio созданные в нём виртуальные устройства запускались без проблем, отыскал где находится sdk/ndk пытался указать пути в дельфи в SDK Manager но именно у NDK названия файлов некоторые отличаются от тех какие прописаны в дельфи по умолчанию, эксперимент провалился и я снёс андроид студио. Ещё такая проблема по адресу PlatformSDKs\android-sdk-windows\extras\google\usb_driver лежат драйвера юсб в диспетчере устройств вылазит неопознанное юсб устройство, я жму установить android_winusb.inf выходит ошибка "выбранный INF файл не поддерживает этого метода установки" хотя в самом SDK Manager Google USB Driver - Installed Спасибо что дочитали до конца и очень надеюсь что кто нибудь поможет мне разобраться с моей проблемой. Если у кого то есть возможность поговорить в телеграмм я буду только рад, адрес можете прислать мне в личку. Моя ОС win 7 64-bit Java пробовал: jdk-11.0.14 64-bit ошибка jdk-17.0.2 64-bit ошибка jdk1.8.0_60 64-bit создался apk файл но всё равно ошибка в дельфи Мои знания в программировании только на дельфи + немного php+mysql с Java не работал.
  3. Здравствуйте, есть вопрос по поводу создания приложения и его функционала. По нажатию на кнопку должен создаваться компонент, в него должен вводится текст, и по желанию добавлять или не добавляться изображение. Т.е. оно должно работать по типу записной книжки/ каталога. Из этого вышли вопросы: 1) Какой лучше компонент использовать? Я думал по началу что бы вызывалась панель, а на ней был условный ListBox, для которого в edit`e вводилась бы информация. 2) Как позиционировать это? Т.е. возможно ли сделать так, что бы пользователь сам выбирал в какую часть экрана поставить данную запись? Или же лучше сделать просто по добавлению, что бы новое было перед старым? И соответственно, как это сделать? Подскажите пожалуйста как это реализовать, так как я новичок в этом, а хочется понять как это всё устроено и работает.
  4. Итак, у меня была Delphi 10.3 Community Editon, которой я пользовался год. Затем, бесплатная лицензия истекла и я поставил себе новую Community Edition - на этот раз, версию 10.4. Однако она оказалась полным отстоем - ничего нового и интересного в ней нет, а вот целая куча нужных вещей оказалась выпилена (включая то, что многие старые компоненты больше не работают). А посему у меня вопрос - как реанимировать установленную у меня Delphi 10.3, как продлить ее Community Edition лицензию?
  5. Итак, как добавить в приложение проверку наличия соединения с Интернетом? Я всегда пользовался кодом: var NetControl : DWORD; begin NetControl := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY; Result := InternetGetConnectedState(@NetControl, 0); end; Однако здесь он явно не подходит, так как предназначен для Windows, а меня интересует Android. Я пробовал использовать компонент IdIPWatch, но он все время верещал о том что Интернета нет, несмотря на то что смартфон был вполне подключен к сети.
  6. В компанию требуется опытный разработчик, который готов присоединиться к команде для разработки крупного проекта в области Blockchain-технологий, распределенных систем и криптографии. Зп от 150 000 до 200 000 ₽. Удаленная работа.Обязанности:- Работа с криптографическими алгоритмами, blockchain технологиями- Разработка программного обеспечения на Delphi- Участие в разработке блокчейн проекта нового поколения- Разработка, поддержка и развитие серверных функций системы на основе Blockchain- Отладка, анализ производительности оптимизация ПО;- Проектирование и разработка архитектуры разрабатываемых решений;Требования:- Опыт разработки ПО от 5 лет;- Плюс: Понимание принципов работы публичных и закрытых блокчейнов (Ethereum/Solidity, Bitcoin, Quorum)- Знание принципов ООП и шаблонов проектирования;- Опыт работы с системами контроля версий ПО (Git)- Уверенное владение языком программирования Delphi, средой разработки embarcadero- Знание английского языка на уровне чтения технической литературы;Условия:- Участие в интересном и масштабном проекте- Дружный коллектив;- Возможности развития и обученияБонусыБонусы по итогам года.О нас:Мы компания новаторов и энтузиастов в сфере блокчейн и криптовалют.https://career.habr.com/vacancies/1000074707Контакт для обратной связи: hr@relictum.pro
  7. Вопрос: как спрятать главную форму приложения в FMX? В VCL это делается просто - Project>View Source>вписываешь в открывшемся окне Application.ShowMainForm := False, однако в FMX такой фокус не прокатывает, там просто свойства такого нет - ShowMainForm. Как же быть?
  8. Пытаюсь программно добавить в своем проекте компонент IdFTP: FTPBot : TIdFTP; FTPBot := TIdFTP.Create(); FTPBot.Name := 'FTPGhost'; FTPBot.Passive := True; FTPBot.Host := ''; FTPBot.Username := ''; FTPBot.Password := ''; Код компилируется нормально. Однако, когда я пытаюсь обратиться к свойству TransferType полученного объекта: FTPBot.TransferType.ftBinary; Программа при компиляции вылетает с ошибкой, утверждает что нельзя так писать. В чем дело?
  9. Я обратил внимание, что если в VCL цвет формы, а также некоторых других компонентов можно менять, то в FMX это сделать нельзя - доступен только дефолтно-серый, во всяком случае, при компиляции под Android. Есть ли какие-то способы это поправить?
  10. У меня есть следующий код, который передает данные из потока в объект типа TStrings: var F : TMemoryStream; S : TStrings; begin F := TMemoryStream.Create; S := TStringList.Create; F.LoadFromFile('C:/File.jpg'); S.LoadFromStream(F); Из TMemoryStream в TStrings все передается нормально. Однако - как обратно? Как снова преобразовать объект TString в поток данных, дабы снова можно было бы сохранить его в полноценный файл?
  11. У меня есть код, который должен скачивать файл с сайта: var LoadFile : TMemoryStream; begin LoadFile := TMemoryStream.Create; IdHTTP1.Get('https://sitename.pro/Folder/FileName.txt', LoadFile); LoadFile.SaveToFile('FileName.txt'); LoadFile.Free; end; Проблема однако в том, что вместо скачивания файла программа выдает: Could not load SSL library, хотя я никакой "SSL library" не просил)). При этом, когда я попробовал скачать файл с сайта работающего по старинке, на http (в отличие от https), все скачалось нормально, то есть проблема явно в данном протоколе. Поиск по Интернету ничего не дал.
  12. slav_z

    macOS Big Sur & Delphi

    Есть ли проблемы с запуском приложений на macOS Big Sur у Delphi 10.4.1? Очень страшно обновлять macOS...
  13. Доброе время суток. У меня есть код, который отправляет данные, в частности файлы, из одного приложения в другое, используя технологию AppTethering. Вот код, который отправляет данные: var ImageToStream : TMemoryStream; begin ImageToStream := TMemoryStream.Create; ImageToStream.LoadFromFile('Здесь находится путь к файлу'); ImageToStream.Position := 0; TetheringAppProfile1.Resources.FindByName('ImageTransfer').Value := ImageToStream; ImageToStream.Free; end; А вот который принимает: procedure TForm1.TetheringAppProfile1Resources3ResourceReceived( const Sender: TObject; const AResource: TRemoteResource); var GetImage : TMemoryStream; begin GetImage := TMemoryStream.Create; GetImage.Position := 0; GetImage.LoadFromStream(AResource.Value.AsStream); ImageViewer1.Bitmap.LoadFromStream(GetImage); GetImage.Free; end; Пока передача данных идет между двумя Windows-приложениями, все работает прекрасно. Однако, когда я пытаюсь отправить данные от Windows-приложения в Android-приложение, которое исполняется на смартфоне, подключенном к компьютеру через USB-шнур, данные не проходят.
  14. Приветствую Подскажите, планируется ли в RAD Studio возможность компиляции Delphi программ для WebAssembly?
  15. Есть код для копирования файлов: procedure TForm1.Timer2Timer(Sender: TObject); var FileIndex, FileName : String; I : Integer; begin randomize; FileIndex := IntToStr(random(5000)); for I := 0 to ListBox1.Items.Count-1 do begin FileIndex := IntToStr(StrToInt(FileIndex) + 1); FileName := FileIndex + Exp; TFile.Copy(ListBox1.Items[I], FileName); end; Timer2.Enabled := False; end; Когда я его запускаю, все работает, однако постоянно выскакивает сообщение об ошибке: specified file already exists, то есть копируемый файл уже существует. То есть, программа пытается каждый файл скопировать дважды. Вопрос: почему? С чем это связано и как от этого избавиться?
  16. Здравствуйте. У меня такая проблема. Пытаюсь скачать файл: var S : TMemoryStream; begin S := TMemoryStream.Create(); IdHTTP1.Get('http://sitename.com/7UlmBU7IXHA.jpg', S); S.SaveToFile('/storage/emulated/0/ImageFile.jpg'); S.Free; end; Проблема возникает на последней стадии - при сохранении файла. Android пишет, Cannot create file: '/storage/emulated/0/ImageFile.jpg'. Permission denied, то есть доступ запрещен. Но как его разрешить? Когда я устанавливаю приложение, система пишет, что никаких разрешений данная программа не требует.
  17. Добрый день! Установил XE8, открыл проект собранный на XE7 начались проблемы со стилями (если использовать один стиль на всех формах), это пол беды. пришлось стиль новый для каждой формы ставить... а ошибка что в названии появилась откуда не ждал, есть TListView, заполняется динамически 1-зачение добавляем ListView1.ClearItems; with ListView1.Items.Add do begin Text := 'KCell'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'kcell.png')); Tag := 3; end; with ListView1.Items.Add do begin Text := 'Activ'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'activ.png')); Tag := 391; end; with ListView1.Items.Add do begin Text := 'Tele2'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'tele2.png')); Tag := 125; end; with ListView1.Items.Add do begin Text := 'Pathword'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'pathword.png')); Tag := 73; end; with ListView1.Items.Add do begin Text := 'Beeline'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'beeline.png')); Tag := 90; end; with ListView1.Items.Add do begin Text := 'ДОС'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'beeline-dos.png')); Tag := 578; end; with ListView1.Items.Add do begin Text := 'Dalacom'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'dalacom.png')); Tag := 12; end; with ListView1.Items.Add do begin Text := 'City'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'city.png')); Tag := 134; end; with ListView1.Items.Add do begin Text := 'ALTEL 4G'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'altel4g.png')); Tag := 716; end; with ListView1.Items.Add do begin Text := 'АО "Казахтелеком"'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'telecom.png')); Tag := 0; end; 2-значение ListView1.ClearItems; with ListView1.Items.Add do begin Text := 'ALTEL 4G'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'altel4g.png')); Tag := 716; end; with ListView1.Items.Add do begin Text := 'JET'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'jet.png')); Tag := 484; end; with ListView1.Items.Add do begin Text := '"Интернет Дома" от Beeline'; Bitmap.LoadFromFile(TPath.Combine(TPath.GetDocumentsPath, 'internetdoma.png')); Tag := 413; end; моделируем ситуацию если грузим 1 значение и тыкаем (выделяем) на последний или больший 2 itemindex затем выполняем 2 значение, то выскакивает argument out of range т.е. получается ItemIndex или Selected Item не сбрасывается. как эту ошибку исправить?
  18. Всем привет, с помощью Java2Op сделал обертку библиотеки получил модуль с интерфейсами. Теперь сам вопрос в JavaInterfaces.pas есть описание: JUsbManagerClass = interface(JObjectClass) ['{1048A6E9-E1B5-4DA5-A168-ED91E8DE5284}'] {class} function _GetACTION_USB_ACCESSORY_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_ACCESSORY_DETACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_ATTACHED: JString; cdecl; {class} function _GetACTION_USB_DEVICE_DETACHED: JString; cdecl; {class} function _GetEXTRA_ACCESSORY: JString; cdecl; {class} function _GetEXTRA_DEVICE: JString; cdecl; {class} function _GetEXTRA_PERMISSION_GRANTED: JString; cdecl; {class} function getAccessoryList: TJavaObjectArray<JUsbAccessory>; cdecl;//Deprecated {class} function openAccessory(accessory: JUsbAccessory): JParcelFileDescriptor; cdecl;//Deprecated {class} function openDevice(device: JUsbDevice): JUsbDeviceConnection; cdecl;//Deprecated {class} procedure requestPermission(device: JUsbDevice; pi: JPendingIntent); cdecl; overload;//Deprecated {class} property ACTION_USB_ACCESSORY_ATTACHED: JString read _GetACTION_USB_ACCESSORY_ATTACHED; {class} property ACTION_USB_ACCESSORY_DETACHED: JString read _GetACTION_USB_ACCESSORY_DETACHED; {class} property ACTION_USB_DEVICE_ATTACHED: JString read _GetACTION_USB_DEVICE_ATTACHED; {class} property ACTION_USB_DEVICE_DETACHED: JString read _GetACTION_USB_DEVICE_DETACHED; {class} property EXTRA_ACCESSORY: JString read _GetEXTRA_ACCESSORY; {class} property EXTRA_DEVICE: JString read _GetEXTRA_DEVICE; {class} property EXTRA_PERMISSION_GRANTED: JString read _GetEXTRA_PERMISSION_GRANTED; end; [JavaSignature('android/hardware/usb/UsbManager')] JUsbManager = interface(JObject) ['{6F603A25-E816-4012-9B23-054B428A4A75}'] function getDeviceList: JHashMap; cdecl;//Deprecated function hasPermission(device: JUsbDevice): Boolean; cdecl; overload;//Deprecated function hasPermission(accessory: JUsbAccessory): Boolean; cdecl; overload;//Deprecated procedure requestPermission(accessory: JUsbAccessory; pi: JPendingIntent); cdecl; overload;//Deprecated end; TJUsbManager = class(TJavaGenericImport<JUsbManagerClass, JUsbManager>) end; Что бы получить доступ к методам интерфейса используется следующая конструкция: JavaObject := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.USB_SERVICE); FUsbManager := TJUsbManager.Wrap((JavaObject as ILocalObject).GetObjectID); теперь я могу получить доступ к методам JUsbManager, а как получить доступ к методам JUsbManagerClass Вот пример кода на Java, который хочу реализовать в Delphi: UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager); if (availableDrivers.isEmpty()) { return; } // Open a connection to the first available driver. UsbSerialDriver driver = availableDrivers.get(0); //Вот тут мы видим что из экземпляра класса мы вызываем openDriver, как это сделать в Delphi UsbDeviceConnection connection = manager.openDevice(driver.getDevice()); Как мы можем заметить этого метода в описании интерфейса нет, но есть в классе, как получить доступ к экземпляру класса?
  19. Использую Delphi 10.3. Запускаю код программы, все работает. Как только увеличиваю размеры матриц, программа прекращает работу. В чем может быть проблема?
  20. Доброе время суток . Я только начал знакомится с потоками , не судите меня строго . Вот код . Смысл которого через отдельный поток загружать текст с сервера и отображать в memo. Что я делаю? На сервере из вне имеется файлкоторый по api запросам пополняется. Его нужно в потоке постоянно выводить в memo. подгружать каждый раз. При использовании на win вес работает, на андроид не качает и не сздает файл в чем может быть проблема? type ThreadHTTP = class(TThread) private public Stream: TMemoryStream; i: integer; procedure Execute; override; procedure ShowResult; end; {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := true; end; procedure TForm1.Timer1Timer(Sender: TObject); var MyHTTP: ThreadHTTP; begin ProgressBar1.Value := 0; MyHTTP := ThreadHTTP.Create(False); end; { ThreadHTTP } procedure ThreadHTTP.Execute; var j: integer; begin inherited; i := 0; j := 0; Stream := TMemoryStream.Create; Form1.IdHTTP1.Get('http://сайт/base.txt', Stream); Form1.ProgressBar1.Max := Stream.Size; while j <= Stream.Size do begin inc(i); Synchronize(ShowResult); inc(j); Form1.ProgressBar1.Value := Form1.ProgressBar1.Value + 1; end; Stream.SaveToFile(tpath.getdownloadspath + '/base.txt'); Form1.Memo1.Lines.LoadFromFile(tpath.getdownloadspath + '/base.txt'); Stream.Free; end; procedure ThreadHTTP.ShowResult; begin Form1.Label1.Text := IntToStr(i) + ' kbs'; end;
  21. Здравствуйте! Есть замечательная русская программа ТЕХТРАН: http://www.tehtran.com/nestf.html Мне нужен максимум такой же - минимум что предложите алгоритм (раскладки деталей на листе) работы в DELPHI что бы я его мог сам в дальнейшем исправлять и доделывать ТРЕБУЕТСЯ ТОЛЬКО АЛГОРИТМ ЗАПОЛНЕНИЯ ПРЯМОУГОЛЬНИК ОПРЕДЕЛЕННЫМИ КОНТУРАМИ, вся программа ТЕХТРАН у меня уже есть. Будут входные данные: Минимум это простейшие фигуры:размеры прямоугольников и окружностей - максимум это фигуры сложной формы в формате DXF(AutoCad) и их количества(примерно безгранично) для каждой фигуры будут параметры: Размеры(для простейших это толщина,ширина и длина; для DXF это толщина и файл DXF) - все в миллиметрах Кол-во (шт) Размер листа прямоугольный(пример: 10х1500х6000мм, 5х2000х3000мм, 100х100х3000мм) и их кол-во, скажет так первое значение это толщина, второе - ширина, третье - длинна. Разрешенные расстояния между фигурами и от края листа до фигур - все в миллиметрах Кол-во данных должно быть примерно безгранично На выходе надо получить требуемое-подходящее минимальное кол-во листов для всех фигур! Ну и соответственно визуализировать результат например на TImage Это не полное техзадание, но сколько примерно это будет стоить? Хотелось бы использовать это модуль на всех платформах, но как минимум это Windows. Заранее спасибо!
  22. Класс для работы с FastCGI серверами, такими как php-fpm. Для тех кто не в теме : веб-сервер, к примеру nginx, получает запросы и отправляет их на исполнение FastCGI серверу, к примеру php-fpm, php-fpm получает имя скрипта, параметры, выполняет все и возвращает результат в nginx, который в свою очередь возвращает этот результат запросившему клиенту. С помощью класса вы можете так же, выполнять php скрипты на локальном или удаленном сервере. Исходники https://github.com/EvgeniyKorepov/FastCGIClient Пример delphi var FFastCGI : TFastCGI; ... procedure TFormMain.FormCreate(Sender: TObject); var AHost : String; APort : Word; AScriptFileName, ARequest, AContent : String; begin AHost := '10.0.0.4'; APort := 9000; FFastCGI := TFastCGI.Create(AHost, APort); FFastCGI.KeepAlive := True; AScriptFileName := '/opt/xxx.php'; ARequest := 'request=1234567890'; if FFastCGI.Get(AScriptFileName, ARequest, AContent) then Memo.Text := AContent else Memo.Text := FFastCGI.StatusCode.ToString + ' ' + FFastCGI.StatusText; end; пример php <?php header('Content-Type: text/html; charset=utf-8'); if (isset($_REQUEST["request"])) if ($_REQUEST["request"] == "1234567890") { header("Status: 200"); echo 'OK'; } else { http_response_code(400); echo "ERROR"; }
  23. Я написал класс для демонизации приложения в linux. Класс форкает процесс, обрабатывает поступающие сигналы и передает их в основной поток через потокобезопасную очередь. Исходники https://github.com/EvgeniyKorepov/LinuxDaemon Для использования просто подключите модуль UnitDaemon в свое консольное приложение: program DaemonTest; {$APPTYPE CONSOLE} uses System.SysUtils, System.IOUtils, System.SyncObjs, Posix.Stdlib, Posix.SysStat, Posix.SysTypes, Posix.Unistd, Posix.Signal, Posix.Fcntl, Posix.Syslog in 'Posix.Syslog.pas', UnitDaemon in 'UnitDaemon.pas'; var AEventType : TEventType; begin syslog(LOG_NOTICE, 'main START'); while True do begin syslog(LOG_NOTICE, 'main LOOP'); if UnitDaemon.QueueEvent.PopItem(AEventType) = System.SyncObjs.TWaitResult.wrSignaled then begin syslog(LOG_NOTICE, 'main UnitDaemon.QueueEvent.PopItem'); case AEventType of TEventType.StopProcess : begin syslog(LOG_NOTICE, 'main Event StopProcess'); ExitCode := EXIT_SUCCESS; exit; end; TEventType.Start : begin syslog(LOG_NOTICE, 'main Event START'); end; TEventType.Reload : begin // Reload config syslog(LOG_NOTICE, 'main Event RELOAD'); end; TEventType.Stop : begin syslog(LOG_NOTICE, 'main Event STOP'); ExitCode := EXIT_SUCCESS; exit; end; end; end; Sleep(50); end; end. Так же поддерживается systemd - для этого положите DaemonTest.service в /etc/systemd/system/ и используйте : systemctl start DaemonTest.service systemctl reload DaemonTest.service systemctl stop DaemonTest.service
  24. Я недавно или давно писал по поводу почему компилятор при разном наборе USES увеличивает время компиляции где-то от 4 до 10 раз. То есть проект может компилируются за 10 секунд, а при небольших манипуляциях с USES станет компилироваться 40 секунд и тд. Очень хорошо заметно на большом проекте у меня с 1 минуты 18 секунд выросло время компила до 1 часа 40 минут. Ну хватит предыстории после анализа зависимостей и проверки логов обращения к файловой системе был выяснен интересный факт :) У меня в проекте появился UNIT в котором глобальные методы для так сказать конфигурирования внешнего вида компонентов (компоненты тоже самописные) и получилось следующая ситуация: 1. В UNIT с формой лежит один из визуальных компонентов назовем его TXXX 2. соответственно в первом (interface секции) USES данного модуля прописывается автоматом модуль из зависимостей компонента 3. В нижнем (implementation секции) USES расположен UNIT с глобальными методами (назовем его UNIT XXX) для так сказать конфигурирования его (установка бордера и другой дичи) 4. В этом UNIT XXX (interface секции) USES также прописаны модули этих визуальных компонентов для передачи их в методы как параметры. Так вот из-за такой ошибочной связи время компила увеличивается в разы и по анализу project dependency увеличивается с более менее приемлемых (по времени компиляции) 200 до 500. Из сходя из этого начала рефакторинг всего кода и переводить компоненты на интерфейсы это сокращает project dependency проекта и неплохо так, перевод одного компонента который используется почти везде в проекте на интерфейс сократил с 200 до 190 и время компила начала сокращаться. Сори за много букавок, но может кому будет интересно или кто с толкнулся с такой проблемой. Так же в решении и анализе взаимосвязей помог эксперт MMX.
  25. Ну всё в принципе как всегда, либо я барашка, либо лыжи не едут) А всё просто - я хочу, чтобы пока данные с сервера загружались по клику кнопки, пользователю элементарно был отклик в виде крутящейся какой нибудь фигни и он видел, что процесс идёт и что прога не зависла и никуда лишний раз не тыкал. Пока что для тестов сделала элементарно кнопку Update (speedbutton с image), данные элементарно грузятся и отображаются в GridPanel, а поверх него, чтоб пользователь и не смог куда либо тыкнуть, замостила панелькой с Image, вращаемой по таймеру (всё это дело наверху Visible:=false). И когда клацаем по кнопке Update, то панельку сверху грида делаю отображаемой и запускаю таймер, потом этот же обработчик/процедура грузит данные, а по окончанию останавливаем таймер и скрываем полупрозрачну, еще кстати, панельку. Аля вот так: procedure TForm1.SB_DataUpdateClick(Sender: TObject); begin //отображаем лого загрузки P_showLoad.Visible := true; Timer_load_rotate.Enabled := true; //с запуском таймера GetDeD_List(DE_set.Date); //процедура загрузки и отображения чего нам надо, которая весьма долго выполняется //и скрывае лого загрузки Timer_load_rotate.Enabled := false; //уже в обратном порядке P_showLoad.Visible := false; end; иии... ни черта не происходит как я хочу( Это лого вообще в итоге не отображается, а если убрать его скрытие, то оно у нас отобразится уже только тогда, когда всё загрузится. Логика мне стала подсказывать, что следовало его как то отобразить выполнив в параллельном асинхронном потоке аля так: procedure TForm1.SB_DataUpdateClick(Sender: TObject); begin TThread.Queue(TThread.Current, //TThread.Queue TThread.Synchronize ForceQueue procedure() begin P_showLoad.Visible := true; Timer_load_rotate.Enabled := true; end); GetDeD_List(DE_set.Date); //процедура загрузки и отображения чего нам надо, которая весьма долго выполняется end; И опять оно отображается только после того, как всё загрузится и проработает вся процедура. И уже чего только не пробовала и Synchronize и ForceQueue; и через TTask.Run и |task := TTask.Create(procedure () ... и т.д.| ничего не подходит, вот хоть убейся это всё дело будет отображаться только после полной отработки процедуры клика. Может я не в том направлении вообще рою и это как то по другому делается? Может я еще пока отлаживаю на Win32, а не всё на android, а там вот пара вариантов и норм на нём работают? Но чтот я никак не могу понять, что к чему... должно же быть как то просто, а я чтот никак не могу понять как(
×
×
  • Создать...