Таблица лидеров


Популярный контент

Показан наиболее популярный контент за 26.03.2018 во всех областях

  1. 7 баллов
    Набросал простенькую программу для создания стилей под все платформы на основе указанного. Программа только меняет информацию о платформе, никаких других измений со стилем не делает. К примеру есть стиль для Android - указываем его программе, - она создает стили для Windows, Mac, iOs на основе указанного. Затем их можно добавлять в StyleBook, запускать и отлаживать этот Android стиль под Windows, что сэкономит массу времени. Exe файл находится в \Win32\Release\Styles4Platforms.exe An app to convert current firemonkey style to other platforms based on the specified *.Style file. App only changes the information about the platform and does not do any other changes with the style. Styles 4 Other Platforms.7z
  2. 6 баллов
    ENERGY

    [Отклонение] TFloatAnimation и TFrame

    Столкнулся с такой же проблемой, если любой компонент (в моем случае TImage ) лежит на фрейме не работает TFloatAnimation вообще. Решение: При создании фрейма нужно указывать Self формы, а не nil. : MyFrame := TMyFrame.Create(Self);
  3. 5 баллов
    ENERGY

    Что невозможно сделать на Delphi для Android?

    Delphi хоронят уже лет 15, это все слова. Нет идеальных инструментов. У всех какие то косяки, втч и у нативных средств, ведь все это придумывают люди, люди не роботы. На деле Delphi отличное средство для мультиплатформенной разработки вполне сложных программ. Мне как фрилансеру вполне хватает. Производительность гораздо лучше чем у Angular\Ionic, которые по факту WebView - веб в браузере - очень тормозное решение и подходит только для формочки "логин\пароль". Также по производительности и глюкам Delphi имхо лучше чем ReactJS, и Xamarin aka Mono. Во фрилансе огромная конкуренция, в основном индусы, в этом плане с Delphi можно быстрее разработать ПО чем предлагают сроки остальные. Проблема Делфай в том что оно дорогое, и не так распространено - (это взаимосвязанный фактор) - таким образом сложно найти команду и мало проектов на нем разрабатывается, меньше сообщество и меньше документации и библиотек с готовыми решения Поэтому для одиночек это больше подходит. Но конечно нужно смотреть на развитие - вот Токио получилась очень сырым продуктом, я до сих пор на Берлине пишу под 4 платформы, если следующая версия выйдет такой же ультраглючной, то следует задуматься. А вообще хороший программист - это тот кто знает несколько языков, не бойтесь учить новое - опыт ускорит разработку с любым инструментом.
  4. 5 баллов
    Всем привет. Смотрю сегодня тренд на публикацию приложений разработанных на Emb'e. Вот наше приложение которое тоже на днях поедет в маркеты Регаемся по номеру подтверждаем эСэМэСиной. Придумываем пин код и подтверждаем его После входа приложение покажет магазины в радиусе 500м Заходим в меню магазина Выбираем категорию для жалобы ---- жалуемся , если надо прикладываем фото Еще кое что подтверждаем отправку жалобы PROFIT!
  5. 5 баллов
    С++ ваше всё, наше всё Делфи
  6. 4 балла
  7. 4 балла
    Тут в процессе работы над одним проектом понадобилось узнать IP адрес устройства. Очень не хотелось включать дополнительные разрешения приложению. Думал ограничится одним "Доступ в Интернет". Вот как это можно сделать: С помощью TIdUDPServer посылаем широковещательное сообщение, с помощью того же TIdUDPServer сами получаем его и в ABinding узнаем с какого IP оно пришло. Таким образом мы узнаем IP адрес интерфейса с маршрутом по умолчанию. Вот код, все просто: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdGlobal, IdSocketHandle, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer; const ConstUDPSendString = 'dfgb2hd3f6gbf'; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } FUDPServer : TIdUDPServer; FMyIP : String; procedure OnUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); procedure GetMyIP; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin GetMyIP; end; procedure TForm1.GetMyIP; begin FMyIP:=''; FUDPServer:=TIdUDPServer.Create; FUDPServer.DefaultPort:=46734; FUDPServer.BroadcastEnabled:=True; FUDPServer.OnUDPRead:=OnUDPServerUDPRead; FUDPServer.Active:=True; FUDPServer.Broadcast(ConstUDPSendString, FUDPServer.DefaultPort); end; procedure TForm1.OnUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin AThread.Synchronize(AThread, procedure begin if BytesToString(AData).Equals(ConstUDPSendString) and FMyIP.IsEmpty then FMyIP:=ABinding.PeerIP; end ); end; end.
  8. 4 балла
    Добрый вечер, Я подумаю об альтернативном средстве распространения новостей. Здесь отпишусь, как определюсь. Скорее всего буду публиковать новости на данном форуме в специальном разделе.
  9. 4 балла
    Задачу решил. Вот измененная процедура, ну и добавил вытягивание параметра sound private Builder buildNotification(String msgTitle, String msgText, String msgSound, PendingIntent contentIntent) { int icon = this.mContext.getApplicationContext().getApplicationInfo().icon; Builder mBuilder = new Builder(this.mContext); mBuilder.setSmallIcon(icon); mBuilder.setTicker(msgTitle); mBuilder.setContentTitle(msgTitle); mBuilder.setContentText(msgText); mBuilder.setContentIntent(contentIntent); // savage if (msgSound == "") { mBuilder.setSound(RingtoneManager.getDefaultUri(2)); } else { mBuilder.setSound(Uri.parse("android.resource://" + this.mContext.getPackageName() + "/raw/"+msgSound)); } // return mBuilder; } Звуковой файл надо добавить в Deployment Расположение res/raw/ При формировании push-сообщения имя файла указывается без расширения. К примеру, если звуковой файл был event1.mp3, то в пуше посылаем "sound":"event1" Во вложении патченый файл. Сборка fmx.jar и classes.dex как в этой теме NotificationPublisher.zip
  10. 4 балла
    Желательно выбирать тот SDK, который советует EMBT т.к. он протестирован = более стабильная программа (прога все равно будет прекрасно работать под последним Android 8). Плюс еще новый SDK сам по себе может быть сырой. Но скоро нам всем придется делать с последними SDK : Starting in late-2018, all new and updated apps will be required to target an SDK that is no more than 1 year older than the current codename release. https://www.androidpolice.com/2017/12/19/play-store-require-new-updated-apps-target-recent-api-levels-distribute-native-apps-64-bit-support/
  11. 3 балла
    МихаилЪ чайковЪ

    Tlabel Click

    lblCompanyMail.HitTest := True; Есть такая строчка у вас?
  12. 3 балла
    В редактировании стиля найди selection, у него SourceLink и перетащи на кружок синий снизу слева. Измени размер и будет щастье... хотя наверняка как-то это тупо, можно правильнее.
  13. 3 балла
    Вот здесь, когда оборачиваете в PendingIntent, присваиваете ему уникальный номер (в примере выше это 1), этот номер где-то храните. PendingIntent := TJPendingIntent.JavaClass.getBroadcast (TAndroidHelper.Context, _ТУТ НОМЕР_, intent, 0); Потом, что бы отменить, создаете идентичный PendingIntent, с номером, с которым запускали, и TAndroidHelper.AlarmManager.cancel(PendingIntent);
  14. 3 балла
    Автор: Зарипов Равиль (ZuBy) Ссылка на приложение: Офф. сайт
  15. 3 балла
    Нашел место, отвечающее за не правильную реализацию звука в NotificationPublisher.java private Builder buildNotification(String msgTitle, String msgText, PendingIntent contentIntent) { int icon = this.mContext.getApplicationContext().getApplicationInfo().icon; Builder mBuilder = new Builder(this.mContext); mBuilder.setSmallIcon(icon); mBuilder.setTicker(msgTitle); mBuilder.setContentTitle(msgTitle); mBuilder.setContentText(msgText); mBuilder.setContentIntent(contentIntent); mBuilder.setSound(RingtoneManager.getDefaultUri(2)); return mBuilder; } Виноват mBuilder.setSound(RingtoneManager.getDefaultUri(2)); буду править и пересобирать fmx.jar
  16. 3 балла
    В копилку знаний. Напишу как решил задачу. Может кому-то будет интересно. Таких как мне надо параметров у MediaPlayer'a конечно нет. Но есть свойство VideoSize.X и Y там можно посмотреть реальный размер воспроизводимого видео в пикселях. Берем эти значения, делим высоту на ширину и выясняем астект (соотношение сторон). После чего берем ширину контейнера в котором отображает видео на форме и умножаем на этот аспект. Получаем нужную высоту контейнера. В итоге если у вас контейнер видео с привязкой Top, Bottom то его размер всегда будет пропорционально равным размеру проигрываемого видео-файла, что избавит от ненужный черных рамок.
  17. 3 балла
    Токио сам по себе довольно глючный, особенно до обновления 10.2.3 там и без таймера баги с анимацией, эффектам и низким FPS на ровном месте, в этом случае лучше Берлин использовать (что я и делаю под Android и iOS (Xcode 9 btw) ).
  18. 3 балла
    ENERGY

    Сглаживание при рисовании в буфер bitmap

    Итак на Android и iOS нет сглаживания при отрисовке примитивов (линий, кругов, вектора). Метод 1 (Native Draw, Delphi ONLY ) - лучший и простой. На Canvas PaintBox рисуем как обычно. Если нужно нарисовать на Canvas Bitmap'a, а не на PaintBox, тогда нужно правильно подготовить Bitmap: if Scene <> nil then lScale := Scene.GetSceneScale else lScale := 1; fBitmap.BitmapScale := lScale; fBitmap.SetSize(Ceil(Width * lScale), Ceil(Height * lScale) ); Все детали здесь, также там ссылка на сайт (используйте гугл переводчик) https://github.com/OneChen/FMXNativeDraw Если нужно сохранить в Bitmap, то делаем PaintBox.MakeScreenshot (TControl.PaintTo) в результате получаем сглаженный Bitmap. Кстати вызвать PaintTo не получится в Paint и Afterpaint методах текущего контрола - будет циклический вызов Paint и в результате переполнение стэка, нужно делать это в AfterPaint формы или фрейма. Метод 2. http://riversoftavg.com/blogs/index.php/2016/06/09/use-supersampling-for-offscreen-bitmaps-on-delphi-mobile/
  19. 3 балла
    Fedor K

    THTTPClient асинхронность

    Что конкретно печально в асинхронности клиента? На какой платформе? Если с примером - то вообще замечательно. п.с. Еще раз повторю, что нареканий со стороны работы асинхронности не было замечено в течении года в нагруженном мобильном приложении на обоих осях, Delphi Berlin Update 2.
  20. 2 балла
    Для получения инфо о доставке пуша, надо использовать XMPP Вот гугломануал Firebase Cloud Messaging XMPP Protocol ПО для отправки сообщений (комп, сервер и т.д.) <-- обмен по протоколу XMPP ---> Сервер гугла FCM <-------> Андроид устройство использовал IdTCPClient Host fcm-xmpp.googleapis.com Port 5236 IdTCPClient.Connect вот сценарий >>> - отправка на FCM <<< - ответ от FCM >>> здороваемся (IdTCPClient1.IOHandler.WriteLn ) <stream:stream to="gcm.googleapis.com" version="1.0" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams"> <<< (IdTCPClient1.IOHandler.Readln) <stream:stream from="gcm.googleapis.com" id="000000000000" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client"> <<< <stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism><mechanism>PLAIN</mechanism></mechanisms></stream:features> >>> логинимся <auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">Base64Encode(sender_id@gcm.googleapis.com+ApiKey)</auth> <<< <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/> >>> отправляем обязательный пакет <stream:stream to="gcm.googleapis.com" version="1.0" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams"> <<< <stream:stream from="gcm.googleapis.com" id="000000000000" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client"> <<< <stream:features><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features> >>> отправляем обязательный пакет <iq type="set"> <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"></bind></iq> <<< <iq type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>sender_id@gcm.googleapis.com/000000</jid></bind></iq> >>> отправляем сообщение <message><gcm xmlns="google:mobile:data">{"message_id":"20","delivery_receipt_requested":true,"to":"DeviceToken","data":{"title":"Message title","message":"Message text"}}</gcm></message> <<< получаем подтверждение, что гуглосервер принл сообщение от нас <message><data:gcm xmlns:data="google:mobile:data">{"message_type":"ack","from":"DeviceToken","message_id":"20"}</data:gcm></message> <<< получаем подтверждение, что сообщение доставлено на андроид-устройство <message to="sender_id@gcm.googleapis.com" from="devices@gcm.googleapis.com" type="normal"><gcm xmlns="google:mobile:data">{"data":{"message_status":"MESSAGE_SENT_TO_DEVICE","device_registration_id":"DeviceToken","message_sent_timestamp":"1524141512313","original_message_id":"20"},"time_to_live":0,"from":"gcm.googleapis.com","message_id":"dr2:20","message_type":"receipt","category":"com.pushTest"}</gcm></message> Ключ АПИ и идентификатор отправителя надо брать в консоли Firebase https://console.firebase.google.com/u/0/project Подробно описано тут http://blog.rzaripov.kz/2017/02/firebase-android-ios.html
  21. 2 балла
    Если честно, тут задача на мой взгляд в неправильном подходе. Который порождает странную задачу. Это как плыть против течения, вместо того, чтобы плыть по течению. Если требуется выполнить данную задачу, то лучше не побояться написать один дополнительный класс "Менеджер объектов", которому вы будите делегировать данную задачу. Чтобы поиск был быстрый, нужно использовать словарь. Время поиска будет O(1) против поиска в списке. Один из вариантов реализации может быть таким: В менеджере есть набор ваших списков (логические группы объектов) - список списков В менеджере есть словарь соответствия контрол -> индекс списка из (1) при добавлении контрола добавляете его в список и заносите контрол в словарь Поиск за О(1) Вариант, который предложил Kami хороший для вариантов, когда объекты ваши. А вот если вы хотите для штатных контролов это сделать, то чтобы подмешать такой интерфейс, вам потребуется сделать наследников для каждого UI контрола. А если эти контролы еще и на форме лежат, то там придется изрядно попотеть, чтобы добавить в IDE ваши версии штатных контролов с этим интерфейсом. P.S. Избегайте паттерна один контрол "владеется" несколькими списками. Это к "При создании каждого из них AOwnsObjects задано как True.". Такой подход рано или поздно при усложнии логики закончится AV и сложным дебаггингом, кто кого удалил и когда и почему. Используйте золотое правило: "Один объект может иметь только одного владельца, один объект может использовать во многих других местах. Только владелец отвечает удаление объекта и в хорошем случае и за его создание. Клиенты объекта только пользуются им и не удаляют его."
  22. 2 балла
    Надо подключать еще android-support-v4.jar Вот мои файлы компиляция "C:\Program Files\Java\jdk1.8.0_60\bin\javac" -source 1.8 -target 1.8 "R:\fmx\com\embarcadero\rtl\notifications\NotificationPublisher.java" -cp "C:\Program Files (x86)\Android\android-sdk\platforms\android-17\android.jar";"C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\android-support-v4.jar" -d "r:\fmx" pause сборка echo off setlocal set JAVA="C:\Program Files\Java\jdk1.8.0_60\bin" set ANDROID_PLATFORM="C:\Program Files (x86)\Android\android-sdk\platforms\android-17" set DX_LIB="C:\Program Files (x86)\Android\android-sdk\build-tools\27.0.3\lib" set EMBO_DEX="C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\classes.dex" set FMX_JAR="C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\fmx.jar" set PROJ_DIR=%CD% set VERBOSE=0 echo. echo COPY ORIGINAL fmx.jar copy %FMX_JAR% %PROJ_DIR%\fmx.jar" echo. echo UPDATE FILE NotificationPublisher.class %JAVA%\jar uf "fmx.jar" "com\embarcadero\rtl\notifications\NotificationPublisher.class" echo. echo CONVERTING FROM jar TO dex mkdir output\dex 2> nul if x%VERBOSE% == x1 SET VERBOSE_FLAG=--verbose call %DX_LIB%\dx.jar --dex %VERBOSE_FLAG% --output=%PROJ_DIR%\output\dex\test_classes.dex --positions=lines %PROJ_DIR%\fmx.jar echo. echo MERGING dex FILES echo.com.android.dx.merge.DexMerger java -cp %DX_LIB%\dx.jar com.android.dx.merge.DexMerger %PROJ_DIR%\output\dex\classes.dex %PROJ_DIR%\output\dex\test_classes.dex %EMBO_DEX% echo. del output\dex\test_classes.dex del output\jar\test_classes.jar rmdir output\jar echo. echo Now we have the end result, which is output\dex\classes.dex pause :Exit endlocal FMX.zip
  23. 2 балла
    Добавил многострочность в PUSH-уведомление Надо или нет пересобирать classes.dex точно не скажу. Говорят, что на 10.2.3 не надо Вначале просто подбросить в проект fmx.jar , если изменений нет, то и classes.dex NotificationPublisher.zip
  24. 2 балла
    В рантайме нет никаких дженериков. Компилятор преобразует все дженерики в реальные списки с необходимой типизацией. Поэтому - действительно никак. Вполне возможно, что даже is TObjectList<TMyClass> не сработает - компилятор вполне вправе посчитать исходный класс TObjectList<TMyClass> не тем, с которым производится is. Это неправильно. Потому что есть еще Insert, есть Update (в том числе - и InsertRange). Правильно - перекрыть метод Notify или реализовать обработчик события OnNotify (последнее даже создания наследников не требует). Вообще, если по каким-то причинам необходимо знать "владельца", было бы совсем хорошо сделать наследника от TRectangle, который будет реализовывать интерфейс наподобие такого: IOwneredIntf = interface ['{ADF563F3-B4CE-4E96-9559-F0FFC2936D5Z}'] function GetOwner: TObject; procedure SetOwner(const Value: TObject); property Owner: TObject read GetOwner write SetOwner; end; Список, который хочет установить владельческие отношения с этим TRectangle, в своем методе Notify приводит его к интерфейсу и устанавливает intf.Owner:=Self Ну и в обратном порядке - тоже. При этом появляется возможность работать со списком не только TRectangle, а вообще чем угодно, что поддерживает указанный интерфейс. И если список сделать тоже с поддержкой интерфейса (не знаю, какие методы в нем необходимы), то и сам объект может работать со своим владельцем абсолютно не интересуясь его типом.
  25. 2 балла
    ENERGY

    Книга для сишников

    Да Осипов молодец, прям удивляюсь его производительности. И для Delphi сколько качественных книг уже выпустил и для С++. Интересно на каких форумах он обитает?
  26. 2 балла
    да нет, все правильно. целевой sdk можно указывать любой для которого обеспечена совместимость. а вот минимальный зависит от того на какой версии он будет запускаться. но при этом вы гарантируете работу программы на sdk от минимальной до целевой.
  27. 2 балла
    Akad

    Тормозит выполнение таймера

    Есть смысл переходить с 10.2.2 на 10.2.3? Народ тут писал, что студия вылетать стала на ровном месте. А судя по чейнж логу ни одного серьёзного бага поправлено не было. Во-первых интервал в 1мс для таймера не достижим без специальной настройки ОС. Реально события будут приходить 10-23мс. И это при условии, что программа больше ничего не делает. Это не зависит от дельфи, а зависит от винды. Во-вторых "накладные расходы" таймера при таком обновлении - это основная статья расходов процессора. И вообще так писать - это просто жесть. Любая анимация - это 1000/60мс т.е. частота обновления среднестатистического монитора. И то лучше 1000/30 или 1000/25. Меньше плавности на чуть, зато будет реально работать. Если нужна не анимация, а рассчёт чего-то - это надо выносить в отдельный поток. Если речь идёт про андроид/яось, то кроме нескольких деталей в целом ситуация не меняется. Писать так нельзя.
  28. 2 балла
    Alex7wrt

    Тормозит выполнение таймера

    Выше правильно написали о глюках в Tokyo под Android. Также учтите, что событие таймера, также как и анимации, обрабатываются в главном потоке. При этом вы задали достаточно маленький интервал для таймера. Поэтому, лучше перенести действия над визуальными компонентами за пределы таймера (если они там есть), а сам таймер сделать на основе потоков.
  29. 2 балла
    а что в этом сложного? найди сервис который будет тебе отправлять смску за нормальную цену. 1) сгенерируй код, в пределах 1111-9999 2) запомни его (в переменную) 3) вызови апи сервиса который отправляет смс, со своим текстом и кодом 5) вызови диалог ввода смс-кода 6) пользователь вводит смс-код 7) сравниваешь с сохраненным в переменную значением 8) Профит! 6 пункт можно автоматизировать, через бродкаст и автоматическое чтение смс
  30. 2 балла
    ENERGY

    Пример с CurveTo, кривые Безье

    Исправленный код для Берлина и выше: procedure TForm2.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var path : TPathData; begin path := TPathData.Create; try path.MoveTo(TPointF.Create (10,100)); path.CurveTo (TPointF.Create(100,10),TPointF.Create(150,150), TPointF.Create(200,100)); Canvas.Stroke.Thickness := 2; Canvas.Stroke.Kind := TBrushKind.Solid; Canvas.Stroke.Color := TAlphaColorRec.Red; Canvas.BeginScene; Canvas.DrawPath(path, 1.0); Canvas.EndScene; finally path.Free; end; end;
  31. 2 балла
    wamaco

    Delphi 10.2.3, AdBanner, Java, trouble

    Да
  32. 2 балла
    ENERGY

    THTTPClient асинхронность

    Лучше использовать потоки, т.к. сейчас все моб. девайсы имеют многоядерные процессоры. TThread.CreateAnonymousThread( procedure begin // код TThread.Queue(nil, procedure begin // здесь код выполнится только по окончании работы потока (отложенный), в главном потоке. // здесь можно работать с формой. end); end ).Start; TThread.CreateAnonymousThread(procedure () begin TThread.Synchronize (TThread.CurrentThread, procedure () begin // код выполнится в главном потоке, - к примеру чтобы показать прогресс на форме. и затем // поток продолжит работу. end); end).Start; Всегда помните что нельзя работать с формой из других потоков, без методов синхронизации. Только в главном, иначе будут случайные AV ошибки. Еще почитайте. http://blog.marcocantu.com/blog/2014_may_background_delphi_android_threads.html
  33. 2 балла
    ENERGY

    Как достать данные из Intent

    Чтобы отправить строку в чужой Intent: Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringtoJString(AText)); Чтобы получить строку в своем Activity (если кто-то отправил) : var Intent: JIntent; ... Intent := TAndroidHelper.Activity.getIntent; Text := JStringToString(Intent.getStringExtra( StringToJString(_NAME_) ) );
  34. 2 балла
    FREEFAR

    Gif File

    кому интересно кто искал как воспроизвести GIF на Image китайский брат постарался)) http://www.raysoftware.cn/?p=559 на Win и Andriod все четко
  35. 2 балла
    sinuke

    MapView рушит приложение в Tokyo 10.2.3

    В чате проскакивал вопрос по пушам в 10.2.3. Ярослав говорил, что забыли "положить" в новом релизе какую-то либу с сервисами гугла. Может быть и карты на этой либе завязаны...
  36. 2 балла
    Вот здесь например есть пример решения, там же есть ссылка на проект (это ModernLV. http://blog.rzaripov.kz/2016/11/0-modernlistview.html), но думаю что и из стандартного LV можно тоже самое добиться при желании. Тут конечно проще.
  37. 1 балл
    Так поиск в словаре O(1). Вычисление хеша и получение индекса.
  38. 1 балл
    Axbor

    Собственный TListBoxItem на C++

    Очень не хватает примеров на C++. Решил поделится опытом. Рассмотрим создание собственного "ListBoxItem"а на C++. И так начнем. Для начало создадим стиль для нашего "ListItem"а. В моем случае оно выглядит так: Структура выглядеть следующим образом: А вы сразу можете создать собственный стиль. Создадим класс для нашего "Item"а. Я назвал его TMyListBoxItem. Нужно знать следующие вещи: ApplyStyle() вызывается когда стиль загружен. FreeStyle() когда стиль выгружен. GetDefaultStyleLookupName() когда стиль не задано берется названые стиля по умолчанию. FindStyleResource("стиль") ищет в стиле ресурс с заданным названием. ListBox автоматически очищает из невидимых "Item"ов стиль что бы избежать от расходы на память. И заново загружает когда оно видимо. При этом вызывается соответствующие функции приведенные выше я приведу только некоторые кусочки кода. Остальное всё можете посмотреть в прикреплённых файлах. class TMyListBoxItem : public TListBoxItem { private: // Переменные для хранения данных System::UnicodeString FTimeTo; System::UnicodeString FTimeFrom; //.... // Визуальные компоненты TText* FTextTimeTo; TText* FTextTimeFrom; //... // Функции для присваивания данных, это нужно при написании "properties" void __fastcall SetTimeTo(const System::UnicodeString Value); void __fastcall SetTimeFrom(const System::UnicodeString Value); protected: void __fastcall ApplyStyle(); void __fastcall FreeStyle(); System::UnicodeString __fastcall GetDefaultStyleLookupName(); virtual void UpdateStyleData(); __published: __property System::UnicodeString TimeTo = {read=FTimeTo, write=SetTimeTo}; __property System::UnicodeString TimeFrom = {read=FTimeFrom, write=SetTimeFrom}; public: __fastcall TMyListBoxItem(System::Classes::TComponent* AOwner); }; Теперь напишем сами функции. void __fastcall TMyListBoxItem::ApplyStyle() { // Вызов метода предка TListBoxItem::ApplyStyle(); TFmxObject *StyleObject; // Поиск ресурса из стиля. Посмотрите в скрине, там есть ресурс с названием "timeto" типа TText StyleObject = FindStyleResource("timeto"); // dynamic_cast нужен для корректного преобразования типов. Если тип найденного ресурса не является TText то указателю будет присвоен NULL FTextTimeTo = dynamic_cast<TText*>(StyleObject); StyleObject = FindStyleResource("timefrom"); FTextTimeFrom = dynamic_cast<TText*>(StyleObject); UpdateStyleData(); } void __fastcall TMyListBoxItem::FreeStyle() { // Стиль выгружен из памяти. Нужно очистить указатели что бы избежать ошибок FTextTimeTo = NULL; FTextTimeFrom = NULL; TListBoxItem::FreeStyle(); } System::UnicodeString __fastcall TMyListBoxItem::GetDefaultStyleLookupName() { // название стиля для нашего "Item"а по умолчанию return "mylistboxitemstyle"; } void TMyListBoxItem::UpdateStyleData() { if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; if(FTextTimeFrom) FTextTimeFrom->Text = FTimeFrom; } void __fastcall TMyListBoxItem::SetTimeTo(const System::UnicodeString Value) { FTimeTo = Value; if(FTextTimeTo) FTextTimeTo->Text = FTimeTo; } Вот и всё. Остается только добавит в наш проект ListBox и button для проверки. Вот функция создания нашего "Item"а: void __fastcall TForm1::Button1Click(TObject *Sender) { TMyListBoxItem *Item = new TMyListBoxItem(this); Item->Parent = ListBox1; Item->StyleLookup = "customstyle1"; Item->TimeFrom = "11:20"; Item->TimeTo = "12:50"; } Скриншот программы: В архиве мой класс и стиль. Для корректного отображения некоторых символов нужен fontcustom Какие вопросы задавайте. Отдельное спасибо Ярославу за мануал на дельфи: http://blogs.embarcadero.com/yaroslavbrovin/2012/10/15/listboxitem_styling_part2/ Администраторы и модераторы, прошу подкорректировать если что то неправильно. ListBoxItem.zip
  39. 1 балл
    krapotkin

    ListView - DynamicAppearance - header

    что ж у вас так запутанно-то всё procedure TfMain.b1Click(Sender: TObject); var li:TListViewItem; begin li := lv1.Items[0]; ShowMessage(li.text); end; procedure TfMain.FormCreate(Sender: TObject); var li:TListViewItem; begin li := lv1.Items.Add; li.Purpose := TListItemPurpose.Header; li.Text := '12345'; li.Detail :='67890'; end;
  40. 1 балл
    Пишите в TagObject элемента экземпляр TObjectList ! И все!
  41. 1 балл
    beklexx

    Навигация TmapView

    если кому лень искать инфу, может пригодится... на основе ответа от Akad для google maps uses Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText ... var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); try Intent.setData(StrToJURI('google.navigation:q='+GX+','+GY+'&mode=d')); //если есть google maps except Intent.setData(StrToJURI('https://www.google.com/maps/dir/?api=1&destination='+GX+','+GY+'&travelmode=driving')); //иначе открываем ссылку в браузере end; SharedActivity.startActivity(Intent); end;
  42. 1 балл
    FREEFAR

    Странное поведение переменной integer

    где может быть в другом месте инициализирована CartList если в конкретном примере она объявлена в процедуре
  43. 1 балл
    Akad

    Странное поведение переменной integer

    Что такое CartList? Зачем High использовать (от слова вообще)? Что такое rz? Если for 0 to 0, то 1 раз цикл выполнится. P.S. Почему бы на форумах не перестать считать всех телепатами?
  44. 1 балл
    krapotkin

    Тормозит выполнение таймера

    трудно придумать что-то, что может успеть выполниться менее чем за 1 мсек на десктопе, а на мобильном и подавно так что вы немного остудите жар-то ))
  45. 1 балл
    DMS

    Что невозможно сделать на Delphi для Android?

    Это существенный минус, из-за которого AS нельзя даже относить к RAD-средствам
  46. 1 балл
    sinuke

    Использование GameAudioManager.pas

    В последнем Токио Application.ProcessMessages использовать под Андройд нельзя = смерть приложению если нужно выполнять какую-либо операцию и сохранить отзывчивость интерфейса, то это самое время, чтобы перейти на использование потоков (thread'ов). Гуру, поправьте меня, если я не прав
  47. 1 балл
    mazayhin

    SSDP for Android

    Как вижу, тут есть 3 варианта. 1. Взять обертки над SDK от fmxexpress (или сделать самому), и самому написать по примеру выше, но уже на delphi. 2. Найти подходящее на Java, скомпилировать в jar, создать обертку для delphi (Java2Op) и использовать уже ее. 3. Наверное, самый удачный вариант, т.к. все это чудо работает по UDP, самому на основе Indy реализовать в своей программе.
  48. 1 балл
    Kitty

    Проблемы с кодировкой почты под Android

    Вот здесь в середине дискуссии автор Indy, показывает как правильно делать: Форум где пишет автор Indy Там правда показано для С++ Builder, но легко на Дельфи поменять...
  49. 1 балл
    gonzales

    Пуши в IOS

    Еще доп. накину на вентилятор, вдруг кому пригодится. Чтобы в iOS появилась наклейка с цифрой на иконке программы нужно добавить в JSON запроса пуша в объект notification пару badge=цифра
  50. 1 балл
    Вот модуль который решает проблему минимального размера: FMX.FormHelper.zip Просто подключите модуль к своему проекту и объявите его в uses. Пользоваться вот так: procedure TForm1.FormCreate(Sender: TObject); begin SetMinSize(640, 480); end; Все. Теперь размер формы будет ограничен 640х480.
Эта таблица лидеров рассчитана в Москва/GMT+03:00