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

AngryOwl

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

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

  • Посещение

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

    45

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

  1. Like
    AngryOwl отреагировална Brovin Yaroslav в Feature and bug fix list for RAD Studio 10.1 Berlin Subscription Update 2 - Anniversary Edition   
    Прочитать всю новость целиком на сайте Embarcadero
  2. Like
    AngryOwl отреагировална dnekrasov в Плоская кнопка (желательно с картинкой)   
    Конечно можно. Что-то вроде этого:

  3. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Как правильно передать полученные значения в потоке в главную форму приложения?   
    procedure Parsing(URLToPars: string; aListView: TListView); var TempText: string; HeadMatches, MsgMatches: TMatchCollection; CountPagesMatch: TMatch; i: Integer; HeadRegularExprString: string; MsgRegularExprString: string; begin // вот это место, которое хотелось бы видеть с в потоке и с индикатором: <form1>.AniIndicator1.Enabled := true; // вот это место, которое хотелось бы видеть с индикатором TTask.Run( procedure begin HTMLText := IdHTTP1.Get(URLToPars); // выполняем загрузку файла из интернета; CountPagesMatch := TRegEx.Match(HTMLText, 'max="(.*?)".*value="(.*?)"'); HeadRegularExprString := 'class="date">(.*?)<.*?class="id">(.*?)<'; MsgRegularExprString := 'class="text">(.*?)<\/div>'; HeadMatches := TRegEx.Matches(HTMLText, HeadRegularExprString, [roIgnoreCase, roMultiLine]); MsgMatches := TRegEx.Matches(HTMLText, MsgRegularExprString, [roIgnoreCase, roMultiLine]); TThread.Synchronize(TThread.CurrentThread, procedure begin aListView.Items.Clear; if HeadMatches.Count = MsgMatches.Count then begin for i := 0 to HeadMatches.Count - 1 do begin TempText := HTMLClear(MsgMatches.Item.Groups[1].Value); with aListView.Items.Add do begin Data['DateText'] := HeadMatches.Item.Groups[1].Value; Data['CitateText'] := HeadMatches.Item.Groups[2].Value; Data['MainText'] := TempText; Data['imgCopy'] := il1.Bitmap(TSizeF.Create(36, 36), 0); Data['imgSend'] := il1.Bitmap(TSizeF.Create(36, 36), 1); end; end; end else ShowMessage('Ошибка загрузки данных!'); <form1>.AniIndicator1.Enabled := false; end); end); end;  
  4. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Как правильно передать полученные значения в потоке в главную форму приложения?   
    //uses System.Threading; var aData: string; begin TTask.Run( procedure begin aData := idHttp1.Get('url'); // выполняем загрузку файла из интернета; TThread.Synchronize(TThread.CurrentThread, procedure begin Memo1.Text := aData; // выполняем действия связанные с визуальными компонентами end); end); end;  
  5. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в DeviceInfo - модуль для получения информации о девайсе   
    исправлен баг на IOS, крах происходит при подключении модуля FMX.PhoneDialer.pas (IOS)
    теперь нет возможности получить информацию об операторе (IOS)
    Обновленная версия
  6. Like
    AngryOwl отреагировална Brovin Yaroslav в [Android] Почему возникает ошибка ECanvasException 'Handle not allocated'?   
    Дело в том, что у вас Image1.Bitmap, как экземпляр класса TBitmap присутствует. НО в нем нету никакой информации. То есть по факту у него размер равен 0 на 0. Это значит, что для него хендл не будет выделяться (Зачем системе хранить пустой битмап). Поэтому, когда вы пытаетесь с ним поработать и получить доступ к канве, то получаете такую ошибку:
    raised exception class ECanvasException with message 'Handle not allocated' Теперь смотрим ваш код:
    Image1.Bitmap.Canvas.BeginScene; Будет работать с канвой, но хендла нет. отсюда будет исключение.
    Image1.Bitmap.Clear(0); Опять же работает с канвой и пытается очистить пустой битмап.
    Image1.Bitmap.LoadFromStream(MemStream); Это корректный вызов, при загрузке нового битмапа будет выделен хендл на уровне Image1.Bitmap.
    Соответственно, вам нужно:
    Сформировать новый битмап Загрузить его в Image1.Bitmap На Windows используется GDI+/Direct2D канва, которая может работать по другому. А на мобильных платформах GPU, поэтому у вас и возникает ошибка.
  7. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в [Android] Почему возникает ошибка ECanvasException 'Handle not allocated'?   
    Image1.Bitmap.Canvas.BeginScene; ... Image1.Bitmap.Canvas.EndScene; это тут не нужно, т.к. не работаете с Canvas'ом
  8. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Не работают стили на другом компьютере   
    сохранить стиль в файл рядом Windows 10 Desktop нажать на кнопку удаления Добавить новый стиль, там должно быть написано WIndows Загрузить сохраненный стиль
  9. Like
    AngryOwl отреагировална Andrey Efimov в Кому нужны программисты Fire Monkey?   
    Из моих наблюдений за 2014-2015 год, вакансии "Программист Delphi" на рынке есть, но их мало и требования в них просто жесть, т.е. работодатель хочет сразу получить очень опытного программера и платить ему копейки. Они не допускают даже возможности стажировки с целью дальнейшего принятия на постоянную основу...
     
     
    Я в далёком 2004, мечтал, что на Делфи можно будет писать под смартфоны. Сбылось, долго... но сбылось
     
    А все кто пытается похоронить Делфи пускай лесом идут... Не нравится, не лезь в чужую песочницу...
  10. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Кому нужны программисты Fire Monkey?   
    чтобы не мучаться нужно больше чем раз в месяц бывать на форуме.
    а вообще и работа есть и нет желания учить языки которые умеют столько же, сколько и делфи.
    просто нужно учится пользоваться инструментом, а не наваливаться на разного рода шлак.
     
    прмиеры реализации сложных приложении есть, нужны просто прямые руки и понимание того что делаете.
    и этим реализациям даже не помешало, что они были написаны на версиях старее Seattle
    (на которых якобы совсем нельзя было написать приличное приложение)
  11. Like
  12. Like
    AngryOwl отреагировална Pax Beach в [TVideoCaptureDevice] Как оптимизировать скорость считывания данных с камеры?TVideoCaptureDevice   
    Я знал, что вы спросите )
    Еще разбираюсь с некоторыми параметрами.
    Пусть побудет интрига, часа через 4 закончу с делами, создам отдельный топик по этому поводу, все расскажу.
     
    UPD:
    Собственно, если не терпится узнать, все написано здесь.
  13. Like
    AngryOwl отреагировална Rusland в [TVideoCaptureDevice] Как оптимизировать скорость считывания данных с камеры?TVideoCaptureDevice   
    Нет смысла спрашивать у человека, который задал единственный вопрос на форме и больше не появлялся )
    Хотя меня тоже интересует тема записи видео в Android
  14. Like
    AngryOwl отреагировална dnekrasov в Таймер в сервисе   
    В архиве - простенький проект. Протестирован на Win и OSX.
     
    TimerThreadDemo.zip
  15. Like
    AngryOwl отреагировална dnekrasov в Таймер в сервисе   
    Когда-то, лет 5 назад у меня возникла такая-же проблема, только в Win32-сервисе. Тогда, для её решения, я написал 2 простеньких класса.
    Вот код, может пригодится?
    unit Utils.TimerThread; interface uses System.Classes, System.SysUtils, System.SyncObjs; type TCustomTimerThread = class abstract (TThread) private FLock: TCriticalSection; FCancelledEvent: TSimpleEvent; FInterval: Integer; FOnTimer: TNotifyEvent; function GetInterval: Integer; function GetOnTimer: TNotifyEvent; procedure SetInterval(const Value: Integer); procedure SetOnTimer(const Value: TNotifyEvent); protected procedure Lock; procedure Unlock; procedure Sleep(AInterval: Integer); reintroduce; procedure TerminatedSet; override; procedure DoOnTimer; virtual; public constructor Create(AInterval: Integer; AOnTimer: TNotifyEvent); reintroduce; procedure BeforeDestruction; override; procedure Cancel; virtual; property Interval: Integer read GetInterval write SetInterval; /// <summary> /// <para> /// За синхронизацией потоков отвечает поток в котором обрабатывается OnTimer /// </para> /// <para> /// !!! НЕ ЗАБЫВАТЬ ПРО ЭТО !!! /// </para> /// </summary> property OnTimer: TNotifyEvent read GetOnTimer write SetOnTimer; end; /// <summary> /// Simple wait thread /// </summary> /// <remarks> /// <para> /// !!! Important !!! /// </para> /// <para> /// Use Cancel instead of Terminate. You can get ThreadExternalTerminate /// exception in multi-thread applications /// </para> /// </remarks> TWaitThread = class(TCustomTimerThread) protected procedure Execute; override; public end; /// <summary> /// Thread independed timer /// </summary> /// <remarks> /// <para> /// !!! Important !!! /// </para> /// <para> /// Use Cancel instead of Terminate. You can get ThreadExternalTerminate /// exception in multi-thread applications /// </para> /// </remarks> TTimerThread = class(TCustomTimerThread) private FEnabled: Boolean; function GetEnabled: Boolean; procedure SetEnabled(const Value: Boolean); protected procedure Execute; override; public constructor Create(AInterval: Integer; AOnTimer: TNotifyEvent; AEnabled: Boolean = True); reintroduce; property Enabled: Boolean read GetEnabled write SetEnabled; end; implementation { TCustomTimerThread } procedure TCustomTimerThread.BeforeDestruction; begin FLock.Free; FreeAndNil(FCancelledEvent); inherited; end; constructor TCustomTimerThread.Create(AInterval: Integer; AOnTimer: TNotifyEvent); begin inherited Create; FInterval := AInterval; FOnTimer := AOnTimer; FreeOnTerminate := True; FLock := TCriticalSection.Create; FCancelledEvent := TSimpleEvent.Create; FCancelledEvent.ResetEvent; end; procedure TCustomTimerThread.Cancel; begin FCancelledEvent.SetEvent; end; procedure TCustomTimerThread.DoOnTimer; begin if Assigned(OnTimer) then OnTimer(Self); end; function TCustomTimerThread.GetInterval: Integer; begin Lock; try Result := FInterval; finally Unlock; end; end; function TCustomTimerThread.GetOnTimer: TNotifyEvent; begin Lock; try Result := FOnTimer; finally Unlock; end; end; procedure TCustomTimerThread.Lock; begin FLock.Enter; end; procedure TCustomTimerThread.SetInterval(const Value: Integer); begin Lock; try FInterval := Value; finally Unlock; end; end; procedure TCustomTimerThread.SetOnTimer(const Value: TNotifyEvent); begin Lock; try FOnTimer := Value; finally Unlock; end; end; procedure TCustomTimerThread.Sleep(AInterval: Integer); begin FCancelledEvent.WaitFor(AInterval); end; procedure TCustomTimerThread.TerminatedSet; begin inherited; FCancelledEvent.SetEvent; end; procedure TCustomTimerThread.Unlock; begin FLock.Leave; end; { TWaitThread } procedure TWaitThread.Execute; begin if FCancelledEvent.WaitFor(FInterval) = wrTimeout then DoOnTimer; end; { TTimerThread } constructor TTimerThread.Create(AInterval: Integer; AOnTimer: TNotifyEvent; AEnabled: Boolean); begin inherited Create(AInterval, AOnTimer); FOnTimer := AOnTimer; FEnabled := AEnabled; end; procedure TTimerThread.Execute; begin while not Terminated do case FCancelledEvent.WaitFor(FInterval) of wrTimeout: begin if Enabled then DoOnTimer; end; else Break; end; end; function TTimerThread.GetEnabled: Boolean; begin Lock; try Result := FEnabled; finally Unlock; end; end; procedure TTimerThread.SetEnabled(const Value: Boolean); begin Lock; try FEnabled := Value; finally Unlock; end; end; end.  
  16. Like
    AngryOwl получил реакцию от zairkz в Благодраность   
    Вы знаете...
    На самом деле, за последний год изменилось очень многое.
    Я искренне рад за компанию Embarcadero, и, конечно, за сам продукт RAD Studio. Им есть над чем работать, возможно не хватает ресурсов и т.д. и т.п... Однако на все сложности, думаю, у них очень большие перспективы. Серьезно! На мой взгляд, на сегодняшний день, аналога RAD Studio просто не существует! Его просто нет! Ну вот хоть убейтесь - нет его! И это далеко не только мое мнение. Мнение очень многих серьезных программистов, которые используют и другие IDE и, тем-более, языки (и которые работают в очень серьезных компаниях). И "всепропальщиков" я слышу со времен моей работы с Turbo-Pascal 5.0... )
    Недостатки есть у всех! Можно так охаять любую IDE и любой язык, - что мало не покажется. Это касается "любого" (я о всяких студиях... и мелкомягких и корпорацияхдобра)... Вопрос больше в ресурсах, которые есть у компании, чтобы оперативно решать проблемы: баги, обновления, документация, поддержка и т.д...
    А если говорить непосредственно о FMX, то вообще - все остальные тупо в пролете!
    И мы говорим о продукте компании, которая катастрофически уступает своими возможностями и ресурсами таким монстрам как Microsoft с их Visual Studio.
    Сейчас уже все больше и больше и документации и информации и ресурсов по FMX, в частности. Это и китайские ресурсы, и японские и немецкие. Не думайте - что только в постсоветском пространстве популярен Delphi, в частности, и среда RAD Studio. Это не серьезно! )
    Китай, Япония, Германия, Франция и т.д. и т.д.
    Все больше и больше и открытых исходников и разнообразных ресурсов и компонентов. Тот же Boian Mitov - куча компонентов, уникальные инструменты. Большинство - с поддержкой, и под, FMX! (не реклама! ссылок не даю - сами найдете). Уникальный болгарский (если мне память не изменяет) программист - написал и развил огромную библиотеку... И таких как он - много.
    К чему я все это... А к тому - что изменилось столько всего! что даже не уверен, что об этом вообще надо говорить. А уж я то за ней следил еще со времен библиотеки VG-Scene (Евгения Крюкова) и далее - с самой первой XE...
    А уж текущий ресурс - считаю один из лучших. Главное - уметь пользоваться!
    И я полностью согласен с [Kitty] и поддерживаю - благодарю ребят за то, что они создали и ведут этот ресурс!
  17. Like
    AngryOwl отреагировална Brovin Yaroslav в Когда много таймеров   
    В любом случае рост таймеров всегда будет сказывать на скорость приложения и запаздывания. Поскольку таймеры в fmx выполняются в главном потоке, то соответственно все OnTimer события будут вызываться по очереди. И чем дольше занимает выполнение этих событий, тем таймеры будут менее точны.
    Предел количества таймеров не знаю :-) НО любую задачу можно выполнить несколькими способами. В вашем случае нужно просто сделать типа Менеджер расписаний, который будет базироваться на одном всего лишь таймере и в OnTimer проверять наступило ли событие или нет.
  18. Like
    AngryOwl получил реакцию от Kitty в Отправить email в ios   
    Встречный вопрос - стандартные TIdSMTP и TIdMessage (из Indy) не катят? (просто спрашиваю - не пробовали ли этот вариант?)
  19. Like
    AngryOwl получил реакцию от Kitty в Благодраность   
    Вы знаете...
    На самом деле, за последний год изменилось очень многое.
    Я искренне рад за компанию Embarcadero, и, конечно, за сам продукт RAD Studio. Им есть над чем работать, возможно не хватает ресурсов и т.д. и т.п... Однако на все сложности, думаю, у них очень большие перспективы. Серьезно! На мой взгляд, на сегодняшний день, аналога RAD Studio просто не существует! Его просто нет! Ну вот хоть убейтесь - нет его! И это далеко не только мое мнение. Мнение очень многих серьезных программистов, которые используют и другие IDE и, тем-более, языки (и которые работают в очень серьезных компаниях). И "всепропальщиков" я слышу со времен моей работы с Turbo-Pascal 5.0... )
    Недостатки есть у всех! Можно так охаять любую IDE и любой язык, - что мало не покажется. Это касается "любого" (я о всяких студиях... и мелкомягких и корпорацияхдобра)... Вопрос больше в ресурсах, которые есть у компании, чтобы оперативно решать проблемы: баги, обновления, документация, поддержка и т.д...
    А если говорить непосредственно о FMX, то вообще - все остальные тупо в пролете!
    И мы говорим о продукте компании, которая катастрофически уступает своими возможностями и ресурсами таким монстрам как Microsoft с их Visual Studio.
    Сейчас уже все больше и больше и документации и информации и ресурсов по FMX, в частности. Это и китайские ресурсы, и японские и немецкие. Не думайте - что только в постсоветском пространстве популярен Delphi, в частности, и среда RAD Studio. Это не серьезно! )
    Китай, Япония, Германия, Франция и т.д. и т.д.
    Все больше и больше и открытых исходников и разнообразных ресурсов и компонентов. Тот же Boian Mitov - куча компонентов, уникальные инструменты. Большинство - с поддержкой, и под, FMX! (не реклама! ссылок не даю - сами найдете). Уникальный болгарский (если мне память не изменяет) программист - написал и развил огромную библиотеку... И таких как он - много.
    К чему я все это... А к тому - что изменилось столько всего! что даже не уверен, что об этом вообще надо говорить. А уж я то за ней следил еще со времен библиотеки VG-Scene (Евгения Крюкова) и далее - с самой первой XE...
    А уж текущий ресурс - считаю один из лучших. Главное - уметь пользоваться!
    И я полностью согласен с [Kitty] и поддерживаю - благодарю ребят за то, что они создали и ведут этот ресурс!
  20. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Наклеить одно изображение на другое   
    var bmp: TBitmap; SrcRect, DstRect, SrcRect2, DstRect2: TRectF; begin bmp := TBitmap.Create(256, 256); bmp.Canvas.BeginScene(); try SrcRect := TRectF.Create(0, 0, 256, 256); DstRect := TRectF.Create(20, 20, 236, 236); SrcRect2 := TRectF.Create(0, 0, 256, 256); DstRect2 := TRectF.Create(0, 0, 256, 256); bmp.Clear(TAlphaColorRec.Null); bmp.Canvas.DrawBitmap(Image1.Bitmap, SrcRect2, DstRect2, 0.8, false); bmp.Canvas.DrawBitmap(Image2.Bitmap, SrcRect, DstRect, 0.8, false); finally bmp.Canvas.EndScene(); Image3.Bitmap.SetSize(256, 256); Image3.Bitmap.CopyFromBitmap(bmp); bmp.Free; end; end;  
  21. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в как держать компоненты вместе   
    Top+Top
    <TListBox>.Align := TAlignLayout.Top; <TPanel>.Align := TAlignLayout.Top; Top+Client
    <TListBox>.Align := TAlignLayout.Top; <TPanel>.Align := TAlignLayout.Client; Client+Bottom
    <TListBox>.Align := TAlignLayout.Client; <TPanel>.Align := TAlignLayout.Bottom;  
  22. Like
    AngryOwl отреагировална Rusland в Контролировать приход SMS   
    Отлично работает! Большое спасибо
  23. Like
    AngryOwl отреагировална Равиль Зарипов (ZuBy) в Контролировать приход SMS   
    const SMS_RECEIVED = 'android.provider.Telephony.SMS_RECEIVED'; procedure SMSReceiver(aIntent: JIntent); //uses // Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony, Androidapi.JNI.Provider, Androidapi.JNIBridge, // Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers; var aSmss: TJavaObjectArray<JSmsMessage>; aSms: JSmsMessage; aFrom: string; aBody: string; I: Integer; begin if aIntent = nil then exit; if (aIntent.getAction <> nil) and (aIntent.getAction.compareToIgnoreCase(StringToJString(SMS_RECEIVED)) = 0) then begin aSmss := TJavaObjectArray<JSmsMessage>.Create; aSmss := TJSms_Intents.JavaClass.getMessagesFromIntent(aIntent); aFrom := JStringToString(aSmss[0].getDisplayOriginatingAddress); aBody := ''; for I := 0 to aSmss.Length - 1 do begin aSms := aSmss[I]; aBody := aBody + JStringToString(aSms.getDisplayMessageBody); end; end; end; не проверял, но по коду так, только как нить вернуть нужно aFrom, aBody
    сделать как функцию и тд..
  24. Like
    AngryOwl отреагировална Pax Beach в Контролировать приход SMS   
    У в Берлине АПД1 в исходниках, Androidapi.JNI.Provider.pas
    есть такой метод.
    UPD:
    А... обратил внимание, что метод появился с API-19.
  25. Like
    AngryOwl отреагировална kami в Методы шифрования delphi   
    Через Get It Manager можно поставить TurboPack LockBox. Это набор компонентов, реализующих различные виды шифрования, хеширования. И адаптированные для FMX.
×
×
  • Создать...