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

Равиль Зарипов (ZuBy)

Модераторы
  • Постов

    2 517
  • Зарегистрирован

  • Посещение

  • Победитель дней

    264

Активность репутации

  1. Like
    Равиль Зарипов (ZuBy) отреагировална 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';
     
  2. Like
    Равиль Зарипов (ZuBy) отреагировална Евгений Корепов в Проблема с сохранением объекта в TagObject   
    Потому что это служебное поле, за которое объект-владелец не в ответе. Для иного вы можете использовать Image2.AddObject() - в этом случае Image2 будет знать о своих "детях" (Image2.Children в количестве Image2.ChildrenCount) и при самоубийстве покарает и детей. А в случае TagObject он проигнорирует содержащийся там объект  и возникнет утечка памяти. Воспринимайте TagObject как средство хранения ссылки на реально существующий в приложении объект, а не как место хранения самого объекта.
  3. Like
    Равиль Зарипов (ZuBy) отреагировална delphiex в Приложение Android закрывается, если язык Английский   
    Да, интриган я тот еще. )) Ошибка оказалась банальной - разные форматы и разделители даты и времени. Из-за этого приложение сразу рушилось, ошибка не отображалась почему-то в отличие от других исключений. В англоязычных странах используют формат типа "07/02/2017" и тд. Подлечил приведением формата даты к нужному. 
  4. Like
    Равиль Зарипов (ZuBy) отреагировална 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;
     
  5. Like
    Равиль Зарипов (ZuBy) получил реакцию от dnekrasov в Почему в Берлине нет кнопки Apply   
    В Токио снова появилась кнопка Apply
  6. Like
    Равиль Зарипов (ZuBy) получил реакцию от Rusland в XE10.2 Tokyo есть запись вебинара от 28.03.2017?   
    это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
  7. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в XE10.2 Tokyo есть запись вебинара от 28.03.2017?   
    это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
  8. Like
    Равиль Зарипов (ZuBy) получил реакцию от Ingalime в XE10.2 Tokyo есть запись вебинара от 28.03.2017?   
    это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
  9. Like
    Равиль Зарипов (ZuBy) отреагировална haword в Запуск компилированного приложения.   
    людям которые требуют с наглой мордой что бы им рассказали все немедленно, помогать не хочется вообще. 
  10. Like
    Равиль Зарипов (ZuBy) получил реакцию от Ingalime в Многостраничное приложение   
    В FMX нету понятия активити, точнее активити всегда одно.
    А разные страницы делаются при помощи форм
  11. Like
    Равиль Зарипов (ZuBy) отреагировална enatechno в XE10.2 Tokyo есть запись вебинара от 28.03.2017?   
    Похоже первый hotfix . 
     


     
  12. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Ошибка при получении фото от камеры   
    разрешения нужны, т.к. папка в которую автоматически сохраняется файл, не является директорией проекта
    а значит используется запись и чтение с внешнего носителя
  13. Like
    Равиль Зарипов (ZuBy) получил реакцию от Ingalime в Ошибка при получении фото от камеры   
    разрешения нужны, т.к. папка в которую автоматически сохраняется файл, не является директорией проекта
    а значит используется запись и чтение с внешнего носителя
  14. Like
    Равиль Зарипов (ZuBy) отреагировална Mars M в Узнать размер видеопамяти   
    Вот так вот вроде работает:
    Только нужно будет закомментировать строчку
    assert(sizeof(TCudaDeviceProp) = 540, 'sizeof(TCudaDeviceProp) <> 540');  
  15. Like
    Равиль Зарипов (ZuBy) отреагировална Евгений Корепов в Узнать размер видеопамяти   
    Вместо утреннего кофе, уперся рогом и сделал получение информации через 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
  16. Like
    Равиль Зарипов (ZuBy) отреагировална Евгений Корепов в [Статья] Настройка пуш уведомлении через сервис 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
  17. Like
    Равиль Зарипов (ZuBy) отреагировална ENERGY в Кнопки у ListVew ItemAppearance   
    Понял как это делать.
    Устанавливаем высоту кнопки
    procedure TfrmMain.lvFavoritesUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var   TextObject: TListItemDrawable; begin   TextObject := AItem.Objects.FindDrawable('TextButton16');   if TextObject <> nil then   begin     TextObject.Height := 30;   end; end;  
  18. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Кнопки у ListVew ItemAppearance   
    все что связано с размерами высчитывается вручную в событии OnUpdateObjects
    две текстовые кнопки
  19. Like
    Равиль Зарипов (ZuBy) получил реакцию от Kitty в Разрешение/запрет гасить экран   
    я использовал вот такой вариант в одной программе
    function GetScreenOffTimeout: integer; // Androidapi.JNI.Provider, FMX.Helpers.Android begin Result := 0; {$IFDEF ANDROID} Result := TJSettings_System.JavaClass.getInt(SharedActivityContext.getContentResolver, TJSettings_System.JavaClass.SCREEN_OFF_TIMEOUT, 15000); // 15 seconds is default is not found {$ENDIF} end; function SetScreenOffTimeout(ATimeOut: integer): Boolean; // Androidapi.JNI.Provider, FMX.Helpers.Android begin Result := false; {$IFDEF ANDROID} Result := TJSettings_System.JavaClass.putInt(SharedActivityContext.getContentResolver, TJSettings_System.JavaClass.SCREEN_OFF_TIMEOUT, ATimeOut); {$ENDIF} end;
  20. Like
    Равиль Зарипов (ZuBy) отреагировална kami в Посоветуйте функционал для приложения   
    Нормативная документация (устав, цели, программа)
    Актуальные вопросы на предстоящую повестку дня на какой-нибудь сессии
    Обращения от граждан (хотя они гораздо чаще идут на конкретного представителя)
    "Внутреннее" голосование по какому-нибудь разрабатываемому документу / согласование уполномоченными должностными лицами
    А вообще - лучше всего уточнить у заказчика. Не "какой функционал должен быть у приложения" , "дайте ТЗ", а "давайте вместе подумаем / пофантазируем - вот у нас есть мобильное приложение. И мы будем его использовать для / чтобы ...". Причем это лучше делать не в письменной форме, а при личной встрече (при наличии такой возможности).
     
  21. Like
    Равиль Зарипов (ZuBy) отреагировална Rusland в Посоветуйте функционал для приложения   
    Периодически членам партии в пушах присылать призывы поддержать материально (из своего кармана) какое-нибудь благое начинание типа скинуться на: ремонт дороги, школы, больницы...
  22. Like
    Равиль Зарипов (ZuBy) получил реакцию от Pax Beach в Get запросы в iOS   
    проверка интернета
    function CheckInet: boolean; var aResp: IHTTPResponse; aHTTP: THTTPClient; begin Result := false; aHTTP := THTTPClient.Create; try try aResp := aHTTP.Head('http://google.com'); Result := aResp.StatusCode < 400; except Result := false; end; finally FreeAndNil(aHTTP); end; end; get запрос
    function HTTPGet(const aURL: string): string; var aHTTP: THTTPClient; aResp: TStringStream; begin Result := 'Error'; aResp := TStringStream.Create('', TEncoding.UTF8); aHTTP := THTTPClient.Create; try try aHTTP.Get(aURL, aResp); Result := aResp.DataString; except Result := 'Error'; end; finally FreeAndNil(aHTTP); FreeAndNil(aResp); end; end;  
  23. Like
    Равиль Зарипов (ZuBy) отреагировална Евгений Корепов в Get запросы в iOS   
    Подумайте о будущем, если проект будет развиваться и одной цифры ошибки станет не достаточно. Подумайте о наследниках-программистах (или о себе через пять лет) которые будут чесать репу и угадывать (вспоминать) что же означает каждая цифра ответа. Времена экономии каждого байта трафика прошли. Вспомните истории предшественников - 640 килобайт более чем достаточно для любого компьютера, 4294967296 ip адресов достаточно для всего человечества, размера MTU 1500 байт достаточно для TCP пакета в обозримом будущем, максимального размера файла в 4 гигабайта достаточно для любых нужд и вряд ли в будущем появятся накопители объемом более 9 терабайт (FAT32).
    Отдавая данные/результат в теле ответа в формате JSON вы развязываете себе руки и делаете задел на будущее. Вначале вам достаточно будет вот такого 
    { "status" : true, "error" : 0 } потом возможно такое
    { "status" : false, "error" : 123, "errormessage" : "mysql deadlock in tables employments", } а потом еще что нибудь
    { "status" : true, "error" : 0, "errormessage" : "", "executiontime" : 304, "clastersource" : "bagama_server" } все эти добавления займут у вас одну-две строчки на php и одну-две строчки в приложении. При этом, вы сможете диагностировать ответ сервера, сидя на берегу моря, с помощью браузера вашего телефона.
  24. Like
    Равиль Зарипов (ZuBy) отреагировална krapotkin в Get запросы в iOS   
    есть протокол HTTP, есть ваш протокол, который идет поверх HTTP
    поэтому лучше оставить коды HTTP в покое и передавать все что нужно, в теле ответа. тут уже почти стандарт - к-нить JSON
    {"result":true}
    вот например, завтра вы вместо "запись добавилась в базу" захотите узнать, а "сколько записей удалилось из базы"? как тут быть с кодами ответа?
    а если этот вызов впоследствии будет осуществляться через Web-интерфейс? тут вообще без вариантов...
    поэтому вариант с JSON наиболее предпочтителен
  25. Like
    Равиль Зарипов (ZuBy) отреагировална krapotkin в Get запросы в iOS   
    это как-то так себе
    StatusCode - это HTTP коды.
    тут должно бы быть просто 200
×
×
  • Создать...