Перейти к содержанию
Fire Monkey от А до Я

Лидеры

  1. Евгений Корепов

    Евгений Корепов

    Пользователи


    • Баллы

      5

    • Постов

      738


  2. krapotkin

    krapotkin

    Пользователи


    • Баллы

      3

    • Постов

      2 185


  3. ENERGY

    ENERGY

    Пользователи


    • Баллы

      3

    • Постов

      568


  4. Andrey Efimov

    Andrey Efimov

    Модераторы


    • Баллы

      2

    • Постов

      842


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

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

  1. там стоит заглушка, которая выводит надпись "ваша платформа не поддерживается, до свидания" но факт в том, что на большом кол-ве интел стоит библиотека houdini которая поддерживает запуск программ, написанных для ARM в результате и ваша программа тоже имеет шанс запуститься. поэтому, убрав эту птицу, вы можете "без программирования", как это принято в RAD Studio ))) получить хороший результат )))
    3 балла
  2. Оф. справка: Workaround for Android 4.0/Kindle Fire Message: "Application does not support this device"
    2 балла
  3. Brovin Yaroslav

    Toast и tDuration

    Добрый день, На андроиде нет такой возможности. Там эти два режима задаются через константы и не имеют привязки к конкретным значениям времени.
    1 балл
  4. 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';
    1 балл
  5. dnekrasov

    Как использовать CopyFromBitmap

    Маленький примерчик CopyFromBitmap.zip
    1 балл
  6. Потому что это служебное поле, за которое объект-владелец не в ответе. Для иного вы можете использовать Image2.AddObject() - в этом случае Image2 будет знать о своих "детях" (Image2.Children в количестве Image2.ChildrenCount) и при самоубийстве покарает и детей. А в случае TagObject он проигнорирует содержащийся там объект и возникнет утечка памяти. Воспринимайте TagObject как средство хранения ссылки на реально существующий в приложении объект, а не как место хранения самого объекта.
    1 балл
  7. Ага, разобрался - все дело в объявлении 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 балл
  8. Действительно с 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 балл
  9. 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 балл
  10. 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';
    1 балл
  11. 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;
    1 балл
  12. Действительно. Мог бы я и сам догадаться - функция возвращает куда больший кусок памяти чем описано структурой, вот лишние данные и залезают в память выделенную под другие нужды. Вот тут описание структуры http://docs.nvidia.com/cuda/cuda-runtime-api/structcudaDeviceProp.html#structcudaDeviceProp и видимо под каждую версию Cuda она своя. Или таскать именно cudart32_41_28.dll с приложением.
    1 балл
  13. Вместо утреннего кофе, уперся рогом и сделал получение информации через 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.7z
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...