-
Постов
1 204 -
Зарегистрирован
-
Посещение
-
Победитель дней
26
Активность репутации
-
Rusland отреагировална ENERGY в Печать с планшета
А это читали? Google CloudPrint
https://community.embarcadero.com/blogs/entry/printing-from-an-android-device-using-firemonkey-272
-
Rusland получил реакцию от Kitty в [Андроид]контроль интревала времени в сервисе
Стандартный TTimer использовать нельзя. Тут посмотрите
-
Rusland отреагировална Mars M в 2D<>3D координаты
Есть такие функции LocalToAbsolute3D и AbsoluteToLocal3D
С первой разобрался(пример), со второй тоже в принципе ясно.
Осталось только разобраться как это применить
PS: пример честно скопипастил отсюда у него там есть и другие интересные проекты.
https://github.com/LUXOPHIA/Sketch3D
Projects.rar
-
Rusland отреагировална Mars M в 2D<>3D координаты
Спасибо, гляну, может что и найду там
Вот тут тогда тоже может быть то чего нету в примерах
https://sourceforge.net/p/radstudiodemos/code/HEAD/tree/trunk/Object Pascal/
-
Rusland отреагировална ENERGY в 2D<>3D координаты
Кстати на гитхабе есть ветка с примерами программ, которых нет в Samples в последних версиях Delphi (часть примеров удалили в новых версиях), и там встречаются интересные примеры, втч. и связанные с 3D.
Может это вам поможет. https://github.com/FMXExpress/Firemonkey/tree/master/Embarcadero
Я бы на вашем месте скачал все примеры, распаковал их, а затем в Total Commander запустил бы поиск по тексту в *.pas файлах, например 'TViewport3D'
-
Rusland получил реакцию от erden1 в [Android] Проблема с MediaPlayer
Проверьте, есть ли файл по этому пути с помощью FileExists()
Может быть из-за символа # деплой не срабатывает.
-
Rusland отреагировална Pavel Vasilev в Аналог GLScene для Firemonkey
Только с тех пор адрес и название сменилось для поддержки OpenVX на
https://sourceforge.net/p/glscene/code/HEAD/tree/branches/VXScene/
-
Rusland отреагировална Pavel Vasilev в Возможно ли работать с OpenGL в FireMonkey?
Да, можно, пример использования OpenGL
в FireMonkey есть по адресу
https://github.com/tothpaul/Delphi.
Там в демосе CubeMan3D используется модуль Execute.CrossGL.pas с реализацией кросс-платформенного
контекста для Windows, MacOSX, Android и Linux.
Также в проекте VXScene (https://sourceforge.net/p/glscene/code/HEAD/tree/branches/VXScene/Source/Basis/)
подключен модуль VKS.OpenGLFMX для работы
с OpenGL в FireMonkey под Win32/Win64.
-
Rusland отреагировална ENERGY в Доступ к Объекту в TListBox
Создаете свой стиль для ListBox (точнее редактируете на основе стандартного). Там можно все визуально настроить как на обычной форме. Указываете этот StyleBook форме.
Имена объектов указываете в StyleName каждого объекта.
Чтобы менять картинку просто указывая image index для ListBox Item'a (vItem.ImageIndex ) картинка TGlyph должна иметь имя 'glyphstyle'.
Далее обращаетесь к ним по StyleName именам так:
vItem.Text := vCampaign.Name; vItem.StylesData['descript'] := fCore.Settings.LoadCampaignDescr(vCampaign.Name); vItem.StylesData['details'] := ''; vItem.ImageIndex := 3; В моем случае descript и details - это TText.
А вот так работать можно с любыми контролами:
vItem.NeedStyleLookup; vItem.ApplyStyleLookup; // without this, FindStyleResource will return nil vSwitch := vItem.FindStyleResource('switch') as TSwitch; Assert(vSwitch <> nil); vSwitch.IsChecked := vCampaign.Enable; vSwitch.OnClick := DoOnClickCampaignSwitch;
ну и на всякий случай:
vItem := TListBoxItem.Create(nil); vItem.Parent:= Listbox; Listbox.AddObject(vItem); vItem.StyleLookup := 'CampaignItem';
-
Rusland отреагировална Mars M в Узнать размер видеопамяти
Подниму тему. CUDA конечно хорош(а?), но только для nvidia.
Наткнулся тут на работу с OpenCL в делфи http://www.delphisources.ru/forum/showthread.php?t=28188
Там по ссылке в первом сообщение в принципе все есть что нужно. Кому оттуда не удобно перезалил все файлы https://yadi.sk/d/t3mPqlJT3HnfiX
Вот пример использования https://yadi.sk/d/bmDKXZ0k3Hnfny
Проверял на картах nvidia и ati, конечно же карты должны поддерживать OpenCL.
Если в MyOpenCL.pas чего то не хватает, можно взять это в CL.pas из GLScene https://sourceforge.net/p/glscene/code/HEAD/tree/trunk/Source/ParallelAPIs/
Я например добавил константу CL_DEVICE_LOCAL_MEM_SIZEэ
А можно использовать родные CL.pas и CL_Platform.pas, в первом архиве есть пример использования.
В архиве как раз есть рабочий пример вычислений
-
Rusland отреагировална Евгений Корепов в Проблема с сохранением объекта в TagObject
Потому что это служебное поле, за которое объект-владелец не в ответе. Для иного вы можете использовать Image2.AddObject() - в этом случае Image2 будет знать о своих "детях" (Image2.Children в количестве Image2.ChildrenCount) и при самоубийстве покарает и детей. А в случае TagObject он проигнорирует содержащийся там объект и возникнет утечка памяти. Воспринимайте TagObject как средство хранения ссылки на реально существующий в приложении объект, а не как место хранения самого объекта.
-
Rusland отреагировална Евгений Корепов в Проблема с сохранением объекта в TagObject
Ага, разобрался - все дело в объявлении TagObject как "слабой" ссылки: [Weak] FTagObject: TObject, т.е. присвоение этому полю не увеличивает счетчик ссылок и объект будет жив только в пределах вашей процедуры. Грубо говоря в "слабой" мы храним объект до тех пор, пока он хранится где то еще.
Вам НЕОБХОДИМО создавать ГЛОБАЛЬНУЮ структуру для хранения этих объектов. К примеру сохранит картинки в TObjectList (модуль System.Generics.Collections), и после этого уже присваивать их в Image2.TagObject
Вот работающий вариант вашего кода:
unit copystream; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, System.Generics.Collections; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; SaveBut: TButton; LoadBut: TButton; procedure SaveButClick(Sender: TObject); procedure LoadButClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } FImageStore : TObjectList<TMemoryStream>; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin FImageStore:=TObjectList<TMemoryStream>.Create; end; procedure TForm1.LoadButClick(Sender: TObject); begin if Assigned(Image2.TagObject) then Image2.Bitmap.LoadFromStream(Image2.TagObject as TMemoryStream); end; procedure TForm1.SaveButClick(Sender: TObject); Var LStream : TMemoryStream; begin LStream:=TMemoryStream.Create; FImageStore.Add(LStream); try Image1.Bitmap.SaveToStream(LStream); finally Image2.TagObject:=LStream; end; end; end.
-
Rusland отреагировална Евгений Корепов в Проблема с сохранением объекта в TagObject
Действительно с TMemoryStream не работает, хотя вот так работает превосходно:
procedure TForm1.LoadButClick(Sender: TObject); begin if Assigned(Image2.TagObject) then Image2.Bitmap.Assign(Image2.TagObject as TBitmap); end; procedure TForm1.SaveButClick(Sender: TObject); begin Image2.TagObject:=Image1.Bitmap; end; Насколько критично для вас использовать прокладку в виде TMemoryStream? С TMemoryStream счетчик Image2.TagObject.RefCount по какой то причине обнуляется при выходе из процедуры SaveButClick. Не понятно.
-
Rusland отреагировална ENERGY в Кнопки у ListVew ItemAppearance
Есть еще один альтернативный способ доступа к объектам.
Вместо AItem.Objects.FindDrawable('TextButton16') можно обращаться по индексам. Это гораздо быстрее. Т.к. не нужно перебирать все объекты и сравнивать их строковые имена. К примеру в моем случае их аж 16, и у каждого есть имя. Каждое строковое имя нужно перебрать и сравнить с искомым. При этом в OnUpdateObjects это может делаться несколько раз на каждый List item.
Сделать это можно так:
aItem.View.ViewList[x]
Напр:
aItem.View.ViewList[10].Height := 30;
Список можно посмотреть так:
В инспекторе объектов, найдите ListView, в нем Item. Выберите его, и в списке свойств нажмите Objects- это и будет полные список объектов. Начинается он с нуля. Отсчитаете нужный, и можно работать с ним.
Upd:
Также можно изменять объекты TListItem'a по индексу вместо Data['name']. Там тоже используется FindDrawable.
Для этого сначала нужно добавить один раз значение через Data для любого из объектов чтобы создать нужны структуры (обычно для первого Object'a ), а затем уже заполнять по индексу остальные Objects в любой последовательности (не обязательно подряд).
vItem.Data['T'] := 'Text' // Data['T'] - это текст ListItem, так он стандартно обозначен
Дальше уже добавляем текст в объекты через индекс:
(vItem.View.Drawables[5] as TListItemText).Text := 'Text 5';
(vItem.View.Drawables[1] as TListItemText).Text := 'Text 2';
-
Rusland отреагировална ENERGY в Кнопки у ListVew ItemAppearance
Ребята, если вам нужна кнопка с картинкой на ListView, то это можно сделать скомбинировав картинку с кнопкой .
Сначала добавляете TTextButtonObjectAppearance, затем TImageObjectAppearance и устанавливаете картинку поверх кнопки.
Чтобы определить по какому элементу Item'a кликнул юзер:
procedure TForm1.ListView1ItemClickEx(const Sender: TObject; ItemIndex: Integer; const LocalClickPos: TPointF; const ItemObject: TListItemDrawable); begin if ItemObject = nil then exit; ShowMessage('Name: ' + ItemObject.Name + sLineBreak + 'Text: ' + (ItemObject as TListItemText).Text); end;
-
Rusland отреагировална dnekrasov в Как использовать CopyFromBitmap
Маленький примерчик
CopyFromBitmap.zip
-
Rusland отреагировална krapotkin в Исключить устройства с Intel Atom как не поддерживаемые
там стоит заглушка, которая выводит надпись "ваша платформа не поддерживается, до свидания"
но факт в том, что на большом кол-ве интел стоит библиотека houdini которая поддерживает запуск программ, написанных для ARM
в результате и ваша программа тоже имеет шанс запуститься. поэтому, убрав эту птицу, вы можете "без программирования", как это принято в RAD Studio ))) получить хороший результат )))
-
Rusland отреагировална Равиль Зарипов (ZuBy) в XE10.2 Tokyo есть запись вебинара от 28.03.2017?
это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
-
Rusland отреагировална Pavel Vasilev в Компонент TLang
Да, теперь всё работает и в рантайме. Не нашел Autotranslate в инспекторе в свойствах меню, а могли бы туда и добавить, чтобы не писать в коде лишнего.
Тест исправлен.
TestTLang_Menu.rar
-
Rusland отреагировална enatechno в Компонент TLang
Ваша ошибка, что вы пытаетесь перевести текущий текст, который отображается. Нужно переводить английский (английские слова как бы являются индексом для перевода). В этом случае TransManually не нужен. Например вместо MenuItemFile.Text := TransManually(MenuItemFile.Text); нужно писать:
MenuItemFile.Text := Translate('File'); Или более простой способ, задать один раз (например в Create):
MenuItemFile.AutoTranslate := true;
-
Rusland отреагировална enatechno в XE10.2 Tokyo есть запись вебинара от 28.03.2017?
Похоже первый hotfix .
-
Rusland отреагировална ElenaS. в Новая версия FastReport FMX
Добрый день. Теперь у продукта универсальный установщик, вместо отдельных для каждой версии. На сайте поменяли.
-
Rusland отреагировална Fedor K в Как отключить TLang на форме/компоненте?
Дело в том, что TComboBox лишь контейнер, вам нужно обращаться именно к списку элементов в ListBox. Чтобы запретить перевод можно поступить так:
var i, count : integer; begin count := cbbFiles.Count - 1; for i := 0 to count do cbbFiles.ListBox.ListItems[i].AutoTranslate := False; end;
-
Rusland отреагировална Евгений Корепов в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]
Равиль, сразу извиняюсь, готов понести наказание, но запощу решение.
Как уже говорил все просто, если у вас 4345 сообщений, то делим массив токенов и отправляем 4 раза по 1000, и один раз 345. Не забывайте что вы программисты, и во всех языках программирования это делается одинаково просто. Вот код, писал прямо в гитхабе, естественно не проверял, если что то упустил, прошу прощения (а упустил я анализ результата).
function pushSendOver1000($title, $text, $tokens, $server_key) { $Count_Success = 0; $DeviceCountMax = 1000; $DeviceCountIndex = 0; $DevicesTokenPacketArray = array(); while ($DeviceCountIndex<=count($tokens)) { $DevicesTokenPacketArray = array_slice($tokens, $DeviceCountIndex, $DeviceCountMax); pushSend($title, $text, $DevicesTokenPacketArray, $server_key); $DeviceCountIndex = $DeviceCountIndex + $DeviceCountMax; } } Запостил также на гитхаб. Можете ручками добавить функцию в конец https://github.com/rzaripov1990/PUSHTestFCM/blob/master/pushTest/push.php и соответственно вызывать не pushSend, а pushSendOver1000
-
Rusland отреагировална ENERGY в Разрешение/запрет гасить экран
Вот вариант, его можно применять в любом месте (обычно в OnCreateForm), не обязательно в DPR.
Флаг можно добавлять и удалять.
Для обычного запрета выключать экран нужен только лишь флаг FLAG_KEEP_SCREEN_ON, остальные не нужны.
Для Tokyo и возможно поздних версий, CallInUIThread не нужен.
{$IFDEF ANDROID} procedure TurnOnAndKeepScreenAndroid(aEnable: boolean); var vFlags: integer; begin vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON; if aEnable then begin CallInUIThread ( // uses FMX.Helpers.Android procedure begin TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags); end ); end else CallInUIThread ( procedure begin TAndroidHelper.Activity.getWindow.clearFlags (vFlags); end ); end; {$ENDIF}