Комментарии 21
Первые 3 пункта проблем - это проблема с твоим выбором скина. Он не адаптирован под HiDPI. Напомню, что у тебя здесь VCL и скин сам устанавливает правила отрисовки, а он у тебя не предназначен для HiDPI. В свежих версиях, в списках скинов для VCL есть специальные, адаптированные версии скинов.

Ну а 4ый пункт - это не баг.
P.S.
Я бы рекомендовал, переделать программу под фреймворк FMX, который, кстати, с HiDPI работает прекрасно, потому что рисует не через WinAPI, который позволит собирать под Линукс и Мак (и мобильные устройства). Правда времени на это уйдет не мало. Но чем раньше - тем лучше.
К сожалению, у меня есть честно купленная Delphi 10, и переходить на новую пиратскую версию как то рука не поднимается.
Про FMX читал много негативных отзывов, мол сырая технология. Даже в VCL полно косяков, а в FMX их пишут вообще не счесть. И самое главное - Ehlib не поддерживает FMX и не собирается :-(
Ну так ведь есть CE версия среды. Т.е. бесплатная, не коммерческая. Бери и ставь, сейчас CE - Delphi 11. Разница с твоей версией - небо и земля.
FMX - давно не сырой. Уже несколько лет как прекрасный кроссплатформенный фреймворк. У меня на нём уже пара десятков проектов, не считая подобных твоим открытых проектов. А EhLib - для чего тебе конкретно? Это ведь не MUST HAVE для Делфи, а обычный набор компонент. Более того, в FMX я за все эти десятки проектов вообще не нуждался в сторонних компонентах, потому что возможности у FMX не сравнимы с VCL. Любые кастомные контролы, таблицы, поля в таблицах и прочее. Всё делается на ходу штатными средствами (не как в VCL)
Спасибо, интересная задумка и реализация. Попробую протестировать. Как вариант развития экспорт в виде майдмап -)
Скажите, а вы разрабатываете новые версии так, чтобы при обновлении имеющиеся в БД таблицы/данные тоже как-то сконвертировались? Какой предусмотрен механизм установки обновлений?
При обновлении структуры данных, само собой, обновление происходит автоматически.
Изменение делается через соотв. json-объекты, типа таких:
Пример JSON изменения структуры данных
[
{
"TABLE": "note",
"FIELD": "telegram_message_id",
"TYPE": "TEXT"
},
{
"TABLE": "source",
"FIELD": "telegram_message_id",
"TYPE": "TEXT"
},
{
"TABLE": "keyword",
"FIELD": "note",
"TYPE": "TEXT"
},
{
"TABLE": "keyword_name",
"FIELD": "note",
"TYPE": "TEXT"
},
{
"TABLE": "tmp_left_keyword",
"FIELD": "def",
"TYPE": "TEXT"
},
{
"TABLE": "tmp_right_keyword",
"FIELD": "def",
"TYPE": "TEXT"
},
{
"TABLE": "tmp_left_keyword",
"FIELD": "interest_count",
"TYPE": "integer"
},
{
"TABLE": "tmp_right_keyword",
"FIELD": "interest_count",
"TYPE": "integer"
},
{
"TABLE": "tmp_left_keyword",
"FIELD": "class_name_before",
"TYPE": "TEXT"
},
{
"TABLE": "tmp_right_keyword",
"FIELD": "class_name_before",
"TYPE": "TEXT"
},
{
"TABLE": "tmp_left_keyword",
"FIELD": "source_cnt",
"TYPE": "integer"
},
{
"TABLE": "tmp_right_keyword",
"FIELD": "source_cnt",
"TYPE": "integer"
},
{
"TABLE": "tmp_KW_Analyze_MayBe",
"FIELD": "note_cnt",
"TYPE": "integer"
},
{
"TABLE": "source_keyword",
"FIELD": "keyword_name_id",
"TYPE": "integer"
},
{
"TABLE": "source",
"FIELD": "date_time_update",
"TYPE": "datetime"
},
{
"TABLE": "keyword",
"FIELD": "all_use_count",
"TYPE": "integer"
}
]
Далее в Delphi:
Проверка адекватности структуры данных (часть кода)
procedure TDM.struct_add_new_fields;
var
ch_str_:ansistring;
JsonArray: TJSONArray;
ArrayElement: TJSonValue;
RowValue: TJSonValue;
RowItem: TJSonValue;
table_name_,field_name_,field_type_:string;
fdq_:TFdquery;
begin
ch_str_:=GetStrFromAppResource('change_struct_new_fields');
lcb.log(ch_str_);
fdq_:=tFdquery.Create(nil);
fdq_.Connection:=sqlc;
JsonArray := TJSonObject.ParseJSONValue(ch_str_) as TJSONArray;
for ArrayElement in JsonArray do begin
ArrayElement.TryGetValue('TABLE', table_name_);
ArrayElement.TryGetValue('FIELD', field_name_);
ArrayElement.TryGetValue('TYPE', field_type_);
fdq_.SQL.Text:='PRAGMA table_info('''+table_name_+''')';
fdq_.Open();
if fdq_.RecordCount>0 then begin
if not fdq_.Locate('name',field_name_,[loCaseInsensitive]) then begin
lcb.log('Нет поля '+field_name_+' в таблице '+table_name_+', добавляем SQL-запросом!');
fdq_.SQL.Text:='ALTER TABLE '+table_name_+' ADD COLUMN '+field_name_+' '+field_type_+';';
lcb.log(fdq_.SQL.Text);
fdq_.ExecSQL;
end;
end;
fdq_.Close;
end;
fdq_.Free;
JsonArray.Free;
end;
Спасибо. Этот момент стал ясен. Но мне хотелось бы еще узнать 2 сходных момента, которые я имел в виду в моем предыдущем вопросе.
1.Помимо конвертации структуры БД под формат новой версии происходит ли еще необходимая конвертация данных в таблицах? Например, в первой своей статье вы писали, что вложения к заметкам у вас хранились внутри БД. А в нынешней третьей пишете, что вложения стали храниться отдельно в заданном каталоге. Если у пользователь начал наполнять БД в первой версии программы, то при первом открытии БД уже этой новой версией вложения к заметкам будут автоматически перенесены в их новое место хранения?
2.Если человек начал заполнять БД в приложении версии 1.0 (условно). То при переходе к использованию версии 1.2, минуя 1.1, обновление БД пройдет нормально? У вас к сожалению на сайте lumanbox.ru и на github номер версии программы не указан.
1) конечно же происходит. Относительно места хранения заметок. К сожалению, SQLite очень плохо показал себя в плане хранения файлов. Если их хранить в базе более 100 суммарным объемом более 1ГБ, база начинает дико тормозить даже на индексированных текстовых выборках. Потому я программе добавил возможность в настройках изменить место хранения:

Особенность в том, что мы сейчас вдвоем с моим коллегой активно пользуемся программой. И вручную править структуру дважды у меня нет возможности - ее правит встроенный в программу механизм.
2) нормально. Да, нумерации версий программы пока нет. Но, думаю, стоит уже вводить.
Спасибо, Сергей @korvint. Я конечно и так практически не сомневался в этих моментах. Уважающий себя разработчик должен был это предусмотреть, прежде чем выпускать программу в свет. Но на всякий пожарный решил уточнить :)
И хорошо бы еще на том же гитхабе историю изменения версий добавить, чтобы было видно, какие ошибки исправлены или новшества добавлены.
Извиняюсь, что забыл сразу написать. Спасибо вам за вложенный труд в вашу разработку, которой вы делитесь, и статьи. Прочитал с интересом. Тоже вот хочу перевести свои заметки в какой-то более удобный формат. Ну и метод ZettelKasten надо попробовать поосваивать, сравнить со своим нынешним подходом и оценить полезность для себя.
Откровенно впечатлён. Именно то, что я искал!
Коль проект опенсорсный, подумайте, пожалуйста, чтобы портировать его под Linux. Там даже удобная IDE есть под Pascal https://www.lazarus-ide.org/
Спасибо за оценку моего труда.
К сожалению, я использую библиотеки, которых нет в Lazarus.
Сейчас я учусь на fullstack-developer, и планирую клиентскую часть переписать на React, который будет запускаться на любой платформе, где можно развернуть React App. Удивительно, но современные SCSS и React дают на порядок больше возможностей в построении интерфейсов, нежели классические IDE такие как Delphi или Visaul Studio.
Это вы просто не пробовали FMX в Delphi
Очень много о нем негативных отзывов. К примеру, EhLib под FMX даже не стали портировать свои библиотеки. Ибо глюкало.
Это не актуально. Не говоря уже о том, что FMX ни капли не совместим с VCL и портировать что-то просто так не получится.
Там совершенно другая концепция. Во всем. От канвы, до представлений контролов.
Года 4 назад было действительно плохо, а сейчас у меня множество открытых проектов и коммерческих.
Вот пример, и в репозиториях рядом ещё примеры
Умоляю, не делайте этого! Пожалуйста, не переносите платформу на React! Сделайте что угодно, только не спускайте проект в унитаз современного говнокодинга, там итак уже канализационные трубы не выдерживают — столько всего забилось.
К сожалению, я не силён в Delphi и не смогу подсказать решение. Если бы проект был на Си, то там есть универсальное кроссплатформенное решение для построения интерфейсов GTK+.
Наверняка что-то можно предпринять чтобы найти решение. Пожалуйста, постарайтесь, но только не плодите очередное чудовище Франкенштейна!
Ещё раз спасибо за проект. Это действительно то, что я ждал годами!
Новости «LumanBox»: масштабирование, open source, осмысление опыта ведения индивидуальной базы знаний