Delphi нет? 🤪 Новость для меня. Ладно бы ещё наоборот было...
Чего это ладно бы? У нас тоже должны быть плюшки
Чтооооооо. Вот это вообще странное упущение
Стикер
в Лазаре вообще немало фишек, чего в Делфе не было или появилось (иногда сильно) позже
да
Как же этого в делфи не хватало 👍
просится, однозначно и давно
как впрочем и наоборот. хотя уже почти всё утянули
С rtti пока беда, особенно с методами
Да, RTTI сильно слабее
var Words := ['aaa', 'bbb', 'ccc', 'ddd']; var Word := 'aaa'; case IndexStr(Word, Words) of 0: ;//aaa 1: ;//bbb 2: ;//ccc 3: ;//ddd end;
покажи пример...
case DM.qrySetting.FieldByName('titleAlignment').AsString of 'taCenter': grd.Columns[i].Title.Alignment := taCenter; 'taLeftJustify': grd.Columns[i].Title.Alignment := taLeftJustify; 'taRightJustify': grd.Columns[i].Title.Alignment := taRightJustify; end;
надо же, не знал... а я все константные массивы использую :)
Через RTTI присваивается без всяких case
там кода на порядок больше и сложнее
Ну, такой вот код - это тоже изврат
Можно ж было просто сохранять Integer(TAlignment) и обратно присваивать
храни лучше сразу все настройки колонок в сериализованном виде в JSON и сделай хелпер для колонки из/в JSON. grd.Columns[i].ApplySettingsJSON(DM.qrySetting.FieldByName('ColumnSettings').AsString) а еще лучше пусть все настройки сохраняет и восстанавливает сетка. Намного проще все будет
Да, rtti тут очень к месту
Я в ini сохранял.
function IsEnum(const Name: string; TypeInfo: PTypeInfo; var n: integer): Boolean; begin n := GetEnumValue(TypeInfo, ReplaceStr(Name, '-', '')); Result := n > -1 end;
Я в SQLite сделал, локально. CREATE TABLE grid ( formName TEXT NOT NULL, objectName TEXT NOT NULL, columnIndex INTEGER NOT NULL, alignment TEXT NOT NULL, fieldName TEXT NOT NULL, titleAlignment TEXT NOT NULL, titleCaption TEXT NOT NULL, visible INTEGER NOT NULL, width INTEGER NOT NULL ); CREATE TABLE form ( formName TEXT(255) NOT NULL, height INTEGER NOT NULL, width INTEGER NOT NULL ); CREATE TABLE "user" ( login TEXT(32) NOT NULL, pass TEXT(32) NOT NULL, save INTEGER NOT NULL ); CREATE TABLE dbconn ( fkey TEXT(50) NOT NULL, fvalue TEXT(255) NOT NULL );
Ну и дальше ещё будет возможность настраивать пользовательский интерфейс, видимость меню и тд. Для этого будет ещё одна таблица. Пока не придумал, как и что.
Я так раньше делал, но при следующем переписывании отказался от такого.
А у меня наоборот история. Сначала было в ini, потом json. Теперь все в SQLite. Удобно, одна БД и все в ней.
Есть встроенная сериализация в DFM, бинарный или текстовый. Какая разница. JSON просто лишний.
Очень читабельно и информативно 😁
Имхо, велосипед изобретаешь. Сделай табличку-дерево, как в реестре винды, и храни любые атрибуты в любых сочетаниях
То есть по принципу таблицы dbconn? Там у меня два поля. Ключ и значение. Но тогда еще одно нужно, где хранить имя формы. И имя объекта. А тут типа каждая таблица хранит свой тип данных. Или ты о другом? Есть пример может?
А потом в очередной версии Дельфи поменяет формат dfm и все поломается... Особенно если бинарный формат
В классическом дереве 3 поля: ID, ParentID и Value. Посмотри в интернете, примеров полно
Вот 30 лет не меняют, а тут раз и всё.
это функция, а использовать так if IsEnum(Str, TypeInfo(TAlignment), n) then Align := TAlignment(n);
В DFM идёт только tcomponent, причём при наличии tcomponent.name на русском языке - ждут забавные приключения при работе с данным из delphi 7- и Delphi 2006+ Так что лучше уже взять готовый сериализатор, их много есть
Ну хорошо-хорошо, пусть будет так 😊
Хорошо, спасибо. Погуглю. А то пока нет понимания, как мне мои данные сложить. ID - это родитель, parentId это потомок и есть только одно поле для данных - value. А мне этого недостаточно. Или в таком случае ещё одну вложенность надо будет делать... В общем пока в голове не уложилось. Посмотрю примеры))
Только внутри корневого компонента :)
Кстати, для хранения дерева в БД есть три структуры, в зависимости от того, что и как часто надо с данными делать. Ещё вложенные множества. А третий не помню уже
У твоего родителя может быть несколько потомков, каждый из которых может быть родителем для своих потомков и т.д. В ини/xml/json данные хранятся точно так же
.а implicitWidth и т.п.?
Так это новые свойства. И есть механизм работы с этим. Другое дело, что если это редактируется извне, то весь перечень свойств может быть не нужен. Раньше придумывали разные фокусы. Сейчас с помощью аттрибутов такое решается на раз. Просто для сохранения состояния и его восстановления, я бы сильно подумал, нафиг нужен ещё один велосипед. Может просто зудит как хочется с JSON именно поиграться.
я себе на базе sqlite сделал файл настроек )
Эмм, а это штатное там чтоль появилось? А то лет 20 такой же подход применяем только у нас функция IndexOfString назвается 😂
Да видимо ещё функцию добавили 😁 Она в StrUtils
Ну додумались - малацы :)
Обсуждают сегодня