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

Равиль Зарипов (ZuBy)

Модераторы
  • Постов

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

  • Посещение

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

    264

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

  1. Like
    Равиль Зарипов (ZuBy) отреагировална kami в Передвижение rectangle на видимую область   
    В озвученном вами примере ScrollableForm в том числе получается высота виртуальной клавиатуры в методе FormVirtualKeyboardShown
  2. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в [TfgRichEdit]- компонент редактирования текста с поддержкой форматирования   
    Этот компонент я делаю для клиента форума. Чтобы отображать простую разметку постов с форума. Я не планирую, что он будет поддерживать все. По моим планам, это базовые элементы разметки:
    Параграф (межстрочный интервал, отступы) Списки Картинки Изменение параметров текста (шрифт, размер, цвет, стиль) Блок кода Ссылка Дальше посмотрим. 
  3. Like
    Равиль Зарипов (ZuBy) отреагировална Alex7wrt в [Android] Подключение MediaPlayer с Android API   
    Разобрался. Нужно объявлять объект типа JMediaPlayer.
    var Player: JMediaPlayer; ......................... Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('URL_MP3_ФАЙЛА')); Player.prepare; Player.Start()
  4. Like
    Равиль Зарипов (ZuBy) отреагировална Кривяков Виталий в TUITabControl   
    Добрый день!
     
    В теме про наш продукт http://fire-monkey.ru/topic/1519-1c-papyc-mobilnoe-prilozhenie-dlia-masterov-priemschiko/ меня просили поделиться исходным кодом компонента TabControl с поддержкой слайда табов пальцем. С удовольствием делюсь
    В составе архива сам компонент и пример его использования.
    FMXUI.zip
  5. Like
    Равиль Зарипов (ZuBy) получил реакцию от Pax Beach в LocationSensor.Sensor.State используется?   
    чтобы получить статус GPS (для Android) включен или нет, нужно использовать следующий код
    function CheckGPSActive: boolean; // uses // Androidapi.JNIBridge, Androidapi.JNI.Location,  Androidapi.JNI.JavaTypes, // Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers {$IFDEF ANDROID} var   LocManagerObj: JObject;   LocationManager: JLocationManager;   allProviders: JList;   I: Integer; begin   Result := false;   // запрашиваем сервис Location   LocManagerObj := SharedActivityContext.getSystemService(TJContext.JavaClass.LOCATION_SERVICE);   if Assigned(LocManagerObj) then   begin     // получаем LocationManager     LocationManager := TJLocationManager.Wrap((LocManagerObj as ILocalObject).GetObjectID);     if Assigned(LocationManager) then     begin       // запрашиваем список всех провайдеров       allProviders := LocationManager.getProviders(true);       // выводим список       if Assigned(allProviders) then       begin         with TStringList.Create do         begin           for I := 0 to allProviders.size - 1 do             Add(JStringToString(allProviders.get(I).toString));           if ((IndexOf('gps') >= 0) or (IndexOf('network') >= 0)) then             Result := true;           Free;         end;       end;     end;   end; {$ELSE} begin   Result := false; {$ENDIF} end;
  6. Like
    Равиль Зарипов (ZuBy) получил реакцию от Brovin Yaroslav в Можно ли добавить свой способ переключения в TSwitch?   
    возможно ещё кому и понадобится

    switch.zip
  7. Like
    Равиль Зарипов (ZuBy) получил реакцию от Вячеслав в Можно ли добавить свой способ переключения в TSwitch?   
    возможно ещё кому и понадобится

    switch.zip
  8. Like
    Равиль Зарипов (ZuBy) отреагировална Евгений Корепов в Сообщения чата в виде сообщений в 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.
  9. Like
    Равиль Зарипов (ZuBy) получил реакцию от krapotkin в Проектирование интерфейса   
    ну логические операции для пользователя, например заказ товара на TTabControl
    1. Товар -> 2. Детали -> 3. Оплата -> 4. Подтверждение
    это все через SetActiveTabWithTransition(Таб, TTabTransition.Slide, TTabTransitionDirection.Normal);
     
    остальные опции, типа регистрации можно сделать на отдельной форме
  10. Like
    Равиль Зарипов (ZuBy) получил реакцию от VladimirS в Проектирование интерфейса   
    Для анимации переходов точно TTabControl, но не лепить все на одной форме
  11. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в При изменении размеров или положения компонентов на форме всё проподает   
    В скриншоте не выключены превью стили в Multi-Device Preview.
    0. Перезапустите Дельфи
    1. Создайте новый проект MultiDeviceProject
    2. Выключите превью стилей в меню Multi-Device Preview как у Вас в скриншоте.
    3. Закройте проект не сохраняя
    4. Откройте свой проект (не перезапускайте Delphi)
     
    Попробуйте пожалуйста еще раз.
  12. Like
    Равиль Зарипов (ZuBy) отреагировална zairkz в При изменении размеров или положения компонентов на форме всё проподает   
    Ну так то, я это и писал чтобы отключить превью )
  13. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в [TMultiView] Как избежать задержки при первом появлении TMultiView?   
    Задержка пропадает, если использовать этот код в TForm.OnShow?
    var Buffer: TBitmap; begin // Draw to Bitmap force to load all styles, measure size, build font-glyphs etc Buffer := TBitmap.Create(1, 1); try Buffer.Canvas.BeginScene; try MultiView.PaintTo(Buffer.Canvas, Control.LocalRect); finally Buffer.Canvas.EndScene; end; finally Buffer.DisposeOf; end;
  14. Like
    Равиль Зарипов (ZuBy) получил реакцию от zairkz в Проектирование интерфейса   
    Для анимации переходов точно TTabControl, но не лепить все на одной форме
  15. Like
    Равиль Зарипов (ZuBy) получил реакцию от Brovin Yaroslav в Отправка внутри приложения в ios   
    SMTP.Host:= 'smtp.yandex.ru' ; // хост
    SMTP.Port:= 465 ; // порт
    Smtp.Username:='TestUser'; 
    Smtp.Password:='pass123';


    SMTP.UseTLS :=utUseImplicitTLS ;

    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    IdSSLIOHandlerSocketOpenSSL1.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);
    IdSSLIOHandlerSocketOpenSSL1.Host := SMTP.Host;
    IdSSLIOHandlerSocketOpenSSL1.Port := SMTP.Port;
    IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1; // Уверен что именно этот метод используется??
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;
     
    SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

    MailMessage.Body.Clear;

    MailMessage.Body.Add('Первая строка');
    MailMessage.Body.Add('Вторая строка');

    SMTP.Connect;
    mailMessage.CharSet := 'UTF-8';
    mailMessage.CharSet:='UTF-8';

    MailMessage.ContentType:='multipart/mixed; charset=UTF-8';
    MailMessage.ContentType:='text/plain; charset=KOI8-R';

    MailMessage.Subject:=UTF8Encode('Reserve') ; // тема
    MailMessage.From.Address:='testadres@yandex.ru' ;
    MailMessage.From.Domain:= 'yandex.ru'; // домен
    MailMessage.From.User:= 'TestUser';
    MailMessage.From.Name:=UTF8Encode('TestUserName');

    MailMessage.Recipients.EMailAddresses:='TestUser0@list.ru'; // получатель и копия
    //2192100@list.ru

    MailMessage.IsEncoded:=true;

    SMTP.Send(MailMessage);
    SMTP.Disconnect;
     
     
    ==================================
    А теперь еще раз на код посмотри и сделай все правильно
  16. Like
    Равиль Зарипов (ZuBy) получил реакцию от Brovin Yaroslav в Отправка внутри приложения в ios   
    SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

    SMTP.UseTLS :=utUseImplicitTLS ;

    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  17. Like
    Равиль Зарипов (ZuBy) отреагировална Brovin Yaroslav в [TListBox] Как отобразить итемы в виде панелей?   
    Добрый день,
    Делаете стиль для итема, в виде панельки Устаналиваете в лист боксе размер итема: ItemHeight, ItemWidth. Для всех итемов устанавливаете ваш стиль Все готово. P.S. TGridLayout не лучший выбор при большом количестве итемов. Так как листбокс реально грузит стили только для видимой части итемов. И при прокрутке только меняет стили местами. А TGridLayout загрузит все элементы. В итоге проигрышь по памяти и по скорости.
  18. Like
    Равиль Зарипов (ZuBy) получил реакцию от Евгений Корепов в [Android/Win] Клиент для fire-monkey.ru [разработка]   
    Разработка продолжается
     
    Полностью перевел приложение на XML RPC API (демо и исходник тут) Авторизация (если её можно так назвать) Информация о пользователе из профиля (добавлена информация о возрасте +незначительные улучшения кода) Обновил немного дизайн Кэширование данных пользователя и навигации форума (самостоятельное обновление когда это требуется) Используется OXml для Android Кэширование всех картинок пользователей (на данный момент это ~1200 юзеров, НО не все юзеры имеют фотографии) Кэшируется всё на внешнюю память Теперь можно открывать "сайт" из профиля юзера (для Windows с окном уведомления) в ближайшее время собираюсь реализовать
    Доделать навигацию по веткам (как только пойму почему косяк с TTreeView) Кэширование всех картинок пользователей разработать иконку и сплеш картинку (может её и вовсе уберу) много чего... Проект также open-source, помощь приветствуется
     
    исходники выкладываю без бинарников, бинарники лежат на google диске в соответствующих папках (но синхронизация не всегда включена )
     
    FireMonkey.ru.zip
     


  19. Like
  20. Like
    Равиль Зарипов (ZuBy) получил реакцию от AngryOwl в PrimeMusic - Приложение для скачивания и прослушивания музыки с сайта www.primemusic.ru   
    Обновленная версия
    поддержка Android 5.x обновленный дизайн  

     
    Скачать с офф. сайта
  21. Like
    Равиль Зарипов (ZuBy) получил реакцию от #WAMACO в PrimeMusic - Приложение для скачивания и прослушивания музыки с сайта www.primemusic.ru   
    Обновленная версия
    поддержка Android 5.x обновленный дизайн  

     
    Скачать с офф. сайта
  22. Like
    Равиль Зарипов (ZuBy) получил реакцию от Brovin Yaroslav в [Android/Win] Клиент для fire-monkey.ru [разработка]   
    Разработка продолжается
     
    Полностью перевел приложение на XML RPC API (демо и исходник тут) Авторизация (если её можно так назвать) Информация о пользователе из профиля (добавлена информация о возрасте +незначительные улучшения кода) Обновил немного дизайн Кэширование данных пользователя и навигации форума (самостоятельное обновление когда это требуется) Используется OXml для Android Кэширование всех картинок пользователей (на данный момент это ~1200 юзеров, НО не все юзеры имеют фотографии) Кэшируется всё на внешнюю память Теперь можно открывать "сайт" из профиля юзера (для Windows с окном уведомления) в ближайшее время собираюсь реализовать
    Доделать навигацию по веткам (как только пойму почему косяк с TTreeView) Кэширование всех картинок пользователей разработать иконку и сплеш картинку (может её и вовсе уберу) много чего... Проект также open-source, помощь приветствуется
     
    исходники выкладываю без бинарников, бинарники лежат на google диске в соответствующих папках (но синхронизация не всегда включена )
     
    FireMonkey.ru.zip
     


  23. Like
  24. Like
    Равиль Зарипов (ZuBy) получил реакцию от Brovin Yaroslav в PrimeMusic - Приложение для скачивания и прослушивания музыки с сайта www.primemusic.ru   
    Обновленная версия
    поддержка Android 5.x обновленный дизайн  

     
    Скачать с офф. сайта
  25. Like
    Равиль Зарипов (ZuBy) получил реакцию от serser в Целесообразно ли использовать Synchronize для отрисовки   
    Ну вам выше вроде ответили, если не хотите лагов интерфейса то используюте синхронизацию
×
×
  • Создать...