-
Постов
73 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Активность репутации
-
rakhmet получил реакцию от Max Anyway в Защита FMX
На одном популярном форуме, как известно, как-то исторически прижились целые варез-зеркала App Store и Google Play (нужно во всём искать позитив: ломают - значит любят ), и в связи с этим возникают закономерные вопросы:
Как вы защищаете свои FMX-приложения (нюансы, тонкости, характерные особенности и приёмы)? Когда (т.е. как скоро после первого релиза) вы обнаружили "вылеченную" копию своего приложения? Пытались ли вы изменить степень/уровень защиты вашего приложения после того, как узнали о его успешном взломе? Изменила ли что-нибудь такая "популярность" вашего FMX-приложения (количество покупок, загрузок, платежей)? -
rakhmet отреагировална dnekrasov в Топ мобильных приложений
Официальное название: AlReader Официальный сайт: http://www.alreader.com/ (но лучше сюда - http://4pda.ru/forum/index.php?showtopic=340035) Платформы: Android, Windows, WinMobile, Windows CE -
rakhmet отреагировална Равиль Зарипов (ZuBy) в Топ мобильных приложений
Официальное название: Delivery Club Официальный сайт: https://www.delivery-club.ru/ Платформы: Android, iOS -
rakhmet отреагировална dnekrasov в Круглая кнопка
Попробовал реализовать стилем - никаких проблем не возникло:
object TEllipse StyleName = 'ButtonEllipseStyle' Align = Center Size.Width = 256.000000000000000000 Size.Height = 191.000000000000000000 Size.PlatformDefault = False object TColorAnimation Duration = 0.500000000000000000 Inverse = True PropertyName = 'Fill.Color' StartValue = x00808080 StopValue = xAF808080 Trigger = 'IsMouseOver=true' TriggerInverse = 'IsMouseOver=false' end end
UPD!
Мммда... Насчет проблем я поторопился...
Для того чтобы отследить клик по кнопке надо переопределить клик для TEllipse в стиле:
procedure TForm1.btnTestApplyStyleLookup(Sender: TObject); var el: TEllipse; begin if TStyledControl(btnTest).FindStyleResource<TEllipse>('ButtonEllipseStyle', el) then el.OnClick := btnTestClick; end;
-
rakhmet отреагировална sinuke в Круглая кнопка
Вот набросал на скорую руку примерчик (может конечно не идеальный пример, но сегодня что-то голова совсем деревянная)
111.zip
-
rakhmet отреагировална afors в Топ мобильных приложений
Может и банально, но соответствует критериям...
Официальное название: whatsapp Официальный сайт: https://www.whatsapp.com/ Платформы: Android, iPhone, Компьютеры Mac или Windows, Windows Phone -
rakhmet отреагировална Равиль Зарипов (ZuBy) в Топ мобильных приложений
Официальное название: 2ГИС Официальный сайт: https://2gis.ru/ Платформы: Android, iOS -
rakhmet отреагировална Равиль Зарипов (ZuBy) в Топ мобильных приложений
Официальное название: Банк Астана Официальный сайт: https://www.bankastana.kz/ Платформы: Android, iOS -
rakhmet отреагировална Rusland в Топ мобильных приложений
Официальное название: Тинькофф Официальный сайт: http://tinkoff.ru Платформы: Android, iOS -
rakhmet отреагировална Евгений Корепов в Сообщения чата в виде сообщений в iphone.
Для одного проекта писал такое пару месяцев назад, пользуйтесь.Под windows, при клике на сообщение, оно превращается в readonly TMemo - дабы можно было скопировать нужное из сообщения. При наличии URL в сообщении, сбоку появляется кнопка открыть - лучше ничего для открытия ссылок не придумал. Надо бы сделать диалог выбора для открытия одной из нескольких ссылок, но руки пока не доходят. Пощупать чат вживую можно в приложении https://play.google.com/store/apps/details?id=ru.flintnet.InternetAgent , для активации и загрузки примера чата отсканируйте приложением qr-код с страницы http://internetagent.flintnet.ru/
unit ChatBox; interface uses System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Layouts,System.Types, FMX.StdCtrls,FMX.Edit,FMX.Memo,FMX.TextLayout,System.UITypes,FMX.Graphics,FMX.Objects, FMX.Effects,FMX.Styles.Objects; type TMessagePos = (msgLeft,msgRight); TEventText = procedure(PURL: String) of object; TChatBox = class(TVertScrollBox) private FTextLyout : TTextLayout; FLastMessageId : Integer; FMsgWidthPercentage : Integer; FOnURLButtonClick : TEventText; FCalloutLength : Single; FCalloutXRadius : Single; FCalloutYRadius : Single; FMessageFontSize : Single; FMemo : TMemo; procedure ButtonClick(Sender: TObject); procedure MyMsgContainerOnClick(Sender: TObject); procedure MyMsgContainerOnExit(Sender: TObject); function FCreateMsgBlock(AOwner: TComponent; PMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos) : TLayout; function CalculateTextItemHeight(Sender: TObject) : Single; procedure LayoutResize(Sender: TObject); function ExtractURL(pString : String) : String; procedure Memo1ApplyStyleLookup(Sender: TObject); public property LastMessageId : Integer read FLastMessageId; property MsgWidthPercentage : Integer read FMsgWidthPercentage write FMsgWidthPercentage default 80; constructor Create(AOwner: TComponent); override; destructor Destroy; override; Procedure AddMessage(pMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos); procedure ClearChildren(AChatBox: TChatBox); procedure ScrollBottomSmoothly; procedure ScrollBottom; published property OnURLButtonClick : TEventText read FonURLButtonClick write FonURLButtonClick; property CalloutLength : Single read FCalloutLength write FCalloutLength; property CalloutXRadius : Single read FCalloutXRadius write FCalloutXRadius; property CalloutYRadius : Single read FCalloutYRadius write FCalloutYRadius; property MessageFontSize : Single read FMessageFontSize write FMessageFontSize; end; TOpenChatBox = class(TChatBox); Procedure Register; implementation procedure Register; begin RegisterComponents('EKorepov', [TChatBox]); end; constructor TChatBox.Create(AOwner: TComponent); begin inherited create(Aowner); FLastMessageId:=-1; FTextLyout := TTextLayoutManager.DefaultTextLayout.Create; FMemo:=TMemo.Create(Aowner); FMemo.TextSettings.WordWrap:=True; FMemo.ReadOnly:=True; FMemo.Align:=TAlignLayout.Client; FMemo.OnExit:=MyMsgContainerOnExit; FMemo.OnApplyStyleLookup:=Memo1ApplyStyleLookup; FMemo.StyledSettings:=FMemo.StyledSettings-[TStyledSetting.Size]; With Self as TVertScrollBox do begin AniCalculations.Animation := True; AniCalculations.BoundsAnimation := True; AniCalculations.TouchTracking := [ttVertical]; end; end; destructor TChatBox.Destroy; begin FreeAndNil(FMemo); FreeAndNil(FTextLyout); inherited Destroy; end; procedure TChatBox.ScrollBottomSmoothly; begin AniCalculations.MouseWheel(0, ContentBounds.Height+5); end; procedure TChatBox.ScrollBottom; begin ScrollBy(0, -ContentBounds.Height); end; procedure TChatBox.ButtonClick(Sender: TObject); Var URL : String; begin URL:=TButton(Sender).HelpKeyword; if Assigned(FonURLButtonClick) then FonURLButtonClick(URL); end; procedure TChatBox.Memo1ApplyStyleLookup(Sender: TObject); begin end; procedure TChatBox.MyMsgContainerOnClick(Sender: TObject); begin FMemo.TextSettings:=TLabel(Sender).TextSettings; FMemo.Lines.Text:=TLabel(Sender).Text; TLabel(Sender).AddObject(FMemo); end; procedure TChatBox.MyMsgContainerOnExit(Sender: TObject); begin if (Sender is TMemo) then if Assigned(TMemo(Sender).Parent) then if (TMemo(Sender).Parent is TLabel) then TLabel(TMemo(Sender).Parent).RemoveObject(TMemo(Sender)); end; procedure TChatBox.ClearChildren(AChatBox: TChatBox); begin Assert(AChatBox <> nil); TOpenChatBox(AChatBox).Content.DeleteChildren; AChatBox.Repaint; end; function TChatBox.CalculateTextItemHeight(Sender: TObject) : Single; var Item: TLabel; begin Result:=0; if (Sender is TLabel) then begin Item := TLabel(Sender); FTextLyout.BeginUpdate; try FTextLyout.Text := Item.Text; FTextLyout.MaxSize := TPointF.Create(Item.Width-Item.Margins.Left-Item.Margins.Right-10, 1000); FTextLyout.Font := Item.Font; FTextLyout.WordWrap:= Item.WordWrap; FTextLyout.HorizontalAlign:= Item.TextSettings.HorzAlign; FTextLyout.VerticalAlign:= Item.TextSettings.VertAlign; finally FTextLyout.EndUpdate; end; Result:= FTextLyout.Height+10; end; end; procedure TChatBox.LayoutResize(Sender: TObject); Var Item : TLabel; CalloutRectangle : TCalloutRectangle; Layout : TLayout; I : Integer; begin Layout:=TLayout(Sender); for I := 0 to Layout.Children.Count-1 do begin If Layout.Children.Items[I] is TCalloutRectangle Then begin CalloutRectangle:=TCalloutRectangle(Layout.Children.Items[I]); Item:=TLabel(CalloutRectangle.Children.Items[0]); CalloutRectangle.Width:=(Layout.Width / 100) * FMsgWidthPercentage; Layout.Height:=CalculateTextItemHeight(Item); end; If Layout.Children.Items[I] is TButton Then begin TButton(Layout.Children.Items[I]).Width:=(Layout.Width / 100) * (100-FMsgWidthPercentage-5); end; end; end; Procedure TChatBox.AddMessage(pMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos); Var lcLayout : TLayout; begin PDate:=Trim(PDate); PAutor:=Trim(PAutor); PMessage:=Trim(PMessage); FLastMessageId:=PMessageId; lcLayout:=FCreateMsgBlock((Self as TVertScrollBox), PMessageId, PDate, PAutor, PMessage, PMessagePos); Self.AddObject(lcLayout); end; function TChatBox.FCreateMsgBlock(AOwner: TComponent; PMessageId : Integer; PDate, PAutor, PMessage : String; PMessagePos : TMessagePos) : TLayout; Var lcLayout,lcLayout2 : TLayout; Item : TLabel; Button : TButton; CalloutRectangle : TCalloutRectangle; lcHeight : Single; URL : String; begin lcLayout:=TLayout.Create(AOwner); lcLayout.Tag:=pMessageId; lcLayout.Align:=TAlignLayout.Top; lcLayout.Width:=200; lcLayout.Position.X:=0; lcLayout.Position.Y:= ((AOwner as TVertScrollBox).ContentBounds.Height+10); lcLayout.Margins.Bottom:=10; CalloutRectangle:=TCalloutRectangle.Create(lcLayout); CalloutRectangle.XRadius:=FCalloutXRadius; CalloutRectangle.YRadius:=FCalloutYRadius; CalloutRectangle.CalloutWidth:=10; CalloutRectangle.CalloutOffset:=-3-FCalloutYRadius-CalloutRectangle.CalloutWidth; CalloutRectangle.Width:=((AOwner as TVertScrollBox).Width / 100) * FMsgWidthPercentage; CalloutRectangle.HitTest:=False; case PMessagePos of msgRight : begin CalloutRectangle.Align:=TAlignLayout.Right; CalloutRectangle.CalloutPosition:=TCalloutPosition.Right; CalloutRectangle.Padding.Right:=CalloutRectangle.CalloutLength+CalloutRectangle.XRadius; CalloutRectangle.Padding.Left:=CalloutRectangle.XRadius; end; msgLeft : begin CalloutRectangle.Align:=TAlignLayout.Left; CalloutRectangle.CalloutPosition:=TCalloutPosition.Left; CalloutRectangle.Padding.Left:=CalloutRectangle.CalloutLength+CalloutRectangle.XRadius; CalloutRectangle.Padding.Right:=CalloutRectangle.XRadius; end; end; CalloutRectangle.Padding.Top:=1; CalloutRectangle.Padding.Bottom:=1; lcLayout.AddObject(CalloutRectangle); Item:=TLabel.Create(CalloutRectangle); Item.TextSettings.Font.Size:=MessageFontSize; CalloutRectangle.AddObject(Item); Item.Align:=TAlignLayout.Client; {$IFDEF MSWINDOWS} Item.OnClick:=MyMsgContainerOnClick; {$ENDIF MSWINDOWS} Item.Text:=PDate+' '+PAutor+#10+PMessage; Item.HitTest:=True; Item.WordWrap:=True; lcHeight:=CalculateTextItemHeight(Item); lcLayout.Height:=lcHeight; URL:=ExtractURL(pMessage); Item.StyledSettings:=Item.StyledSettings- [TStyledSetting.Size,TStyledSetting.Style]; if Not URL.IsEmpty then begin lcLayout2:=TLayout.Create(lcLayout); lcLayout2.Align:=TAlignLayout.Client; lcLayout2.Margins.Left:=5; lcLayout2.Margins.Right:=5; lcLayout.AddObject(lcLayout2); Button:=TButton.Create(lcLayout2); Button.Text:='Открыть'; Button.Align:=TAlignLayout.Center; Button.HelpKeyword:=URL; Button.OnClick:=ButtonClick; lcLayout2.AddObject(Button); end; lcLayout.OnResize:=LayoutResize; Result:=lcLayout; end; function TChatBox.ExtractURL(pString : String) : String; Var S : String; begin Result:=''; if Not pString.Contains('http') then Exit; S:=pString.Substring(Pos('http',pString)-1); S:=S.Remove(S.IndexOfAny([' ',','])); Result:=S.TrimRight(['.']); end; end. -
rakhmet получил реакцию от rareMax в Мас адрес или серийный номер системного диска в ОСХ
Просто оставлю это здесь.
-
rakhmet отреагировална Barbanel в Жесты: zoom: in + out
Я определяю так:
var FFirstDistance, FLastDistance: integer; .. procedure TformMainMenu2.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); begin case EventInfo.GestureID of igiZoom : begin if (not(TInteractiveGestureFlag.gfBegin in EventInfo.Flags)) and (not(TInteractiveGestureFlag.gfEnd in EventInfo.Flags)) then FLastDistance := EventInfo.Distance; if (TInteractiveGestureFlag.gfBegin in EventInfo.Flags) then FFirstDistance := EventInfo.Distance; if (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then begin // zoom out if ( FFirstDistance > FLastDistance ) then begin Plan.Scale := 0.5; end; // zoom in if ( FFirstDistance < FLastDistance ) then begin Plan.Scale := 1.0; end; end; end; end; end; -
rakhmet получил реакцию от Alex7wrt в iOS 64 bit vs 32 bit версии, Provisioning
Согласен. Добавлю только, что суммарно у 10.x и 9.x охват в 94% - думаю, версии ниже перечисленных проверять уже просто бессмысленно.
-
rakhmet отреагировална Error в ErrorSoft TurboUpdate - Автообновление ваших Windows приложений
SSL поддерживается и является рекомендуемым способом.
Версия в обновлении является одним из аргументов в функции-callback-а сообщающей о доступности обновления, текущую версию легко получить используя TFileVersion.CreateForFile()
Этого на данный момент нет, но может появиться в будущем.
С полной заменой, с современной скоростью интернета патчи и их поддержка - очень сомнительная штука.
TurboUpdate предназначено исключительно для Windows, в будущем возможно появление поддержки MacOS.
-
rakhmet получил реакцию от Равиль Зарипов (ZuBy) в Жесты: zoom: in + out
Вопрос: как определить, какое именно действие совершает пользователь - увеличивает или уменьшает?
Ответ: на примере сэмпла, поставляемого в комплекте с Delphi, в файле C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Mobile Snippets\InteractiveGestures\ImageZoom\ImageZoomU.pas можно попробовать заменить одну часть процедуры:
begin { zoom the image } LImage := TImage(LObj.GetObject); LImageCenter := LImage.Position.Point + PointF(LImage.Width / 2, LImage.Height / 2); LImage.Width := LImage.Width + (EventInfo.Distance - FLastDistance); LImage.Height := LImage.Height + (EventInfo.Distance - FLastDistance); LImage.Position.X := LImageCenter.X - LImage.Width / 2; LImage.Position.Y := LImageCenter.Y - LImage.Height / 2; end; на другую:
begin { zoom the image } if EventInfo.Distance > FLastDistance then showmessage('zoom in') else showmessage('zoom out'); end;
Что с этим делать дальше — думаю, объяснять излишне.
Если кто знает более элегантное решение, не основанное на вычислении дистанции, — смело делитесь, не стесняйтесь.
-
rakhmet получил реакцию от sinuke в Жесты: zoom: in + out
Вопрос: как определить, какое именно действие совершает пользователь - увеличивает или уменьшает?
Ответ: на примере сэмпла, поставляемого в комплекте с Delphi, в файле C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Mobile Snippets\InteractiveGestures\ImageZoom\ImageZoomU.pas можно попробовать заменить одну часть процедуры:
begin { zoom the image } LImage := TImage(LObj.GetObject); LImageCenter := LImage.Position.Point + PointF(LImage.Width / 2, LImage.Height / 2); LImage.Width := LImage.Width + (EventInfo.Distance - FLastDistance); LImage.Height := LImage.Height + (EventInfo.Distance - FLastDistance); LImage.Position.X := LImageCenter.X - LImage.Width / 2; LImage.Position.Y := LImageCenter.Y - LImage.Height / 2; end; на другую:
begin { zoom the image } if EventInfo.Distance > FLastDistance then showmessage('zoom in') else showmessage('zoom out'); end;
Что с этим делать дальше — думаю, объяснять излишне.
Если кто знает более элегантное решение, не основанное на вычислении дистанции, — смело делитесь, не стесняйтесь.
-
rakhmet получил реакцию от Rusland в Жесты: zoom: in + out
Вопрос: как определить, какое именно действие совершает пользователь - увеличивает или уменьшает?
Ответ: на примере сэмпла, поставляемого в комплекте с Delphi, в файле C:\Users\Public\Documents\Embarcadero\Studio\18.0\Samples\Object Pascal\Mobile Snippets\InteractiveGestures\ImageZoom\ImageZoomU.pas можно попробовать заменить одну часть процедуры:
begin { zoom the image } LImage := TImage(LObj.GetObject); LImageCenter := LImage.Position.Point + PointF(LImage.Width / 2, LImage.Height / 2); LImage.Width := LImage.Width + (EventInfo.Distance - FLastDistance); LImage.Height := LImage.Height + (EventInfo.Distance - FLastDistance); LImage.Position.X := LImageCenter.X - LImage.Width / 2; LImage.Position.Y := LImageCenter.Y - LImage.Height / 2; end; на другую:
begin { zoom the image } if EventInfo.Distance > FLastDistance then showmessage('zoom in') else showmessage('zoom out'); end;
Что с этим делать дальше — думаю, объяснять излишне.
Если кто знает более элегантное решение, не основанное на вычислении дистанции, — смело делитесь, не стесняйтесь.
-
rakhmet отреагировална Равиль Зарипов (ZuBy) в Увеличение и уменьшение размера
для IOS можно вот так (не проверял)
// uses iOSapi.UIKit; aSystemFont := TUIFont.OCClass.systemFontSize; для андроид, тот способ который выше приложил не работает. всегда выдаёт 1
в андроид студии есть sp и dp (подробней можно почитать тут)
-
rakhmet отреагировална Равиль Зарипов (ZuBy) в Увеличение и уменьшение размера
такой возможности нет, т.к. (Default) - это константы
если не ошибаюсь для Windows - 12, Android - 16, IOS - ...
для adnroid программно
для ios программно
-
rakhmet отреагировална dnekrasov в Ассоциация файлов с программой на MacOS
Тоже интересовал этот вопрос. Нарыл кучу информации, но в конце концов реализовал этот механизм.
Смотрите прикрепленный архивчик - там простенький проект, показывающий как ото сделать. Проверял на Delphi 10 Seattle + OS X El Capitan 10.11.4
OpenWith.zip
-
-
rakhmet отреагировална Равиль Зарипов (ZuBy) в Количество видимых Items — ?
ModernLV.getVisibleCount
-
rakhmet отреагировална Равиль Зарипов (ZuBy) в Алфавитный скроллинг для ListView
на андроиде не проверял, но должно работать
alphaLVS_Berlin.zip
-
rakhmet получил реакцию от dnekrasov в Код: подсветка синтаксиса
Добавьте, пожалуйста, в список подсветки синтаксиса кода пункт Pascal/Delphi. Вроде самая необходимая на данном форуме подсветка, а её до сих пор нет
Спасибо!
-
rakhmet получил реакцию от Rusland в Код: подсветка синтаксиса
Добавьте, пожалуйста, в список подсветки синтаксиса кода пункт Pascal/Delphi. Вроде самая необходимая на данном форуме подсветка, а её до сих пор нет
Спасибо!