Лидеры
Популярный контент
Показан контент с высокой репутацией 10.05.2017 во всех областях
-
там стоит заглушка, которая выводит надпись "ваша платформа не поддерживается, до свидания" но факт в том, что на большом кол-ве интел стоит библиотека houdini которая поддерживает запуск программ, написанных для ARM в результате и ваша программа тоже имеет шанс запуститься. поэтому, убрав эту птицу, вы можете "без программирования", как это принято в RAD Studio ))) получить хороший результат )))3 балла
-
Исключить устройства с Intel Atom как не поддерживаемые
Ingalime и ещё один отреагировал Andrey Efimov за вопрос
Оф. справка: Workaround for Android 4.0/Kindle Fire Message: "Application does not support this device"2 балла -
Toast и tDuration
Kitty отреагировал Brovin Yaroslav за вопрос
Добрый день, На андроиде нет такой возможности. Там эти два режима задаются через константы и не имеют привязки к конкретным значениям времени.1 балл -
Создаете свой стиль для 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';1 балл
-
Как использовать CopyFromBitmap
Andrey Efimov отреагировал dnekrasov за вопрос
Маленький примерчик CopyFromBitmap.zip1 балл -
Проблема с сохранением объекта в TagObject
Rusland отреагировал Евгений Корепов за вопрос
Потому что это служебное поле, за которое объект-владелец не в ответе. Для иного вы можете использовать Image2.AddObject() - в этом случае Image2 будет знать о своих "детях" (Image2.Children в количестве Image2.ChildrenCount) и при самоубийстве покарает и детей. А в случае TagObject он проигнорирует содержащийся там объект и возникнет утечка памяти. Воспринимайте TagObject как средство хранения ссылки на реально существующий в приложении объект, а не как место хранения самого объекта.1 балл -
Проблема с сохранением объекта в TagObject
Rusland отреагировал Евгений Корепов за вопрос
Ага, разобрался - все дело в объявлении 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.1 балл -
Проблема с сохранением объекта в TagObject
Rusland отреагировал Евгений Корепов за вопрос
Действительно с 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. Не понятно.1 балл -
Узнать размер видеопамяти
Andrey Efimov отреагировал 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, в первом архиве есть пример использования. В архиве как раз есть рабочий пример вычислений1 балл -
Есть еще один альтернативный способ доступа к объектам. Вместо 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';1 балл
-
Ребята, если вам нужна кнопка с картинкой на 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;1 балл
-
Узнать размер видеопамяти
Brovin Yaroslav отреагировал Евгений Корепов за вопрос
Действительно. Мог бы я и сам догадаться - функция возвращает куда больший кусок памяти чем описано структурой, вот лишние данные и залезают в память выделенную под другие нужды. Вот тут описание структуры http://docs.nvidia.com/cuda/cuda-runtime-api/structcudaDeviceProp.html#structcudaDeviceProp и видимо под каждую версию Cuda она своя. Или таскать именно cudart32_41_28.dll с приложением.1 балл -
Узнать размер видеопамяти
Andrey Efimov отреагировал Евгений Корепов за вопрос
Вместо утреннего кофе, уперся рогом и сделал получение информации через CUDA, тесовый проект прилагаю. В режиме отладки работает отлично, вижу размер видеопамяти, но потом вылетает с access violation (при обращении к визуальным компонентам или просто при продолжении работы). В чем дело понять не могу, сначала грешил на FMX, но проект на VCL выдает те же симптомы. Очень, очень странные дела... Код простой, используется cudaRT.pas из CUDA wraper Паскуда https://code.google.com/archive/p/pascuda/source/default/source и cudart32_65.dll идущая вместе с драйверами NVIDIA Var CudaDeviceProp : TCudaDeviceProp; hDevice: Integer; GPUMemorySize : Cardinal; LMessage : String; begin hDevice:=0; if CudaGetDeviceProperties(CudaDeviceProp, hDevice)=ceSuccess then begin GPUMemorySize:=CudaDeviceProp.TotalGlobalMem div 1024 div 1024; LMessage:=Format('GPU Memory size = %d Mb', [GPUMemorySize]); Memo.Lines.Add(LMessage); end; test099 Cuda Info VCL.7z1 балл