LookDBF

Здесь можно обсудить ваш любимый плагин.
User avatar
Vertigo
Posts: 85
Joined: Tue 13 Apr, 2010 12:04
Location: Moscow, Russia
Has thanked: 10 times
Been thanked: 4 times

LookDBF

Post by Vertigo »

Latest post of the previous page:

Plugin.hpp и есть его описание. Взято мной (как и всеми остальными) из дистрибутива или репозитория с исходниками. Комментарии к нему в т.н. энциклопедии, которая также есть в дистрибутиве.

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

LookDBF

Post by buniak_a_h »

Vertigo wrote:Plugin.hpp и есть его описание. Взято мной (как и всеми остальными) из дистрибутива или репозитория с исходниками. Комментарии к нему в т.н. энциклопедии, которая также есть в дистрибутиве.
Да всё понятно. Только (а) дистр нужен первого, неохота откатываться; (б) в энциклопедии описан (почти везде) современный АПИ (точнее, какая-то смесь старого и нового) и главное - у Вас была здравая мысль: редактировать в отдельном окне даже не с 512, а меньше. Посему я бы и рыть не стал...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

User avatar
Vertigo
Posts: 85
Joined: Tue 13 Apr, 2010 12:04
Location: Moscow, Russia
Has thanked: 10 times
Been thanked: 4 times

LookDBF

Post by Vertigo »

Дистрибутив есть на сайте в разделе загрузки по ссылке собрание сочинений. В виде архива в том числе, насколько я помню.

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

LookDBF

Post by buniak_a_h »

Vertigo
Нашёл ещё две ошибки:
  1. Надо расширить буфер редактирования всей записи (модуль LookDBF.cpp, метод WORD LOOK::EditRecord(void), описание s[384] заменить на [b]s[32767][/b])
  2. Там же метод EditDialog::Line(...): необходимо перед формированием элемента DI_TEXT чистить память (после строки
    if (iLast == nItems) return 0;
    вставить строку
    ZeroMemory(&(di[iLast]), sizeof(di[iLast]));.
    Или по-другому. Но чистить надо, иначе, например, имя второго поля в той БД, что я высылал для теста, не видно).
    На самом деле имеет смысл, наверно, почистить весь массив di Сразу после размещения, в процедуре EditDialog::Init. А то могут быть совершенно непредвиденные эффекты... НО!!! Вставка ZeroMemory(di, sizeof(di)); после di = new <...> в процедуре EditDialog::Init проблему не решает. Я давно не писал на СИ, не помню, как он с памятью и указателями работает... Может, так и должно быть.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

LookDBF

Post by buniak_a_h »

Vertigo
ЗЫ.
Насчёт того кода, что написал (после di = new <...>) - я не совсем деревянный, понимаю, что sizeof(di)=4. Значит, либо в цикле надо чистить, либо возможно есть ключ компилятора, заставляющий генерить код, очищающий выделенные блоки памяти (типа запрета оптимизации). Я знаю, что в некоторых компиляторах такие флаги есть.
Если верить MSDN, при выделении памяти можно указать инициализатор. Причём, написано, что пустые фигурные скобки инициализируют всё нулями. Ер у меня не получилось - синтаксис ругается, а примера инициализации массива структур в MSDN нету... Может, знаете, как это сделать? Было бы удобно...

Мои исправления:
LookDBF.Sources.rar
Только исходники. Новое помечено «// BAX, 18.07.16»
(94.12 KiB) Downloaded 55 times
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

LookDBF

Post by buniak_a_h »

