-
Постов
2 517 -
Зарегистрирован
-
Посещение
-
Победитель дней
264
Активность репутации
-
Равиль Зарипов (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';
-
Равиль Зарипов (ZuBy) отреагировална Евгений Корепов в Проблема с сохранением объекта в TagObject
Потому что это служебное поле, за которое объект-владелец не в ответе. Для иного вы можете использовать Image2.AddObject() - в этом случае Image2 будет знать о своих "детях" (Image2.Children в количестве Image2.ChildrenCount) и при самоубийстве покарает и детей. А в случае TagObject он проигнорирует содержащийся там объект и возникнет утечка памяти. Воспринимайте TagObject как средство хранения ссылки на реально существующий в приложении объект, а не как место хранения самого объекта.
-
Равиль Зарипов (ZuBy) отреагировална delphiex в Приложение Android закрывается, если язык Английский
Да, интриган я тот еще. )) Ошибка оказалась банальной - разные форматы и разделители даты и времени. Из-за этого приложение сразу рушилось, ошибка не отображалась почему-то в отличие от других исключений. В англоязычных странах используют формат типа "07/02/2017" и тд. Подлечил приведением формата даты к нужному.
-
Равиль Зарипов (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;
-
Равиль Зарипов (ZuBy) получил реакцию от dnekrasov в Почему в Берлине нет кнопки Apply
В Токио снова появилась кнопка Apply
-
Равиль Зарипов (ZuBy) получил реакцию от Rusland в XE10.2 Tokyo есть запись вебинара от 28.03.2017?
это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
-
Равиль Зарипов (ZuBy) получил реакцию от Kitty в XE10.2 Tokyo есть запись вебинара от 28.03.2017?
это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
-
Равиль Зарипов (ZuBy) получил реакцию от Ingalime в XE10.2 Tokyo есть запись вебинара от 28.03.2017?
это просто печенька для разрабов, чтобы не сваливали со студии. Мол всё будет, но "завтра"
-
Равиль Зарипов (ZuBy) отреагировална haword в Запуск компилированного приложения.
людям которые требуют с наглой мордой что бы им рассказали все немедленно, помогать не хочется вообще.
-
Равиль Зарипов (ZuBy) получил реакцию от Ingalime в Многостраничное приложение
В FMX нету понятия активити, точнее активити всегда одно.
А разные страницы делаются при помощи форм
-
Равиль Зарипов (ZuBy) отреагировална enatechno в XE10.2 Tokyo есть запись вебинара от 28.03.2017?
Похоже первый hotfix .
-
Равиль Зарипов (ZuBy) получил реакцию от Kitty в Ошибка при получении фото от камеры
разрешения нужны, т.к. папка в которую автоматически сохраняется файл, не является директорией проекта
а значит используется запись и чтение с внешнего носителя
-
Равиль Зарипов (ZuBy) получил реакцию от Ingalime в Ошибка при получении фото от камеры
разрешения нужны, т.к. папка в которую автоматически сохраняется файл, не является директорией проекта
а значит используется запись и чтение с внешнего носителя
-
Равиль Зарипов (ZuBy) отреагировална Mars M в Узнать размер видеопамяти
Вот так вот вроде работает:
Только нужно будет закомментировать строчку
assert(sizeof(TCudaDeviceProp) = 540, 'sizeof(TCudaDeviceProp) <> 540');
-
Равиль Зарипов (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
-
Равиль Зарипов (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
-
Равиль Зарипов (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;
-
Равиль Зарипов (ZuBy) получил реакцию от Kitty в Кнопки у ListVew ItemAppearance
все что связано с размерами высчитывается вручную в событии OnUpdateObjects
две текстовые кнопки
-
Равиль Зарипов (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; -
Равиль Зарипов (ZuBy) отреагировална kami в Посоветуйте функционал для приложения
Нормативная документация (устав, цели, программа)
Актуальные вопросы на предстоящую повестку дня на какой-нибудь сессии
Обращения от граждан (хотя они гораздо чаще идут на конкретного представителя)
"Внутреннее" голосование по какому-нибудь разрабатываемому документу / согласование уполномоченными должностными лицами
А вообще - лучше всего уточнить у заказчика. Не "какой функционал должен быть у приложения" , "дайте ТЗ", а "давайте вместе подумаем / пофантазируем - вот у нас есть мобильное приложение. И мы будем его использовать для / чтобы ...". Причем это лучше делать не в письменной форме, а при личной встрече (при наличии такой возможности).
-
Равиль Зарипов (ZuBy) отреагировална Rusland в Посоветуйте функционал для приложения
Периодически членам партии в пушах присылать призывы поддержать материально (из своего кармана) какое-нибудь благое начинание типа скинуться на: ремонт дороги, школы, больницы...
-
Равиль Зарипов (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;
-
Равиль Зарипов (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 и одну-две строчки в приложении. При этом, вы сможете диагностировать ответ сервера, сидя на берегу моря, с помощью браузера вашего телефона.
-
Равиль Зарипов (ZuBy) отреагировална krapotkin в Get запросы в iOS
есть протокол HTTP, есть ваш протокол, который идет поверх HTTP
поэтому лучше оставить коды HTTP в покое и передавать все что нужно, в теле ответа. тут уже почти стандарт - к-нить JSON
{"result":true}
вот например, завтра вы вместо "запись добавилась в базу" захотите узнать, а "сколько записей удалилось из базы"? как тут быть с кодами ответа?
а если этот вызов впоследствии будет осуществляться через Web-интерфейс? тут вообще без вариантов...
поэтому вариант с JSON наиболее предпочтителен
-
Равиль Зарипов (ZuBy) отреагировална krapotkin в Get запросы в iOS
это как-то так себе
StatusCode - это HTTP коды.
тут должно бы быть просто 200