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

#WAMACO

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

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

  • Посещение

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

    27

Активность репутации

  1. Like
    #WAMACO получил реакцию от Anatoliy в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку   
    Слишком много ЕСЛИ.... 
    Задачи разные бывают и приложения тоже. Мы говорим про конкретную задачу отправки письма из приложения. Способов несколько, использование Indy позволяет это сделать без стороннего хостинга.
    А через неделю и Ваш хостинг может загнуться, ввиду не оплаты, форс мажора и т.д.
  2. Like
    #WAMACO отреагировална dnekrasov в Замена стандартного курсора формы на кастомное изображение   
    Ещё как работает, во всяком случае под винду. Но именно курсора (cur) а не изображения (bmp).
    CustomCursor.zip
  3. Like
    #WAMACO получил реакцию от dnekrasov в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку   
    По-моему, Вы не знаете, как работает Indy. Используя эти компоненты, можно послать письмо, минуя свой сервер, вы сразу настраиваете параметры отсылки, аналогично, любому почтовому клиенту и отсылаете письмо! 
    например, я не знаю и знать не хочу PHP и сервера у меня нет! как мне отослать письмо с приложения? INDY спешит на помощь!
    Вот пример:
    var   SMTP    : TIdSMTP;   msg     : TIdMessage;   SSLOpen : TIdSSLIOHandlerSocketOpenSSL; begin   SMTP := TIdSMTP.Create(Application);   SMTP.Host := 'smtp.mail.ru';   SMTP.Port := 465;   SMTP.AuthType := satDefault;   SMTP.Username := 'моя почта@mail.ru';   SMTP.Password := 'пароль от моей почты ';     //это необходимо использовать для SSL   SSLOpen := TIdSSLIOHandlerSocketOpenSSL.Create(nil);   SSLOpen.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);   SSLOpen.Host := SMTP.Host;   SSLOpen.Port := SMTP.Port;   SSLOpen.DefaultPort := 0;   SSLOpen.SSLOptions.Method := sslvSSLv23;   SSLOpen.SSLOptions.Mode := sslmUnassigned;     SMTP.IOHandler := SSLOpen;   SMTP.UseTLS := utUseImplicitTLS;     msg := TIdMessage.Create(Application);   msg.Subject := 'Проверка почты';   msg.From.Address := 'моя почта@mail.ru';   msg.From.Name := 'AlexF';   msg.Recipients.EMailAddresses := 'почта получателя@yandex.ru';     SMTP.Connect;   if SMTP.Connected then     begin       SMTP.Send(msg);       ShowMessage ('Сообщение отправлено');     end else       ShowMessage ('Не удалось отправить сообщение');   SMTP.Disconnect();   SMTP.Free;   msg.Free; end;
  4. Like
    #WAMACO получил реакцию от Anatoliy в Большие графические файлы   
    И используйте TSurfaceBitmap 
  5. Like
    #WAMACO отреагировална Alex7wrt в Исправление отображения Smart Banner, Android   
    Обнаружил, что на некоторых телефонах с вытянутым экраном не отображается Smart Banner (TBannerAD.Size = Auto). Оказалось, что причиной тому неверный расчет высоты баннера в исходниках FMX.Advertising.Android. 
    Может быть, эта информация кому-нибудь поможет
     
    В документации Android высота баннера должна вычисляться так:

    Тогда как в коде FMX.Advertising.Android она вычисляется в процедуре UpdateControlMetrics следующим образом:
    const AdHeightPortrait = 90; AdHeightLandscape = 90; AdHeightPhonePortrait = 50; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then if Screen.Size.Width < AndroidSW600DP then FAdControl.Height := AdHeightPhonePortrait else FAdControl.Height := AdHeightPortrait else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; Также, учитывая, что на вытянутых экранах (по крайней мере на тех устройствах, на которых я тестил), Screen.Width и Screen.Height далеко не всегда дают верные значения, то более правильный код процедуры TAndroidBannerAd.UpdateControlMetrics будет таким:
    procedure TAndroidBannerAd.UpdateControlMetrics; var Frame: TRectF; Form: TCommonCustomForm; Disp: JDisplayMetrics; Window: JWindow; h: integer; const AdHeightLandscape = 90; AdHeightPhoneLandscape = 32; AndroidSW600DP = 600; AndroidSW600DPLandscape = 552; AdMobBannerHeight = 50; AdMobFullBannerHeight = 60; AdMobLeaderboardHeight = 90; begin if (FAdControl <> nil) and not Assigned(FAdControl.OnResize) then begin Disp := TJDisplayMetrics.Create; Window:=TJWindow.Wrap((MainActivity.getWindow as ILocalObject).GetObjectID); Window.getWindowManager.getDefaultDisplay.getRealMetrics(disp); h:=round(Disp.heightPixels/Disp.density); case FAdControl.AdSize of TBannerAdSize.Auto: begin if Screen.Size.Height > Screen.Size.Width then begin if h <= 400 then FAdControl.Height := 32 else if (h>400) and (h<=720) then FAdControl.Height:=50 else FAdControl.Height := 90 end else if Screen.Size.Height < AndroidSW600DPLandscape then FAdControl.Height := AdHeightPhoneLandscape else FAdControl.Height := AdHeightLandscape; end; TBannerAdSize.Small: FAdControl.Height := AdMobBannerHeight; TBannerAdSize.Medium: FAdControl.Height := AdMobFullBannerHeight; TBannerAdSize.Large: FAdControl.Height := AdMobLeaderboardHeight; end; if Screen.ActiveForm <> nil then Form := Screen.ActiveForm else if Application.MainForm <> nil then Form := Application.MainForm else Form := nil; if Form <> nil then begin Frame := WindowHandleToPlatform(Form.Handle).Bounds; FAdControl.Width := Round(Frame.Width); end; end; end;  
  6. Like
    #WAMACO получил реакцию от Anatoliy в XE8, не могу установить соединение с базой Sqlite на устройстве под Android   
    в папку с exe положи sqlite3.dll
    скачать последнюю версию можно с sqlite.org
  7. Like
    #WAMACO отреагировална Barbanel в Размеры формы на разных устройствах   
    Этот код был на этом форуме. Смотрите переменную sScale
    if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then begin sScreenSize := ScreenService.GetScreenSize.Round; sScale := ScreenService.GetScreenScale; DeviceInfo.diScreenLogic := FloatS(sScreenSize.x) + ' x ' + FloatS(sScreenSize.y); DeviceInfo.diScreenPhis := FloatS(sScreenSize.x * sScale) + ' x ' + FloatS(sScreenSize.y * sScale); DeviceInfo.diScreenWidth := sScreenSize.x; DeviceInfo.diScreenHeight := sScreenSize.y; DeviceInfo.diScale := sScale; end;  
    Одно из наших приложений, в архиве чуть побольше фоточек чтобы вы убедились что все действительно хорошо. Ну, заодно и критику от коллег смогу услышать))
    PS. не обращайте внимания на язык, так задумано)
    приложение делается для школ Германии.

    Screens.zip
  8. Like
    #WAMACO отреагировална Barbanel в Идентификация устройства   
    Всем доброго времени!
    Как и обещал, выкладываю либы для работы с KeyChain.
    Либы были взяты у братьев-китайцев, ни слова про покупку сказано не было (хотя чтобы выкачать их пришлось заплатить какому-то облачному сервису).
    Использовать просто, за все отвечают три функции: 
    function StoreItemToKeychain(const AServiceName, AKey, AValue: string; const bOverride: Boolean=True): Boolean; function GetItemValueFromKeychain(const AServiceName, AKey: string): string; function DeleteItemFromKeychain(const AServiceName, AKey: string): Boolean; Ну и традиционно нужно подключить саму библиотеку, все находится в аттаче.
    Enjoy! ?
    iOS_KeyChain.zip
  9. Thanks
    #WAMACO отреагировална ENERGY в Не оптимизированный TLabel и TText (решение)   
    Есть такая процедура, function DelAmp(const Text: string): string; в FMX.Types.
    Которая 2 раза выделяет память для всей строки, и сканирует все символы в строке, в поисках &.
     
    TLabel.Text  := 'Text';  - эта процедура  выполнится 2 раза, на любой платформе. Чтобы она выполнилась 1 раз, нужно сделать
    TLabel.PrefixStyle := TPrefixStyle.NoPrefix;
     
    TText 
    TText.Text  := 'Text'; Процедура DelAmp выполниться в любом случае на любой платформе
    procedure TText.SetText(const Value: string); [..] begin   if Text <> Value then   begin     NewText := ConvertText(DelAmp(Value)); [..] Стили состоят из множества TText элементов. Теперь представьте сколько ресурсов тратиться впустую.
     
    function DelAmp(const Text: string): string; var I, J: Integer; Sb: TCharArray; begin Result := ''; if Text <> '' then begin SetLength(Sb, Text.Length); I := Low(Text); J := 0; while I <= High(Text) do begin if (Text[I] <> '&') then begin Sb[J] := Text[I]; Inc(J); end else begin if ((I < High(Text)) and (Text[I + 1] = '&')) then begin Sb[J] := Text[I]; Inc(J); Inc(I); end; end; Inc(I); end; Result := string.Create(Sb, 0, J); end; end;  
     
    Решение - скопировать FMX.Types в папку с проектом, и переделать функцию на:
     
    function DelAmp(const Text: string): string; begin   Result := Text; end;  
  10. Haha
    #WAMACO отреагировална Равиль Зарипов (ZuBy) в Тестирование на ферме устройств   
    только ручками тестить, просить по братски потестить кого нить
  11. Like
    #WAMACO получил реакцию от Равиль Зарипов (ZuBy) в TWebBrowser. Убрать горизонтальный скрол, убрать вертикальный скрол   
    Ну так это решается макетом HTML. Сделайте его адаптивным по ширине браузера и все!
  12. Haha
    #WAMACO отреагировална Mars M в Embarcadero.... Community Edition!   
    Ну мой коммент был на счет того что там всё урезано по самое нихочу, так что об этом
    Я сам не раз сталкивался когда клиенты говорят что я как то не так ценовую политику устанавливаю, а если бы сделал вот так то круто было бы
    И для каждого круто это как ему дешевле и удобней. Так что можно сколько угодно спорить, но то что вышла эта версия очень хорошо.
    Я знаю пару человек которые вот с такими же словами(ну плюс ещё про то что делфи умер) переходили на другие языки, потом у них что то там не сросталось, понимали что "там" оказывается только на словах всё хорошо было, а в реалиях проблем не меньше, в общем кто плотником в итоге стал, кто ещё кем то. Не жалеют конечно, но беготня за травой которая зеленее не всегда на пользу идет.
    Думаю с ружьём возле каждого программиста никто стоять не будет, так что заработай 10..50000 в год никто и не заметит
    Ведь на пиратских зарабатывают, а сейчас хоть сказать можно, типа не доглядел, забылся
  13. Like
    #WAMACO получил реакцию от Ingalime в Embarcadero.... Community Edition!   
    Расскажу про себя. Я купил Delphi Professional за 86 тыщ. Окупилась с первого заказа. Срок выполнения заказа 2 недели. 
    Плюсы покупки - поддержка, обновления, спокойствие.  
    Если бы для себя развлекаться то Community! 
    Поэтому о чем собственно разговор, мне непонятно. 
    P.S. Иногда покупать ПО очень не страшно!
  14. Thanks
    #WAMACO получил реакцию от Gingercat в Embarcadero.... Community Edition!   
    Расскажу про себя. Я купил Delphi Professional за 86 тыщ. Окупилась с первого заказа. Срок выполнения заказа 2 недели. 
    Плюсы покупки - поддержка, обновления, спокойствие.  
    Если бы для себя развлекаться то Community! 
    Поэтому о чем собственно разговор, мне непонятно. 
    P.S. Иногда покупать ПО очень не страшно!
  15. Like
    #WAMACO отреагировална Alex7wrt в Audio Streaming   
    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.
    Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.  
    uses FMX.Radio.Bass; var BLoaded: boolean; chanPlay, ChanMic: Dword; avail, freq: word; buffer: TIDBytes; procedure TForm1.OnCreate(Sender: TObject); begin //Создаем UDP сервер UDP_Rec:=TIDUDPServer.Create; with UDP_Rec do begin DefaultPort:=UDP_RecPort; BufferSize:=1600; BroadcastEnabled:=true; Active:=true; end; freq:=16000; //Частота дискретизации setlength(buffer,UDP_Rec.BufferSize); BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку BASS_RecordInit(-1); //Инициализируем запись end; //Захват звука с микрофона procedure TForm1.Recording(Sender: TObject; const Point: TPointF); begin isrecording:=not isrecording; if isrecording then begin UDP_Rec.OnUDPRead:=nil; chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil); VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP end end; //Передача буффера в потоке procedure TVoiceThread.Execute; begin while isrecording do begin try avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE); if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем try BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize); UDP_Rec.Broadcast(Buffer,UDP_RecPort); except end; end; finally sleep(20); end; end; BASS_ChannelStop(chanmic); BASS_StreamFree(chanmic); end; //Создание канала для воспроизведения звука из буффера: procedure TForm1.receiving(Sender: TObject); begin chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil); UDP_Rec.OnUDPRead:=UDP_RecRead; BASS_ChannelPlay(chanPlay, false); end; //Получаем буффер из UDP procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin try BASS_StreamPutData(chanPlay, AData,length(AData)) except end; end; Bass.zip
  16. Like
    #WAMACO получил реакцию от Alex7wrt в GDPR, защита персональных данных   
    Ничего делать не надо. Обновление политики обработки персональных данных по рекламе головная боль Google, а не Ваша. 
  17. Like
    #WAMACO отреагировална Barbanel в Программирование на Delphi для Web (RADical WEB) от TMS   
    Всем привет!
    Не реклама, просто думаю это будет интересно.
    Был в прошлый четверг на семинаре от TMS, где они представляли свою новую разработку:
    создание приложений для Web на Delphi, прямо в IDE.
    Пайплайн примерно такой:
    -в студию устанавливается плагин, который добавляет в опции проекта и опции ИДЕ настройки для веб
    -создается приложение на основе ихнего шаблона, и использует FNC-компоненты (ессно от TMS)
    -приложение пишется практически как обычное VCL-приложение на языке Delphi, только в пространстве имен FNC
    -для использования контролов на форме (т.е. в окне браузера) они перевели практически все необходимые контролы
    -после компиляции студия запускает браузер, и ваше приложение работает в браузере.
    Как это работает:
    -под капотом ихний собственный т.н. DelphiToJavaScript Compiler, построенный на основе опенсорсного FPC
    -этот компилятор читает дельфи-код и преобразовывает его в яваскритп
    -есть возможность использовать как шаблон формы свой собственный HTML
    -HTML также может быть сгенерирован компилятором автоматически
    -можно использовать CSS
    -можно подгружать свои собственные js-библиотеки (не показывали как, но утверждают что можно)
    -после запуска студия открывает браузер и стартует ваше приложение в браузере
    -приложение можно дебажить, НО:
      -а) только в браузере
      -б) браузер получает от студии map-файл с инфой для отладки, и отображает исходный код на дельфи (это показали, действительно в браузере код на дельфи, и деже отображаются значения переменных)
    -можно подключаться к БД посредством REST-технологии, все запросы к БД при этом работают асинхронно
      дополнение) можно писать серверное приложение, которое будет принимать и обрабатывать эти запросы к БД, т.е. аналог фронтэнда и бэкэнда можно писать на дельфи
    -приложение выполняется полностью в браузере
    -минимальный размер приложения был от 250кб, утверждалось что если пройтись спец. оптимизатором по ява-коду, то будет еще меньше


    Мое личное имхо:
    очень интересно, мы будем это у себя пробовать.
    Лично я раньше не очень уважал TMS и их поделки, но пообщавшись с их командой изменил свое мнение, эта работа действительно очень впечалила.

    PS. это не реклама и я никак не причастен к TMS и этой разработке, просто считаю что это интересная тема, и залуживает чтобы ее немного осветили.
  18. Haha
    #WAMACO получил реакцию от Равиль Зарипов (ZuBy) в Debugger paramentr и activity android:name   
    Это фиаско, брат! Никогда, ни при каких обстоятельствах не устанавливай этот параметр! Все кончено! Закрывай студию!
  19. Like
    #WAMACO получил реакцию от Archi_Ku в C++Builder XE10 & ShowModal   
    У меня такое же ощущение от Xamarin, но это не значит что на нем никто ничего не пишет, просто у меня не зашло!
    Так же с Android Studio, а с XCode все чин чином! Но кто то плюется на XCode!
    Не скажу что отлично владею Delphi, но как то отвращение не вызывает, даже не смотря на некоторые баги и танцы с бубном!
    А вот Java бесит! Так что кому что нравится!
  20. Like
    #WAMACO получил реакцию от rareMax в Убрать поле при сериализации   
    TBar = class private FValue1: Integer; // FFoo: TFoo; public Value2: Integer; property Value3: Integer read FValue1 write FValue1; // property Foo: TFoo read FFoo write FFoo; end; Попробуй так...
  21. Like
    #WAMACO отреагировална r@di0 в Изменение стандартного звука а push-уведомлении   
    Дополнение: иногда нужно, чтобы уведомления не накапливались, а отображалось только последнее. Поправил класс NotificationPublisher (см. аттач), чтобы при наличии в данных параметра "unique": false обновлялось последнее сообщение, а не добавлялись новые.
    NotificationPublisher.zip
  22. Like
    #WAMACO отреагировална ENERGY в Круглая кнопка   
    Если кому то нужна круглая кнопка со сглаживанием под Android\iOS - то ставьте компоненты @Равиль Зарипов (ZuBy), сделанные на основе модуля FMX.Graphics.Native.pas от одного китайского программиста.
    https://github.com/rzaripov1990/ZMaterialComponents ( тут все готово, сам модуль отдельно скачивать не надо.)
    Дальше кидаем TZNativeDrawFigureCircle1, в него лэйбл и TColorAnimation как указано выше.  
    OnClick работает без проблем, только не забудьте поставить кругу HitTest := true, а у лэйбла false. 
  23. Like
    #WAMACO получил реакцию от Евгений Корепов в Delphi 10.2.3, AdBanner, Java, trouble   
    embarcadero выпустили патч исправляющий эту ошибку
    RAD Studio 10.2.3 Android Push Notification Patch
    This patch resolves an issue with push notifications on Android due to missing files.
    It fixes the following publicly reported issue: RSP-20137
    English, French, German and Japanese
    Available only to registered users of RAD Studio, Delphi, C++Builder 10.2 (Professional or higher) and All-Access
  24. Like
    #WAMACO отреагировална Евгений Корепов в Поток на клиенте   
    Накидал вам пример с использование потокобезопасной очереди.
    Логика работы такая - поток получает данные и заталкивает их в очередь, в главной форме, в таймере (можно изменить на OnIdle), проверяем очередь на наличие данных, если данные есть, то обрабатываем их.
    Обратите внимание на процедуру создания очереди - FQueue:=TThreadedQueue<TRec_Data>.Create(100, 1000, 10); где первый параметр размер очереди (100), второй таймаут заталкивания данных в очередь (1000мс = 1сек), третьй таймаут вытаскивания из очереди (10 мс - маленький,  чтоб таймер у нас не подвисал в ожидании).
    Вот код проекта целиком
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Generics.Collections, IdTCPClient, IdGlobal, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo; type TRec_Data = record Flag: array[0..20] of char; end; TMyThread = class(TThread) private Progress: string; Client : TIdTCPClient; FQueue : TThreadedQueue<TRec_Data>; protected procedure Execute; override; public constructor Create(const AQueue : TThreadedQueue<TRec_Data>); destructor Destroy; override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FQueue : TThreadedQueue<TRec_Data>; FMyThread : TMyThread; Timer : TTimer; procedure OnTimer(Sender: TObject); public Memo1: TMemo; { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin FQueue:=TThreadedQueue<TRec_Data>.Create(100, 1000, 10); Timer:=TTimer.Create(Self); Timer.Interval:=100; Timer.OnTimer:=OnTimer; Timer.Enabled:=True; FMyThread:=TMyThread.Create(FQueue); FMyThread.Start; end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(FMyThread) then begin FMyThread.Terminate; FMyThread.WaitFor; FMyThread.Free end; if Assigned(Timer) then Timer.Free; if Assigned(FQueue) then FQueue.Free; end; procedure TForm1.OnTimer(Sender: TObject); Var ARec : TRec_Data; begin // while FQueue.PopItem(ARec) = TWaitResult.wrSignaled do или if FQueue.PopItem(ARec) = TWaitResult.wrSignaled then Form1.Memo1.Lines.Insert(0, ARec.Flag); end; constructor TMyThread.Create(const AQueue : TThreadedQueue<TRec_Data>); var Rec: TRec_Data; Buffer: TIdBytes; begin inherited Create(true); FQueue:=AQueue; Client := TIdTCPClient.Create(nil); Client.Host := '127.0.0.1'; Client.Port := 6000; Client.Connect; // Передаем данные if Client.Connected = True then begin Rec.Flag := 'addUser'; Buffer := RawToBytes(Rec, SizeOf(Rec)); Client.IOHandler.Write(Buffer); end; end; destructor TMyThread.Destroy; begin if Assigned(Client) then Client.Free; inherited; end; procedure TMyThread.Execute; var Rec: TRec_Data; Buffer: TIdBytes; begin while Not Terminated do begin if Client.Connected then begin Client.IOHandler.ReadBytes(Buffer, SizeOf(Rec)); BytesToRaw(Buffer, Rec, SizeOf(Rec)); Progress := Rec.Flag; // Synchronize(SetProgress); FQueue.PushItem(Rec); end else Client.Connect; TThread.Sleep(10); end; end; end. Так же обратите внимание, я переписал ваш метод Execute на правильный. В вашей реализации, поток завершался при потере соединения.
  25. Like
    #WAMACO отреагировална WinterSun в Объявления процедур и функций горячими клавишими   
    Здравствуйте. 
    Shift+Ctrl+C
    Delphi-Default-IDE-Shortcut-Keys.pdf
×
×
  • Создать...