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

Евгений Корепов

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

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

  • Посещение

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

    100

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

  1. Like
    Евгений Корепов получил реакцию от Barbanel в Работа с атрибутами текста   
    Век живи, век учись. Спасибо, не знал о такой возможности. Поигрался в тестовом проекте - все действительно работает.
  2. Like
    Евгений Корепов получил реакцию от Brovin Yaroslav в Как застать TWebBrowser обрабатывать адреса эл. почты (Android)   
    Прошу прощения, я ввел вас в заблуждение (тестировал на одном своем проекте). Открытие подобных ссылок вы должны делать самостоятельно, обрабатывая событие браузера ShouldStartLoadWithRequest.
    Вот код:
    uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, {$ENDIF ANDROID} FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser, FMX.Controls.Presentation; ..... const ConstMainURL = 'http://www.docme.ru/contacts'; .... procedure THeaderFooterForm.WebBrowser1ShouldStartLoadWithRequest( ASender: TObject; const URL: string); begin if Not URL.StartsWith(ConstMainURL) then // Если ссылка перехода отличается от базовой, то открываем ее через активити begin WebBrowser1.Stop; OpenURL(URL); end; end; procedure THeaderFooterForm.OpenURL(const AUrl: string); {$IFDEF ANDROID} var Uri: Jnet_Uri; OpenLinkIntent: JIntent; {$ENDIF ANDROID} begin {$IFDEF MSWINDOWS} ShellExecute(0, 'open', PChar(AUrl), nil, nil, SW_SHOWNORMAL); {$ENDIF MSWINDOWS} {$IFDEF ANDROID} Uri := StrToJURI(AUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); TAndroidHelper.Activity.startActivity(OpenLinkIntent); {$ENDIF ANDROID} end; И прикрепляю ваш проект с моими изменениями
    WebPrj.zip
  3. Like
    Евгений Корепов получил реакцию от Ingalime в Как застать TWebBrowser обрабатывать адреса эл. почты (Android)   
    Все отлично обрабатывается и открывается. Любой браузер по определению должен это делать. У вас должна быть правильная ссылка на электронную почту, в примеру <a href="mailto:putin@russia.gov">Напишите письмо президенту</a>
    P.S. Или так, если хотите видеть адрес <a href="mailto:putin@russia.gov">putin@russia.gov</a>
  4. Like
    Евгений Корепов получил реакцию от Ingalime в Как застать TWebBrowser обрабатывать адреса эл. почты (Android)   
    Прошу прощения, я ввел вас в заблуждение (тестировал на одном своем проекте). Открытие подобных ссылок вы должны делать самостоятельно, обрабатывая событие браузера ShouldStartLoadWithRequest.
    Вот код:
    uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, {$ENDIF ANDROID} FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser, FMX.Controls.Presentation; ..... const ConstMainURL = 'http://www.docme.ru/contacts'; .... procedure THeaderFooterForm.WebBrowser1ShouldStartLoadWithRequest( ASender: TObject; const URL: string); begin if Not URL.StartsWith(ConstMainURL) then // Если ссылка перехода отличается от базовой, то открываем ее через активити begin WebBrowser1.Stop; OpenURL(URL); end; end; procedure THeaderFooterForm.OpenURL(const AUrl: string); {$IFDEF ANDROID} var Uri: Jnet_Uri; OpenLinkIntent: JIntent; {$ENDIF ANDROID} begin {$IFDEF MSWINDOWS} ShellExecute(0, 'open', PChar(AUrl), nil, nil, SW_SHOWNORMAL); {$ENDIF MSWINDOWS} {$IFDEF ANDROID} Uri := StrToJURI(AUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); TAndroidHelper.Activity.startActivity(OpenLinkIntent); {$ENDIF ANDROID} end; И прикрепляю ваш проект с моими изменениями
    WebPrj.zip
  5. Like
    Евгений Корепов отреагировална slav_z в Как сделать буквы разного цвета?   
    http://fire-monkey.ru/topic/5437-работа-с-атрибутами-текста/
  6. Thanks
    Евгений Корепов отреагировална slav_z в Работа с атрибутами текста   
    Как сделать текст с подобными атрибутами? Очень просто!
    (Цвет текста не работает в XE8) Вот весь код:
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.UIConsts, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.TextLayout; type TForm1 = class(TForm) Button1: TButton; Text1: TText; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} type TTextAccess = class(TText); procedure ClearTextAttribute(Text: TText); begin TTextAccess(Text).Layout.ClearAttributes; end; procedure AddTextAttribute(Text: TText; Pos,Length: Integer; FontStyles: TFontStyles; FontColor: TAlphaColor); var Font: TFont; begin Font:=TFont.Create; Font.Assign(Text.Font); Font.Style:=FontStyles; TTextAccess(Text).Layout.AddAttribute( TTextRange.Create(Pos,Length), TTextAttribute.Create(Font,FontColor)); end; procedure TForm1.Button1Click(Sender: TObject); begin AddTextAttribute(Text1,10,17,[TFontStyle.fsBold],claRed); AddTextAttribute(Text1,34,8,[TFontStyle.fsUnderline],claBlue); AddTextAttribute(Text1,47,8,[TFontStyle.fsStrikeOut],claGreen); Text1.Repaint; end; end.  
  7. Like
    Евгений Корепов отреагировална GASCHE в C наступающим Новым Годом!   
  8. Like
    Евгений Корепов получил реакцию от Ingalime в TMemo для вывода лога тормозит   
    Все ваши проблемы решаются добавлением трех строчек в код:
    Перед началом работы, сразу задаем количество строк Memo.Lines.Capacity:=1000000; Мемо сразу зарезервирует в своем TStringList нужный объем. Это позволит сократить накладные расходы на добавление в несколько раз. Перед добавлением строк в Memo обязательно делаем Memo.BeginUpdate; Это отключит перерисовку и другие операции. После добавления строк в Memo обязательно делаем Memo.EndUpdate; Это отрисует все изменения которые мы произвели. Вот итоговый код (в форме еще глобальный счетчик FLinesCounter : Integer;):
    procedure TForm1.FormCreate(Sender: TObject); Var I : Integer; begin Memo.Lines.Capacity:=1000000; Timer.Interval:=10; FLinesCounter:=1; Memo.BeginUpdate; for I := 1 to 10000 do begin Memo.Lines.Add('Это тест ' + FLinesCounter.ToString); Inc(FLinesCounter); end; Memo.EndUpdate; end; procedure TForm1.Button1Click(Sender: TObject); begin Timer.Enabled:=True; end; procedure TForm1.Log(const AMessage : String); const ConsMaxLogSize = 50000; begin Memo.BeginUpdate; // while Memo.Lines.Count > ConsMaxLogSize do // Memo.Lines.Delete(0); Memo.Lines.Add(AMessage); Memo.GoToTextEnd; Memo.EndUpdate; end; procedure TForm1.TimerTimer(Sender: TObject); begin Log('Это тест ' + FLinesCounter.ToString); Inc(FLinesCounter); end; Код добавляет в Мемо 10 тысяч строк за примерно пол секунды. И добавление по таймеру 100 строк в секунду отнимает примерно 0% процессорного времени. Все будет работать без тормозов до разумного предела, при очень больший количествах строк вы столкнетесь с тормозами выделения памяти приложению, тут нужно будет использовать иные механизмы.
     
  9. Like
    Евгений Корепов получил реакцию от GASCHE в TMemo для вывода лога тормозит   
    Все ваши проблемы решаются добавлением трех строчек в код:
    Перед началом работы, сразу задаем количество строк Memo.Lines.Capacity:=1000000; Мемо сразу зарезервирует в своем TStringList нужный объем. Это позволит сократить накладные расходы на добавление в несколько раз. Перед добавлением строк в Memo обязательно делаем Memo.BeginUpdate; Это отключит перерисовку и другие операции. После добавления строк в Memo обязательно делаем Memo.EndUpdate; Это отрисует все изменения которые мы произвели. Вот итоговый код (в форме еще глобальный счетчик FLinesCounter : Integer;):
    procedure TForm1.FormCreate(Sender: TObject); Var I : Integer; begin Memo.Lines.Capacity:=1000000; Timer.Interval:=10; FLinesCounter:=1; Memo.BeginUpdate; for I := 1 to 10000 do begin Memo.Lines.Add('Это тест ' + FLinesCounter.ToString); Inc(FLinesCounter); end; Memo.EndUpdate; end; procedure TForm1.Button1Click(Sender: TObject); begin Timer.Enabled:=True; end; procedure TForm1.Log(const AMessage : String); const ConsMaxLogSize = 50000; begin Memo.BeginUpdate; // while Memo.Lines.Count > ConsMaxLogSize do // Memo.Lines.Delete(0); Memo.Lines.Add(AMessage); Memo.GoToTextEnd; Memo.EndUpdate; end; procedure TForm1.TimerTimer(Sender: TObject); begin Log('Это тест ' + FLinesCounter.ToString); Inc(FLinesCounter); end; Код добавляет в Мемо 10 тысяч строк за примерно пол секунды. И добавление по таймеру 100 строк в секунду отнимает примерно 0% процессорного времени. Все будет работать без тормозов до разумного предела, при очень больший количествах строк вы столкнетесь с тормозами выделения памяти приложению, тут нужно будет использовать иные механизмы.
     
  10. Like
  11. Like
    Евгений Корепов отреагировална Nick Peterson в TTimer в FMX не проверяет EOutOfResources, (Win) почему?   
    Реализация VCL
    procedure TTimer.UpdateTimer; begin KillTimer(FWindowHandle, 1); if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then raise EOutOfResources.Create(SNoTimers); end;  
    В FMX иначе, интересно, почему так? есть какая то причина, или просто поленились дописать?
    procedure TTimer.UpdateTimer; begin {...} FTimerHandle := FPlatformTimer.CreateTimer(FInterval, Timer); if FTimerHandle = 0 then FEnabled := False; // Упс.. таймер просто молча сдохнет)) и будешь гадать что случилось с приложением, почему оно "зависло" end;  
  12. Like
    Евгений Корепов отреагировална AngryOwl в Как при переходе с эдита на эдит очистить предыдущий текст в клавиатуре, что бы он не попал в новый эдит?   
    Мне помогло следующее:
    TThread.Synchronize(nil, procedure begin memoChatMessage.Text := ' '; memoChatMessage.SelectAll; memoChatMessage.DeleteSelection; end);  
  13. Like
    Евгений Корепов получил реакцию от Maka в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  14. Like
    Евгений Корепов отреагировална ruslan в Push в Android   
    1) Спасибо за отклик.
    2) Мне не нужен "свой провайдер". Я могу отправить пуш прямо на device_token. Вопрос в том, как мне "подписаться" на прием пушей. 
    3) в FMX.PushNotification.Android  и так есть необходимый сервис для работы с GCM - TGCMPushService
    и в принципе, сделав
    gcm:= TGCMPushService.create;
    gcm.Register('мой app_id');
    можно вытащить DeviceToken и это работает и я это знаю
    4) Касается не только пушей
    Ну вот объясните мне: ЗАЧЕМ описывать типы в implementation ?? ну ЗАЧЕМ ? Из-за этого нельзя унаследоваться от типа, нельзя устранять "баги", потому что эти "баги" задействуют private\protected члены, к которым не получить доступ ни через class-хелперы, ни как по другому.
    Приходится тупо копи-пастить в новый юнит и там править баги, наследоваться и т.п.
     
    Тот же самый баг с камерой, кот. не исправляется еще с XE<хз_какой_старой> , исправляется ОДНОЙ строкой кода.
    Но нет же, нужно все "прятать" в implementation, что б пытливые программеры не лезли куда не нужно и не трогали "наши баги".
     
    Может я чего-то конечно не понимаю, но вот какой вообще смысл объявлять типы в implementation, а не как все белые люди ?
    Че-то меня опять понесло...
     
    А если по теме, то идеально конечно было бы пригласить в топик человека, который писал "систему" push-уведомлений. Думаю он смог бы многое пояснить.
    Мне кажется очень многих разработчиков волнует вопрос приема\отправки push'ей, т.к. это единственный(поправьте если не прав) способ гарантированно уведомить юзера 
    о каких-то событиях\обновлениях даже если андроид убил приложение. Не в смысле спамить всякую ересь, а реально если логика приложения сильно завязана на работу с БД, взаимодействие юзеров, таски там всякие, обмен сообщениями, и сложную корпоративную бизнес-логику.
    Опять понесло...
     
    Тема очень актуальная уже для нескольких разрабов, которые рискнули начать фаирманчить под десктоп\иос\андроид.
     
    Поправьте если что не так пишу\понимаю\делаю
    Заранее спасибо за помощь
  15. Like
    Евгений Корепов отреагировална beeoz в TExpander глюки при при isExpanded=False   
    Проблема сохранилась и в IDE Delphi Rio 10.3 . Причиной оказалось то, что в модуле FMX.StdCtrls в процедуре TExpander.UpdateControlSize указана переменная FContentHeight вместо FContent.Height
    procedure TExpander.UpdateControlSize(const ChangingState: Boolean); begin FChangingState := ChangingState; try if FIsExpanded then begin FContent.Visible := FIsExpanded; if FButton <> nil then Height := FButton.Height + FContent.Height; // здесь заменил FContentHeight на FContent.Height и заработало Repaint; end else begin Repaint; FContent.Visible := FIsExpanded; if FButton <> nil then Height := FButton.Height; end; finally FChangingState := False; end; end;  
  16. Like
    Евгений Корепов отреагировална Brovin Yaroslav в [TMultiView] Как избежать задержки при первом появлении TMultiView?   
    Так, я посмотрел. Сохраняем себе такую процедуру:
    procedure PreloadContent(const Control: TControl); var I: Integer; begin if Control is TStyledControl then TStyledControl(Control).ApplyStyleLookup; for I := 0 to Control.ControlsCount - 1 do PreloadContent(Control.Controls[I]); end; Она форсирует загрузку стилей. Задержка при появлении TMutliView заключается в том, что стиль загружается не сразу у любого контрола, а только по мере появления контрола. Обычно это происходит при первой отрисовки. Это правило касается всех контролов.
     
    Поэтому, в этом случае, вам нужно форсировать загрузку стилей. Это можно сделать при помощи моей процедуру PreloadContent.
    Добавьте в TForm.OnCreate и это решит задержку при первом появлении:
    PreloadContent(MultiView1);
  17. Like
    Евгений Корепов отреагировална Brovin Yaroslav в С днем рождения Андрей Ефимов ???   
    Хочу от всей души поздравить с днем рождения нашего модератора Андрея Ефимова @Andrey Efimov. Человек, на которого можно положиться и который всегда готов прийти на помощь. Из года в год помогает нашему форуму становиться лучше. 
    С днем рождения! Успехов тебе в работе, в личных делах. И не забывать про Делфи!
  18. Like
    Евгений Корепов получил реакцию от zxas в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  19. Like
    Евгений Корепов получил реакцию от master webs в GCM исчез, теперь Firebase Cloud Messaging, но как?   
    Спасибо огромное! Опять начал это делать, все забыл, каждый раз как заново ) Начал гуглить и тут раз  - и моя же тебя с вашим ответом! Все помогло!
  20. Like
    Евгений Корепов получил реакцию от Yarpda в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  21. Like
    Евгений Корепов получил реакцию от IVGSoft в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  22. Like
    Евгений Корепов получил реакцию от Barbanel в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  23. Like
    Евгений Корепов получил реакцию от Alex7wrt в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  24. Like
    Евгений Корепов получил реакцию от AngryOwl в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
  25. Like
    Евгений Корепов получил реакцию от #WAMACO в Проигрывание стандартных звуковых эффектов Android   
    Задался вопросом, нашел ответ, может кому пригодится.
    uses Androidapi.JNI.Media, Androidapi.Helpers, Androidapi.JNIBridge, AndroidApi.Jni.JavaTypes, Androidapi.JNI.GraphicsContentViewText; .... procedure TFormMain.PlaySoundEffects(const ASoundID : Integer; AVolume : Single = 1.0); var AudioObj: JObject; Audio: JAudioManager; begin AudioObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.AUDIO_SERVICE); Audio:= TJAudioManager.Wrap((AudioObj as ILocalObject).GetObjectID); Audio.loadSoundEffects; Audio.playSoundEffect(ASoundID, AVolume); end; Константы звуковых эффектов тут https://developer.android.com/reference/android/view/SoundEffectConstants
    Правда у меня только звук "чпок" на всех константах. Но мне он и был нужен )
×
×
  • Создать...