Akad
-
Постов
152 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Сообщения, опубликованные Akad
-
-
6 часов назад, S_007 сказал:
Еще одна проблема, если редактировать нижние ячейки то появившаяся клавиатура перекрывает её
К сожалению, это один из бесчисленных глюков FMX, тянущихся с самого начала компиляций под мобильные платформы. Сторонний компонент обычно помогает.
-
26 минут назад, wamaco сказал:
TValueможно пример? как и для чего Вы переопределяете...
В смысле для чего? Что бы значениями заполнить таблицу. Он разве работает в каком-то другом режиме? На сколько я знаю только TStringGrid хранит значения в себе TGrid не умеет такого.
У меня достаточно сложный код:
procedure CTableElement.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer; var Value: TValue); begin if ARow >= Length(CellValue) then begin assert(false); end; if ACol >= Length(CellValue[ARow].cols) then begin assert(false); end; if ACol = -1 then begin Value := CellValue[ARow].color; exit; end; if ACol = -2 then begin Value := CellValue[ARow].isBlinking; exit; end; Value := CellValue[ARow].cols[ACol].GetVal; end;
Т.е. у меня описан цвет строки, её мигание.
GetVal у меня TValue. В нём может быть текст или картинка.
-
В шаблоне
<uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
-
Если честно - хз где это в настройках. Я редактирую AndroidManifest для этих целей.
-
У приложения всегда 2 SDK: минимальное, на котором запустится приложение и тагет: для которого типо пишется. Тагет, что бы гугль против не была надо выставлять максимально доступный. Иначе в магазине своём будут устроены против вас репрессии.
Минимальное SDK - ко всем функциям api из него всегда будет предоставлен доступ.
Тагет - если нужна функция api из более старшего SDK надо сначала проверить а доступна ли она.
-
53 минуты назад, S_007 сказал:
печально что и в нём нельзя отредактировать через инспектор шрифт, высоту заголовка
Переопределите DrawColumnCell, и без проблемы выведите что как и где надо. TGrid - это конструктор. Все данные надо хранить у себя.
Переопределить прежде всего GetValue/SetValue.
Затем переопределить DrawColumnCell и рисовать в тех колонках, где нужен custom.
Вот образец переопределения (то как рекомендует рисовать эмбо - загон ещё тот, лучше туда вообще не смотреть)
procedure CScriptRunner.StringGrid1DrawColumnCell(Sender: TObject;
const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF;
const Row: Integer; const Value: TValue; const State: TGridDrawStates);
const
HorzTextMargin = 0;
VertTextMargin = 0;
varTextLayout : TTextLayout;
TextRect: TRectF;
center : TPoint;
bmp:TBitmap;
Val: TValue;
color : DWORD;
BlinkColumn : boolean;
s, s2:string;
p:integer;
tm : TDateTime;
Bou2: TRectF;
begin
// Например мы не хотим рисовать в колонках с чек боксами
if Column is TCheckColumn then
begin
exit;
end;
// Например хотим менять цвет для визуального отделения строкTextRect := Bounds;
case Row mod 4 of
0:Canvas.Fill.Color := $FFFFFFFF;
1:Canvas.Fill.Color := $FFF8F8F8;
2:Canvas.Fill.Color := $FFFCFCFC;
3:Canvas.Fill.Color := $FFF5F5F5;
end;
TextRect.Left := TextRect.Left-5;
TextRect.Bottom := TextRect.Bottom;
TextRect.Inflate(-HorzTextMargin+12, -VertTextMargin);
Canvas.FillRect(TextRect, 0, 0, AllCorners, 1);
TextRect := Bounds;
//выводим текстcanvas.Fill.Color := color
canvas.Font.Family := 'Calibri';
canvas.Font.Size := g_ProntFontSize;
Canvas.FillText(TextRect,Value.ToString,false,100,[], TTextAlign.Leading,TTextAlign.Leading);end;
Главное, что тут можно отрисовать картинку, обратиться например
(Sender as TGrid).OnGetValue(Sender,-1,Row, val);
color := val.AsUInt64;
у меня на -1 выдаётся цвет строки. И так далее. В общем полнейшая кастомизация всего чего можно. Ещё бы глюки поправили...
-
TGrid прекрасно работает под мобильными платформами. Даёт куда больше возможностей кастомизации вывода чем TListView. Плюс не лагает в отличии от, так как лагать там нечему. Ещё бы на вью его бы посадили на мобильных платформах, и поправили проблемы с тачем, что бы пляски с бубном не устраивать каждый раз - вообще цены бы не было.
-
Я уже написал свой парсер. Тему можно закрывать.
-
Запустить сервис, который будет отслеживать активное активити, и если нужное закрыто, запускать его. Так же повесить на все кнопки (домой и т.д.) обработчик для перезапуска активити по новой. Хотя правильнее наверно сделать хоум скрином это приложение. Но не уверен, что на fmx это возможно...
-
47 минут назад, krapotkin сказал:
вы вообще читаете что вам пишут? в JSON массив это [] а объект - {}
Я это прекрасно знаю. Но зачем плодить 100500 разных классов для описания одного и того-же? Не. Кому нравится кривая архитектура пожалуйста. Есть System.JSON, который имеет как раз 100500 классов, и который эксепшенами плюётся постоянно. Но если для нормальных людей. Зачем эта кривость? Почему нельзя иметь один класс на уровень, который всё отдаст как надо? Когда нет какого-то поля то будет культурное сообщение, а не эксепшен. Когда к полю можно обратиться по имени, а можно по индексу и так далее. Это космически-недостижимые технологии?
Почему я не хочу 100500 классов? Потому что там везде придётся прописать один и тот-же код, а при доработках моих коллег править придётся код в более чем одном месте. А парсинг там и так не простой в плане дикого количества ньюансов. Так что это равносильно прямо пропорциональному увеличению проблем, которые начнут вылазить, например, через месяц. Причём в среднем 1 раз в месяц.
Я бы с удовольствием остановился на tiny-json, если бы не вышеописанные проблемы с Child[].Но как я понял нормальных JSON парсеров, как не удивительно, на дельфе нет. Придётся писать велосипед.
-
20 минут назад, krapotkin сказал:
если у вас на входе то массив, то объект, вам все равно придется работать с ними по разному. не?
У меня на входе всегда массив. Ключи ни когда не известны, так как это ID товара. Но иногда {}, а иногда [], т.е. без ключей.
Я банально хочу, что бы к любому полю на любом уровне можно было обратиться как по имени, так и по индексу, и что бы не через задницу это делать. Это единственное требование. Не думал, что хочу слишком много.
-
2 часа назад, krapotkin сказал:
если вашу мысль развить, то с т.з. php {"A":"B", "C":""D"} это тоже массив, но это не так
JSON это стандарт. Там написано, как выглядит массив, а как - нет. Несмотря на то, что вам может что-то казаться или не нравиться.
Был-то массив. И в JSON представить данный массив по другому нельзя. Короче вопрос не в философии, а в том, что заранее не известны ни ключи ни значения, ни скобки. Надо JSON пропарсить. Чем?
У SuperObject - obj.AsObject так же глючен. Когда [] - у него nil, а мне случайным образом поступает то [], то {}, хотя внутри всегда массив заказов. Писать 100500 ветвлений копипастя один и тот-же код из-за того, что кому-то лень прописать в одном классе все скобки - бред. Неужели нет полноценного, не глючного JSON парсера для Delphi? Крайне не люблю велосипеды изобретать.
-
Догадка: Wine 3 сломали DirectDraw (и с ним все гуи на системах старше XP), а так как по умолчанию там эмуляция win 7, то соответственно глюки. В 3.1 что-то починили, но не всё.
А что мешает нативно под linux собрать?
-
Делаем отдельный поток, в нём пул http клиентов (array of). Ну и добавляем запрос через lock, успешный запрос обрабатываем через Synchronize.
Или делаем отдельный класс-наследник TThread, опять array of и запускаем в каждом экземпляре обращение к сайту в нужный момент. Возврат значения через callback или Synchronize. Только в этом случае надо не забывать удалять ресурсы завершившихся потоков в главном.
-
Изначально была такая структура:
a:5:{i:0;a:4:{s:10:"PRODUCT_ID";s:3:"808";s:7:"OPTIONS";N;s:6:"AMOUNT";i:1;s:10:"SECTION_ID";s:2:"35";} s:14:"additional_849";a:6:{s:6:"AMOUNT";d:3;s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:849;s:2:"ID";s:14:"additional_849";s:10:"PRODUCT_ID";s:14:"additional_849";} s:14:"additional_850";a:6:{s:6:"AMOUNT";s:1:"2";s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:850;s:2:"ID";s:14:"additional_850";s:10:"PRODUCT_ID";s:14:"additional_850";} s:14:"additional_851";a:6:{s:6:"AMOUNT";d:2;s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:851;s:2:"ID";s:14:"additional_851";s:10:"PRODUCT_ID";s:14:"additional_851";} s:14:"additional_852";a:6:{s:6:"AMOUNT";d:2;s:4:"TYPE";s:10:"additional";s:13:"IS_ADDITIONAL";b:1;s:13:"ADDITIONAL_ID";i:852;s:2:"ID";s:14:"additional_852";s:10:"PRODUCT_ID";s:14:"additional_852";}}
Т.е. массив из 5 элементов ключ-значение. Так как есть ключ, то в JSON скобки {}. Всё корректно вроде. В смысле php часть отработала правильно.
Да и вообще говоря любой JSON на одном уровне - это массив ключ-значение (причём ключа может не быть). Вот и нужен парсер, который это понимает, а не занимается фантазированием.
-
29 минут назад, Равиль Зарипов (ZuBy) сказал:
правильно сработал, это не массив а объект. смотрите внимательно
Брр. Почему не массив? Это массив элементов "0", "additional_849", "additional_851" и так далее. Они все находятся на одном уровне ведь. И выше них уровня нет.
-
Заменил код. Сделал ребилд. Упало в этом-же месте в CheckSynchronize.
-
С недавних пор (студия 10.2.2) программа начала падать в System.Classes в function CheckSynchronize. Конкретно кусок
try if Assigned(SyncProc.SyncRec.FMethod) then SyncProc.SyncRec.FMethod() else if Assigned(SyncProc.SyncRec.FProcedure) then SyncProc.SyncRec.FProcedure(); except if not SyncProc.Queued then SyncProc.SyncRec.FSynchronizeException := AcquireExceptionObject else if Assigned(ApplicationHandleException) then ApplicationHandleException(SyncProc.SyncRec.FThread); end;
И далее. Дело в том, что в SyncProc.SyncRec или nil или мусор. Ни в стеке вызовов, ни в других нитках я намёков на причину не нашёл. В стеке вызов CallNextHookEx, который дёргает StdWndProc, а та пытается синхронизироваться. Последний ассерт происходит из-за Error(reMonitorNotLocked) в
function TMonitor.CheckOwningThread: TThreadID;
и далее программа или работает нормально, или повисает UI намертво - когда как. Подозреваю, что пытается синхронизироваться объект, которого уже нет. У меня все формы и все компоненты на них создаются и удаляются динамически. Таблицы заполняются в других потоках через Synchronize и т.д В общем проект большой, и что иголку в стоге сена искать... Глюк плавающий, но проявляется наиболее стабильно после закрытия определённого окна.
Создаю компоненты стандартно. Типа:
control := TEdit.Create(parent);
и удаляю тоже
if assigned(control) then FreeAndNil(control);
Форму создаю:
BaseForm := TEmtyForm_frm.Create(Application);
BaseForm.Name := 'Form'+IntToStr(Random(256)*Random(256));
if assigned(parentScRun) then
BaseForm.Parent := parentScRun.BaseForm;
удаляю соответственно:if assigned(BaseForm) then FreeAndNil(BaseForm);
Посоветуйте куда "копать"? Может ли быть верна моя догадка, что это из-за уже разрушенного объекта? Если да - что надо синхронизировать перед FreeAndNil? Если нет - что ещё посмотреть?
-
13 часа назад, krapotkin сказал:
можно пример, чего такого он у вас не разобрал?
Сейчас с ходу что он не распарсил не прилетело, но вот распарсил криво:
{"0":{"PRODUCT_ID":"808","OPTIONS":null,"AMOUNT":1,"SECTION_ID":"35"},"additional_849":{"AMOUNT":3,"TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":849,"ID":"additional_849","PRODUCT_ID":"additional_849"},"additional_850":{"AMOUNT":"2","TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":850,"ID":"additional_850","PRODUCT_ID":"additional_850"},"additional_851":{"AMOUNT":2,"TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":851,"ID":"additional_851","PRODUCT_ID":"additional_851"},"additional_852":{"AMOUNT":2,"TYPE":"additional","IS_ADDITIONAL":true,"ADDITIONAL_ID":852,"ID":"additional_852","PRODUCT_ID":"additional_852"}}
Obj := SO(s); Assert(obj.AsArray <> nil);
Сработал assert, хотя root - это массив.
2 часа назад, Tumaso сказал:А меня System.JSON полностью устраивает. Ошибок парсинга валидных данных не было ни разу, скорость на нормальном уровне.
Основная проблема стандартной библиотеки - это кривость работы с массивами [], и постоянные ассерты, когда нет элемента. Ну и общая громоздкость кода парсинга. То есть если структура JSON изначально известна и "стандартна", то проблем не будет. А если шаг влево, шаг вправо, то...
-
-
Кто поделится нормальным JSON парсером? Источник JSON - команда на php
json_encode(unserialize($value));
То есть это просто сереализованная структура данных, которая изначально не известна (точнее их куча разных), и которую надо распарсить определённым алгоритмом. Стандартный - System.JSON - вообще хрень полная. Ничего не умеет, даже квадратные скобки если и парсит, то криво. С гитхаба есть
https://github.com/thomaserlang/delphi-json - так же штука мало что умеющая, и
https://github.com/tmcdos/tiny-json -это почти то, что надо. Но они слишком заморочились с хешами и вкрался каской-то глюк. На некоторых входных данных json1.Child[0] = nil, хотя json1.Count > 0. Искать проблему в этом коде нет ни какого желания, слишком всё усложнено.
В общем кто чем пользуется?
-
http://www.fmxexpress.com/configure-android-system-settings-from-delphi-xe5-firemonkey/
Там SCREEN_OFF_TIMEOUT, яркость по аналогии.
P.S. Что бы перевести какой-то код с андоидовской явы на FireMonkey, я в гугле спрашиваю это словосочитание, плюс прибавляю FireMonkey. В данном случае что-то типа:
Способ срабатывает в ~95%.
-
far+f4 (или другой текстовый редактор) shift+del/ctrl+ins.
-
Может где тему отдельную завести "исправляем ошибки в fmx сами", где наработки подобные собирать? Сегодня часа 4 убил, что бы найти ошибку разработчиков, что бы TLabel всегда выводил правильный шрифт после обновления информации в себе. Кому интересно, файл FMX.Objects.pas, procedure TText.DoSetText(const Value: string);Ищем строчку
FLayout.LayoutCanvas := Canvas;
после неё вставляем
FLayout.Font := Self.Font;
Мусор при развёртывании приложений
в Развертывание приложений
Опубликовано
Большинство этого лечится через CnPack+Ide Fix. А вот идиотская работа клавиши назад мышки и ctrl+z действительно доставляют...