Доска почета


Popular Content

Showing most liked content since 26.08.2017 Во всех областях

  1. 10 likes
    Для одного проекта писал такое пару месяцев назад, пользуйтесь.Под 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.
  2. 5 likes
    ну вот такая есть штука у меня Это нативные окошки пока только под андроид NativeView.zip
  3. 4 likes
    Мобильное приложение для курьера службы доставки. Приложение не самостоятельное, работает с системой автоматизации Tillypad XL. Возможности: получение и отображение информации о назначенных (выполненных) заказах курьера уведомления о новых заказах и изменениях в текущих просмотр информации о заказе (клиент, адрес, дата доставки, сумма и состав заказа) изменение статусов заказа, а так же времени, требуемого для доставки отображение заказа (всех заказов) на карте прокладка маршрута до клиента в навигаторе (Google, Yandex, 2GIS) связь с клиентом (оператором) - передача номера телефона или заказ обратного вызова через АТС отправка на сервер информации по фактическому маршруту курьера до клиента, а так же его местонахождения Активно разрабатывается взаимодействие с ККТ, для выдачи фискального чека клиенту в момент расчета. Приложение написано в RAD Studio Berlin 10.1 (Delphi). Огромное СПАСИБО: Ярослав Бровин - компоненты FGX (fgActivityDialog, fgToast, fgActionSheet), Равиль Зарипов - ModernListView, Андрей Ефимов - CustomActivityEvent
  4. 4 likes
    Исходный код TCustomWebBrowser.FormHandleCreated исправлен? На всякий случай - привожу сам код исправления. Файл FMX.WebBrowser.pas необходимо скопировать из исходников студии себе в проект, положив его рядом с dpr. И уже в нем сделать метод FormHandleCreated следующего вида (часть проверок 100% лишняя, но когда менял - подумал "пусть будет"): procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); var WBService: IFMXWBService; begin if not Assigned(Self) then Exit; if not Assigned(Self.Root) then Exit; if Sender <> Self.Root.GetObject then Exit; if not(csDesigning in ComponentState) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then // if not Assigned(FWeb) then begin if FWeb <> nil then WBService.DestroyWebBrowser(FWeb); FWeb := nil; // possibly, this not needed... FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end;
  5. 4 likes
    есть бесплатные компоненты Alcinoe https://sourceforge.net/projects/alcinoe/
  6. 4 likes
    Подправил uChatBox.pas под себя, заменил TLabel на TText, теперь проблем с отрисовкой бордюра не наблюдаю. Добавил выделение заголовка и градиент в "облачка". ChatBox.zip
  7. 4 likes
    Добрый день, Я бы взял TScrollBox для контейнера сообщений. Каждое сообщени представил в виде TLabel с вашим стилем в виде облаков TLabel поместил в TLayout и внутри него выравнивал бы по правому или левому краю. А сами TLayout выравнивал бы по верху.
  8. 3 likes
  9. 3 likes
    Форма должна иметь значение свойства FormStyle равное fsPopup. См. также Всплывающие формы в XE5
  10. 3 likes
    Вот набросал на скорую руку примерчик (может конечно не идеальный пример, но сегодня что-то голова совсем деревянная) 111.zip
  11. 3 likes
    Официальное название: Тинькофф Официальный сайт: http://tinkoff.ru Платформы: Android, iOS
  12. 3 likes
    В информации о пользователе слева от вопроса или ответа неправильный падеж слова публикация
  13. 3 likes
    Ну вот! Я же говорил как-то - жаль нельзя поставить "Мне нравится" несколько раз! Кто-то тут плачется все время, "вдруг Delphi умрет" ... "Delphi уже мертв" ... "FMX не сегодня завтра умрет" ... Я программирую на Pascal с 91го года. Начинал c Turbo Pascal 5.0. И с тех пор мне пытаются втереть "погромизды" - что Pascal/Delphi давно умер ... Тоже самое касается среды RAD Studio. Так вот благодаря таким людям как Ярослав, Андрей, Равиль и многим многим другим, он не только не умер. Он еще и, в большинстве случаев!, даст форы многим другим языкам и IDE. Так-что еще раз спасибо за решение проблемы! (скажите мне - в каких средах или языках их (проблем) нет! ))))
  14. 3 likes
  15. 3 likes
    На сколько я понял, вы хотите сделать слайдер. Два года назад я писал две статьи о двух способах создания такого слайдера. Слайдер изображений своими руками при помощи FMX 2.0. Часть 1 Слайдер изображений своими руками при помощи FMX 2.0. Часть 2 Более того, раньше был рабочий пример, наглядно демонстрирующий это. Посмотрите, эти статьи, я думаю они помогут вам. Пример реализации слайдера MetropolisUIFlipViewDemo.zip Этот пример убрали из поставки среды начиная с XE6
  16. 2 likes
    вот вообще ничего не менялось в стринггриде в этой конкретно строке StringGrid1.Cells[ACol, ARow] := myString; перед этим нужно только добавить в грид нужное количество колонок
  17. 2 likes
    Если нужно просто запустить программу, нажмите на "Подробнее", появится кнопка для запуска. инфа по цифровой подписи: Code Signing сертификаты или сертификаты разработчика. Виды, как выбрать Code signing для Open Source от Certum Code Signing в Windows, просто и недорого Где приобрести сертификат : KSoftware, Comodo, Symantec ... (ссылки есть в статьях) Как подписывать
  18. 2 likes
  19. 2 likes
    Переключил режим Энергосбережения с Оптимальный на Отключено и сразу проблема с коннектом пропала
  20. 2 likes
    Края лесенкой и эффекты... На некоторых девайсах получится полный факап)
  21. 2 likes
    Проблема в MUI. Предполагаю, что надо искать решение в запросе разрешений на уведомления, разбудить телефон, показать приложение поверх других окон, еще что-нибудь такое. Потому что в MUI большой упор на энергосбережение, безопасность и спам. Я замучился уже с MUI, не для разработчиков ось =)
  22. 2 likes
    есть событие OnTap - там можно считать. а интерес - только заинтересованность в рекламе так в правилах четко и написано. https://support.google.com/admob/answer/2753860
  23. 2 likes
    Попробовал реализовать стилем - никаких проблем не возникло: 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;
  24. 2 likes
    В принципе, проблем не было пока. Обертка нормально создалась, почистили от "лишнего", что связано с интерфейсом. Настройки заполняем самостоятельно, вроде, все работает. Проверяли только BT, до USB пока не дошли. Как отладим работу с ФР, перейдем к платежному терминалу (60Ф). Ну и оформим класс для удобной работы, и выложим на форум, вдруг кому пригодиться.
  25. 2 likes
    Если баннер отображается, то в самом приложении больше ничего делать не надо. Анализировать события в том числе. По клику пользователя на баннере гугл будет автоматически зачислять какую-то сумму на ваш аккаунт в AdMob. Естественно, вашим приложением должны пользоваться люди, то есть приложение должно быть размещено в магазине приложений Google Play или на других площадках.
  26. 2 likes
  27. 2 likes
    Уважаемые коллеги, 5-го октября 2017 года, в славном городе Санкт-Питербурге состоится встреча ценителей FMX и нашего любимого форума fire-monkey.ru. Встреча будет ближе к 20-00, место пока не определено. Кто точно знает, что появиться, отпишитесь, от этого зависит место (много или мало народу будет).
  28. 2 likes
    Обратите внимание на модуль System.IOUtils, а в частности на класс TDirectory. Там Вы найдёте все что Вам нужно.
  29. 2 likes
    Цена соответствует сложности. Если нужен простой label, то это может и перебор, но для чего-то посложнее аналогов просто нет. Кстати, автор Alcinoe в свое время у меня выпросил исходный текст нативного канваса под Android, и делал свой компонент на его основе.
  30. 2 likes
    Вопрос решился применением обновления Delphi до 10.1 Update 2
  31. 2 likes
    Нет. ReturnKeyType - это всего лишь какая надпись будет на кнопке Enter. Поведение по нажатию на эту кнопку задаете именно вы. Система Андроид не знает о том, какой порядок табуляции установлен у ваших контролов, ей это глубоко симметрично. Если переход по Enter необходим - действительно используйте SetFocus, но на всякий случай - оберните его в TThread.ForceQueue
  32. 2 likes
    Разобрался! В этом компоненте полная чувствительность тегов к регистру! И тег font и Font и FONT это разные. То есть, работают теги ТОЛЬКО в нижнем регистре))). Сроду бы не подумал))
  33. 2 likes
  34. 2 likes
  35. 2 likes
    Здавствуйте gelo1. Пример для вас я собирал на коленке и сожалению очень мало данных для анализа ошибки. Но попробуем. 1. Возможно не хватает указания схемы. Т.е. вам необходимо попробовать изменить запрос на SELECT * FROM PUBLIC.Tab_Izv если таблица находиться в схеме PUBLIC. Возникает ли ошибка если вы выполните запрос SELECT * FROM Tab_Izv в вашем Adminnistration Tool? (Кстати что вы для этого используете?) 2. Проверьте настойки соединения с базой в вашем приложении. Кстати какие компоненты для подключения к базе вы используете: FireDAC/UniDAC/ZEOSLib/BDE??? Ну вот пока вроде и все... Как я и сказал слишком мало данных для анализа. С Уважением galex
  36. 2 likes
    отсюда еще раз мораль. не нужно длительные действия выполнять в основном потоке. FormCreate должна всего лишь запускать поток, который считывает и подготавливает все что нужно. А при завершении потока заполняем компоненты на форме. Так что крутить анимацию должна уже вторая форма в то время пока данные готовятся.
  37. 2 likes
    Добрый день! 1. Посмотрите стек при возникновении "stack overflow", та будет видно, что привело к проблеме. 2. Анимации не будет. Анимация работает в основном потоке приложения. Создание формы тоже происходит в основном потоке, т.е на время создания формы анимация остановиться.
  38. 2 likes
    мобильный нельзя только внешний сервер и http...
  39. 2 likes
    База данных по основным комплектующим (двигателям, КПП, АКПП, сцеплениям, карданным валам, мостам) автобусов и троллейбусов МАЗ v10.41 для смартфонов с OS Android и экраном 5...7 дюймов. А также характеристики двигателей. BOKAv10.41.rar
  40. 2 likes
    ENERGY Для получения всех активных уведомлений в Android существует метод: getActiveNotifications added in API level 23 StatusBarNotification[] getActiveNotifications () FMX (Berlin и ниже точно, Tokyo не смотрел) не предоставляет доступ к этому методу, в исходниках (Androidapi.JNI.App.pas) он закомментирован. Возможно при использовании своего wrapper для класса JNotificationManager или отсюда можно получить доступ к требуемому функционалу.
  41. 2 likes
  42. 1 like
    Я обычно получаю сертификат в https://www.startcomca.com - самый не дорогой сервис. Сначала нужно получить Class 2 Personal Identity Validation за US$59.90, потом можно будет генерировать неограниченное количество подписей. Сервис хорош тем что предоставляет архив с подписями, инструкциями и инструментарием (остальные сервисы дадут текстовый файлик с подписью в непредсказуемом контейнере - и разбирайся сам...). Пинаю потихоньку https://kontur.ru/ca , дабы начали на территории России выдавать сертификаты Code Signing, но пока только за бугром это можно сделать.
  43. 1 like
    Официальное название: AlReader Официальный сайт: http://www.alreader.com/ (но лучше сюда - http://4pda.ru/forum/index.php?showtopic=340035) Платформы: Android, Windows, WinMobile, Windows CE
  44. 1 like
  45. 1 like
    Спустя полгода решение проблемы все-таки нашлось. Благодарю эксперта kami!
  46. 1 like
    Коллеги, определились с местом. Встреча 5-го октября в "Чердаке" по адресу Куйбышева 38\40 . Начало в 19-00. Подтягивайтесь, кто во сколько сможет.
  47. 1 like
  48. 1 like
    Здравствуйте! Спасибо большое, что откликнулись на мою проблему. Обновил Delphi XE10. 2. Всё работает! Рекомендую обновиться, столько всего исправили.
  49. 1 like
    @Владимир У меня было похожее поведение, при получении уведомлений программа могла зависнуть (не всегда). Долго пытался найти причину, оказалось, что зависало после использования TWebBrowser.
  50. 1 like
    Приложение Записная книжка с паролем v1.0 для OS Android версий от 4.2 без каких либо условий и рекламы v1.0 для смартфонов с диагональю экрана 5...7 дюймов. ZapKnijka_v1.0.rar
This leaderboard is set to Москва/GMT+03:00