Доска почета


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
    uses System.Threading; //.... procedure TForm1.Memo1Tap(Sender: TObject; const [Ref] Point: TPointF); begin TTask.Run(procedure begin TThread.Synchronize(nil, procedure begin ShowMessage(IntToStr(Memo1.SelStart)); end); end); end;
  17. 2 likes
    вот вообще ничего не менялось в стринггриде в этой конкретно строке StringGrid1.Cells[ACol, ARow] := myString; перед этим нужно только добавить в грид нужное количество колонок
  18. 2 likes
    Если нужно просто запустить программу, нажмите на "Подробнее", появится кнопка для запуска. инфа по цифровой подписи: Code Signing сертификаты или сертификаты разработчика. Виды, как выбрать Code signing для Open Source от Certum Code Signing в Windows, просто и недорого Где приобрести сертификат : KSoftware, Comodo, Symantec ... (ссылки есть в статьях) Как подписывать
  19. 2 likes
  20. 2 likes
    Переключил режим Энергосбережения с Оптимальный на Отключено и сразу проблема с коннектом пропала
  21. 2 likes
    Края лесенкой и эффекты... На некоторых девайсах получится полный факап)
  22. 2 likes
    Проблема в MUI. Предполагаю, что надо искать решение в запросе разрешений на уведомления, разбудить телефон, показать приложение поверх других окон, еще что-нибудь такое. Потому что в MUI большой упор на энергосбережение, безопасность и спам. Я замучился уже с MUI, не для разработчиков ось =)
  23. 2 likes
    есть событие OnTap - там можно считать. а интерес - только заинтересованность в рекламе так в правилах четко и написано. https://support.google.com/admob/answer/2753860
  24. 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;
  25. 2 likes
    В принципе, проблем не было пока. Обертка нормально создалась, почистили от "лишнего", что связано с интерфейсом. Настройки заполняем самостоятельно, вроде, все работает. Проверяли только BT, до USB пока не дошли. Как отладим работу с ФР, перейдем к платежному терминалу (60Ф). Ну и оформим класс для удобной работы, и выложим на форум, вдруг кому пригодиться.
  26. 2 likes
    Если баннер отображается, то в самом приложении больше ничего делать не надо. Анализировать события в том числе. По клику пользователя на баннере гугл будет автоматически зачислять какую-то сумму на ваш аккаунт в AdMob. Естественно, вашим приложением должны пользоваться люди, то есть приложение должно быть размещено в магазине приложений Google Play или на других площадках.
  27. 2 likes
  28. 2 likes
    Уважаемые коллеги, 5-го октября 2017 года, в славном городе Санкт-Питербурге состоится встреча ценителей FMX и нашего любимого форума fire-monkey.ru. Встреча будет ближе к 20-00, место пока не определено. Кто точно знает, что появиться, отпишитесь, от этого зависит место (много или мало народу будет).
  29. 2 likes
    Обратите внимание на модуль System.IOUtils, а в частности на класс TDirectory. Там Вы найдёте все что Вам нужно.
  30. 2 likes
    Цена соответствует сложности. Если нужен простой label, то это может и перебор, но для чего-то посложнее аналогов просто нет. Кстати, автор Alcinoe в свое время у меня выпросил исходный текст нативного канваса под Android, и делал свой компонент на его основе.
  31. 2 likes
    Вопрос решился применением обновления Delphi до 10.1 Update 2
  32. 2 likes
    Нет. ReturnKeyType - это всего лишь какая надпись будет на кнопке Enter. Поведение по нажатию на эту кнопку задаете именно вы. Система Андроид не знает о том, какой порядок табуляции установлен у ваших контролов, ей это глубоко симметрично. Если переход по Enter необходим - действительно используйте SetFocus, но на всякий случай - оберните его в TThread.ForceQueue
  33. 2 likes
    Разобрался! В этом компоненте полная чувствительность тегов к регистру! И тег font и Font и FONT это разные. То есть, работают теги ТОЛЬКО в нижнем регистре))). Сроду бы не подумал))
  34. 2 likes
  35. 2 likes
  36. 2 likes
    Здавствуйте gelo1. Пример для вас я собирал на коленке и сожалению очень мало данных для анализа ошибки. Но попробуем. 1. Возможно не хватает указания схемы. Т.е. вам необходимо попробовать изменить запрос на SELECT * FROM PUBLIC.Tab_Izv если таблица находиться в схеме PUBLIC. Возникает ли ошибка если вы выполните запрос SELECT * FROM Tab_Izv в вашем Adminnistration Tool? (Кстати что вы для этого используете?) 2. Проверьте настойки соединения с базой в вашем приложении. Кстати какие компоненты для подключения к базе вы используете: FireDAC/UniDAC/ZEOSLib/BDE??? Ну вот пока вроде и все... Как я и сказал слишком мало данных для анализа. С Уважением galex
  37. 2 likes
    отсюда еще раз мораль. не нужно длительные действия выполнять в основном потоке. FormCreate должна всего лишь запускать поток, который считывает и подготавливает все что нужно. А при завершении потока заполняем компоненты на форме. Так что крутить анимацию должна уже вторая форма в то время пока данные готовятся.
  38. 2 likes
    Добрый день! 1. Посмотрите стек при возникновении "stack overflow", та будет видно, что привело к проблеме. 2. Анимации не будет. Анимация работает в основном потоке приложения. Создание формы тоже происходит в основном потоке, т.е на время создания формы анимация остановиться.
  39. 2 likes
    мобильный нельзя только внешний сервер и http...
  40. 2 likes
    База данных по основным комплектующим (двигателям, КПП, АКПП, сцеплениям, карданным валам, мостам) автобусов и троллейбусов МАЗ v10.41 для смартфонов с OS Android и экраном 5...7 дюймов. А также характеристики двигателей. BOKAv10.41.rar
  41. 2 likes
    ENERGY Для получения всех активных уведомлений в Android существует метод: getActiveNotifications added in API level 23 StatusBarNotification[] getActiveNotifications () FMX (Berlin и ниже точно, Tokyo не смотрел) не предоставляет доступ к этому методу, в исходниках (Androidapi.JNI.App.pas) он закомментирован. Возможно при использовании своего wrapper для класса JNotificationManager или отсюда можно получить доступ к требуемому функционалу.
  42. 2 likes
  43. 1 like
    apptethering довольно убогий (его реализация в дельфи) - написали по быстрому модную технологию и забросили. Если не ошибаюсь, за все время существования компонента ни разу он не был исправлен или доделан. Для вашего случая проще и быстрее использовать Indy (UDP сервер и клиент) - для одновременного получения клиентами сообщения отсылаете его сервером в multicast режиме на какой нибудь порт, клиенты получат его одновременно. В apptethering не знают про multicast, по крайней мере в исходниках не нашел и потоки используются только временами и не предсказуемо.
  44. 1 like
  45. 1 like
    Спустя полгода решение проблемы все-таки нашлось. Благодарю эксперта kami!
  46. 1 like
    Хороший функционал и выглядит информативно! Судя по скрину, я бы добавил прозрачность статус бара незнаю как у вас сделана FAB кнопка и кнопка меню, но есть вот такой наборчик диалоги с нативными темами на разных версиях ОС
  47. 1 like
    считать можно. там вроде есть событие onClick - там и можно считать. но за клик никаких баллов (пусть и внутри только приложения) начислять нельзя - это прямо противоречит правилам программы AdSense и AdMob. за это забанят пожизненно и никакая апелляция не поможет. плюс могу забанить за недействительные клики, когда с одного устройства будет много кликов (накрутка). даже если это сделает ваш конкурент - вас могут забанить. забанить могут даже за частые показы на одном и том же устройстве. поэтому показ и клики нужно продумать - допустим не более 10 показов и не более 5 кликов за сеанс. Нужно себя обезопасить, чтобы потом можно было доказать Гуглу, что вы настроены на честный зароботок п.с. в AdMob есть видеореклама с вознаграждением. вот за просмотр (!) этой рекламы можно будет начислять какие-то баллы. но TBannerAd ее не поддерживает (как и модуль, который тут есть для межстраничной рекламы)
  48. 1 like
    В HTML Library в комплекте идет пример чата с автоматической конвертации ссылки на картинку в картинку, ссылки на гугл карту в кусок карты, просто ссылки в активную ссылку и.т.д Ну и понятно, что сообщения могут содержать абсолютно любое оформление текста, картинки и.т.д. Компилированный вариант для VCL http://delphihtmlcomponents.com/editorchatdemo.zip
  49. 1 like
  50. 1 like
    var bmd: TBitmapData; bmp: TBitmap; c, c1: TAlphaColor; x, y: Integer; ... bmp.Map(TMapAccess.ReadWrite, bmd); try c1 := bmd.GetPixel(x, y); bmd.SetPixel(x, y, c); finally bmp.Unmap(bmd); end;
This leaderboard is set to Москва/GMT+03:00