Vertigo
Я прошу прощения за назойливость.
В процедуре LOOK::ShowMemo тоже ошибка. Есть строка if (Yes(WinCode)) ToOem(coCurr->name, nafi) ;, но нет строки else lstrcpy(nafi, coCurr->name);. В результате, если НЕ Yes(WinCode) (подозреваю, что это - ansi-кодировка), то nafi остаётся неопределённым, и в следующей строке ( FSF.sprintf(title,...) ) всё портится (в том числе и имя файла).
Есть неприятность: при вызове плагина или при работе с ним уже выбрана кодовая страница. Но при просмотре-редактировании МЕМО-поля (на самом деле - временного файла) кодовую страницу в редактор при АПИ ФАР-1 не передать. В результате кодовая страница определяется снова. И очень часто неправильно. :-(
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

LookDBF

Post by buniak_a_h »

Vertigo, вроде нашёл критическую ошибку. Прилагаемую БД плагин считает пустой; на самом деле в ней 330 записей. Возможно, у меня устаревшая версия, к тому же немного изменённая (для поиска поля и для просмотра длинных полей в виде мемо). Изменения я Вам присылал, но в то время в версию они не вошли (а жаль).
OUPRF.RAR
Плагин считает пустым. На самом деле 330 записей
(962 Bytes) Downloaded 58 times
Сообщение на всякий случай продублировал в личку... Извините, если что. :facepalm:

User avatar
Vertigo
Posts: 85
Joined: Tue 13 Apr, 2010 12:04
Location: Moscow, Russia
Has thanked: 10 times
Been thanked: 4 times

LookDBF

Post by Vertigo »

У меня тоже говорит, что пустой. Посмотрю, как будет время.

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

LookDBF

Post by buniak_a_h »

Vertigo!
  1. Мне тут сказали, что какой-то софт вообще не открывает - ругается, что что-то-там неправильно.
  2. На самом деле исправляется заменой 2-х байтов (4-го и 5-го). По-моему это как раз количество записей. В исходном (некорректном) - 00,00. Надо 4A, 01 (0x014A=330) . Уж не знаю, чем делался файл. НО! BRO.exe открывает нормально. Пересчитывает по размеру хедера, записи и файла, что ли?... Так что ею можно исправить.
Уж не знаю, стоит ли париться, если какой-то некорректный софт некорректно заполняет хедер... Хотя при наличии времени я бы исправил. Ну, раз можно посчитать...

User avatar
Vertigo
Posts: 85
Joined: Tue 13 Apr, 2010 12:04
Location: Moscow, Russia
Has thanked: 10 times
Been thanked: 4 times

LookDBF

Post by Vertigo »

Дык, в том-то и дело, что это не исправление, а костыль. Заголовок-то вроде правильный, получается.
Я, конечно, за то, чтобы всё всегда и везде работало, но мы даже не знаем наверняка, ошибка ли это, и как часто она может возникнуть.
И к тому же, мало ли какой мусор возможен в конце файла. Пример - chkdsk; часто информация о размере оригинального файла теряется, и после восстановления в конце оказывается мусор.

User avatar
Vertigo
Posts: 85
Joined: Tue 13 Apr, 2010 12:04
Location: Moscow, Russia
Has thanked: 10 times
Been thanked: 4 times

LookDBF

Post by Vertigo »

Кстати, а может, это такая оптимизация в кавычках? Всё удалили, а софт просто записал 0 в заголовок? Бред, но возможно же. facepalm2

buniak_a_h
Posts: 1399
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 96 times
Been thanked: 108 times
Contact:

LookDBF

Post by buniak_a_h »

Vertigo wrote: в конце оказывается мусор
Ну, можно потом удалить. Лучше мусор, чем потеря данных. Мне каэцца...
Vertigo wrote: Кстати, а может, это такая оптимизация в кавычках? Всё удалили, а софт просто записал 0 в заголовок?
Не, не этот случай. Поздно уже, а то я бы спросил у автора, чем получен файл. Но что она не удаляла все записи - точно.
Кстати, о корректности хедера. Плагин при редактировании не меняет в нём дату последнего редактирования (то, что в XBase возвращает функция LUPDATE()). Мелочь, конечно... На самом деле даже удобно. Но... Некорректно :-)

Post Reply

Return to “Обсуждение плагинов”