Информация

Последние записи

Теги


Блоги


Записи из всех блогов с тегом: Delphi


Winsoft OCR EngineMode := emTesseractOnly

В свойствах TOcr есть EngineMode, где можно указать "emTesseractOnly".

Ocr1.EngineMode := emTesseractOnly;

При этом возникает исключение
exception
Project raised exception class EOcrError with message 'Cannot initialize Tesseract library'


Это связано с тем, что используете emTesseractOnly, т.е. при использовании устаревшего движка Tesseract вам необходимо загрузить и использовать данные языка Tesseract из репозитория tessdata:
https://github.com/tesseract-ocr/tessdata

Репозиторий Tessdata также поддерживает механизм LSTM. При использовании только LSTM нейронной сети, вы можете использовать данные языка из tessdata_fast или tessdata_best
https://github.com/tesseract-ocr/tessdata_fast
https://github.com/tesseract-ocr/tessdata_best
автор: X11 добавлено: 27 авг 18 просмотры: 393, комментарии: 0



cxGrid - Data row fixing

В версии 2017.2.2 появилась возможность закреплять вверху или внизу сетки несколько записей, как программно, так и пользователю с помощью мышки.

За это отвечают несколько свойств:
1. Нужно включить GridView.OptionsCustomize.DataRowFixing, чтобы включить этот функционал.

2. Определить, как будет выглядеть в таблице значок, который будет видеть пользователь GridView.FixedDataRows.PinVisibility (rpvAlways, rpvHotTrack or rpvRowHotTrack), если программист собирается дать пользователю управлять закреплёнными строками:
Картинка с другого сайта.

Чтобы программно управлять закреплёнными строками (row), воспользуйтесь свойством DataController.RowFixedState:
cxGrid1DBTableView1.DataController.RowFixedState[0] := rfsFixedToTop; 


Пример цикла:
procedure TForm1.FixRows2;
Var
 colName: TcxGridDBColumn;
 iCurRow: integer;
 ARowInfo:  TcxRowInfo;
begin
  colName := cxGrid1DBTableView1.GetColumnByFieldName(constMyColNAME);
  if not Assigned(colName) then exit;

  cxGrid1DBTableView1.BeginUpdate;
  try

    for iCurRow := 0 to Pred(cxGrid1DBTableView1.DataController.RowCount) do
    begin
      ARowInfo := cxGrid1DBTableView1.DataController.GetRowInfo(iCurRow);

      if ARowInfo.Level < cxGrid1DBTableView1.DataController.Groups.GroupingItemCount then
        Continue
     else
       begin
         //если есть нужное значение, закрепляем строку
         if cxGrid1DBTableView1.DataController.Values[ARowInfo.RecordIndex, colName.Index] = 'my value 123'
         then
           cxGrid1DBTableView1.DataController.RowFixedState[iCurRow] := rfsFixedToTop;


       end;
    end;// for

  finally
    cxGrid1DBTableView1.EndUpdate;
  end;
end;


Ист:
https://www.devexpress.com/Support/Center/Question/Details/K18187/how-to-fix-a-row
http://www.sql.ru/forum/1296597/cxgrid-fixed-data-rows
автор: X11 добавлено: 25 июн 18 просмотры: 1008, комментарии: 0



Программно открыть или закрыть TcxPopupEdit в TcxVerticalGrid

В cxVerticalGrid может быть строка, где Properties.EditProperties := PopupEdit
Как можно закрыть или открыть программно выпадающее окно.


procedure VerticalGridDropDownRow(vg: TcxVerticalGrid; aRow: TcxEditorRow; aDropedDown: boolean);
Var
  AEdit: TcxPopupEdit;
begin
  vg.SetFocus;
  vg.FocusedRow := aRow;
  vg.ShowEdit;
  if (vg.InplaceEditor <> nil) and (vg.InplaceEditor is TcxPopupEdit) then
  begin
    AEdit := TcxPopupEdit(vg.InplaceEditor);
    AEdit.DroppedDown := False;
  end;
end;


У TcxPopupEditProperties отсутствует метод или свойство, позволяющее открыть/закрыть Popup control.
Popup подразумевает работу только с ним. Нельзя открывать несколько Popup`ов одновременно. При потере фокуса Popup должен закрыться.
автор: X11 добавлено: 25 окт 16 просмотры: 1956, комментарии: 0



Выложен Lazy Delphi Builder 1.14.14.362 и 364 (альфа)

Блог: TDelphi-блог
Выложена версия Lazy Delphi Builder 1.14.14.362. Исправлен Exception при добавлении пути в Lazy Paths. В редакторе IDE search paths исправлены ошибки с подсветкой несуществующих папок. Добавлена новая команда Replace selected with env var (auto) - которая заменяет часть пути на Environment variable (переменные ищутся в Lazy Environment variables и IDE environment variables) Download here Lazy Delphi Builder 1.14.14.364 alpha. обновлён JCL: * исправлена ошибка с некорректным ключом dcc32 -N"Snamespace" * улучшена поддержка версий Delphi XE2+ * другие исправления Эту версию я ещё не тестировал. Если что-то найдёте - дайте знать.

[[ Полный текст записи доступен в TDelphi-блоге]] читать дальше...
автор: debose добавлено: 16 апр 16 просмотры: 1234, комментарии: 0



Lazy Delphi Builder 1.14.14.356 доступен

Блог: TDelphi-блог
В этом блоге, последний раз я выкладывал анонс версии 1.10.9.269 от 2014-03-15. Новые версии продолжали выходить, я о них писал на сайте проекта и на страничке Lazy Delphi Builder в Google+. Пользователям версии 1.10.9.269 от 2014-03-15 настоятельно рекомендую обновиться – была исправлена критическая ошибка приводившая к раздуванию файла LazyDBP и торможению работы. Основные нововведения опишу здесь. За деталями – добро пожаловать в history_en.txt. Большие изменения Добавлена поддержка "portable" инсталляций (нужен только dccXX.exe и папка Lib) Поддержка Delphi XE8-Seattle Добавлен тулбар и горячие клавиши для навигации по build log Интерфейс больше не блокируется на время компиляции (Application.ProcessMessages наше всё) Режим /noop – когда никаких реальных действий с...

[[ Полный текст записи доступен в TDelphi-блоге]] читать дальше...
автор: debose добавлено: 01 апр 16 просмотры: 1142, комментарии: 0



Выложен Lazy Delphi Builder 1.14.14.360 (исправления ошибок)

Блог: TDelphi-блог
01.04.2016. Lazy Delphi Builder 1.14.14.360: Исправления ошибок. Исправлены ошибки с относительными путями. Как для путей в LazyDBP файле так и для переменной $(BUILTIN_PROFILE_DIR) Консольная версия не возвращала ERRORLEVEL если при удалении или создании папки случалась проблема Очень тормозило построение дерева после удаления узла MRU файлы. Последний загруженный отправляется наверх. Наконец-то. Новый параметр командной строки /MaxProblemCountToStop Значение BUILTIN_PROFILE_DIR переменной выводится после загрузки профиля в /debug режиме в консольной версии  Скачивать

[[ Полный текст записи доступен в TDelphi-блоге]] читать дальше...
автор: debose добавлено: 01 апр 16 просмотры: 893, комментарии: 0





Изменение курсора и автоматическое восстановление при выходе из метода

Блог: TDelphi-блог
Не знаю как у вас, а у меня коде (vcl приложение) полным-полно таких конструкций: var tmpOldCursor: TCursor; begin tmpOldCursor := Screen.Cursor; try Screen.Cursor := crHourglass; // код который может работать относительно долго // например, выполнять запрос в БД finally Screen.Cursor := tmpOldCursor; end; end; И мне это надоело. По двум причинам: увеличение размера модулей - по 8 строк кода на каждый такой случай разбухание секции uses, ведь чтобы это работало нужно в каждый модуль работающий с курсором добавить uses Forms, Controls; Поэтому давайте уже воспользуемся механизмом подсчёта ссылок в интерфейсах, и реализуем маленький класс избавляющий нас написания лишнего кода. Так чтобы вышеприведённый пример можно было упростить до 1й...

[[ Полный текст записи доступен в TDelphi-блоге]] читать дальше...
автор: debose добавлено: 21 сен 15 просмотры: 1219, комментарии: 0



TcxTreeList - цикл по выделенным узлам

Как пройтись циклом по выделенным узлам TcxDBTreeList?


var
  I, d: Integer;
begin
  for I := 0 to pred(dbTree.SelectionCount) do
    d := TcxDBTreeListNode(dbTree.Selections[i]).KeyValue;


procedure TForm1.Button1Click(Sender: TObject);
var
  ANode: TcxTreeListNode;
begin
  cxTreeList1.BeginUpdate;
  ANode := cxTreeList1.Root.getFirstChild;
  while ANode <> nil do
  begin
    if ANode.Values[cxTreeList1Column1.ItemIndex] = 'Value 2' then
      ANode.Values[cxTreeList1Column2.ItemIndex] := 'Value 5';

    ANode := ANode.GetNext;
  end;
  cxTreeList1.EndUpdate;
end;
автор: X11 добавлено: 07 май 15 просмотры: 1578, комментарии: 1



WebDAV Диск.Яндекс + Delphi (InDy TidWebDAV)

Стоит задача опубликовать файл, который находится в папке Яндекс-Диска.
Т.е. файл там уже есть, нужно только дать команду опубликовать и получить в ответ ссылку на скачивание файла.

На форму кидаем кнопку, компоненту TidWebDAV, TIdSSLIOHandlerSocketOpenSSL TIdLogFile и связываем их, добавляем ещё на форму компоненту TMemo, в которую будет выводить результат.
В папку проекта копируем 2 файла: ssleay32.dll и libeay32.dll т.к. общение будет проходить по протоколу https.
Будем использовать OAuth авторизацию, для которой не нужны логин и пароль.
В корне Яндекс-Диска есть папка tst, в которой лежит файл readme.txt. Его и будем публиковать и получать ссылку на скачивание. Чтобы опубликовать файл или папку, следует передать XML файл с набором команд. В ответ тоже получим XML со ссылкой на опубликованный файл.

Для получения OAuth токена следует прочитать это: https://tech.yandex.ru/oauth/
Принцип такой.
Каждый пользователь программы должен получить свой OAuth для своей учётной записи Яндекса.
Авторизуемся на сайте oauth https://oauth.yandex.ru/ и создаёт новое Приложение, даём ему название и выбираем, какие сервисы Яндекса будут доступны этому Приложению ( http://f6.s.qip.ru/14a5VJj7F.png ). Приложение - это условно набор яндекс-сервисов.

Когда получили ID (client_id) только что созданного приложения, то уже можем получить oauth token по такой ссылке:
https://oauth.yandex.ru/authorize?response_type=token&client_id=c953e33d6ec14895aa736f33143e73n7
Это всё есть в документации. См ссылки ниже.

procedure TForm2.Button1Click(Sender: TObject);
Var
 s, r: TStringStream;
 u: UTF8String;
begin
  u := '<propertyupdate xmlns="DAV:">' + sLineBreak +
  '<set>'  + sLineBreak +
    '<prop>'  + sLineBreak +
      '<public_url xmlns="urn:yandex:disk:meta">true</public_url>'  + sLineBreak +
    '</prop>'  + sLineBreak +
  '</set>'  + sLineBreak +
'</propertyupdate>';

  s := TStringStream.Create(u);

  s.Seek(0, 0);

  r := TStringStream.Create('');
  try
    IdWebDAV1.Request.Clear;
    IdWebDAV1.Request.CharSet := 'UTF-8';
    IdWebDAV1.Request.BasicAuthentication := False;
    IdWebDAV1.Request.Host := 'webdav.yandex.ru';
    IdWebDAV1.Request.CustomHeaders.Add('Authorization: OAuth 6e1ec970696e432093c4e09df9582972');
    IdLogFile1.Active := True;
    IdWebDAV1.DAVPut DAVPropPatch('https://webdav.yandex.ru/tst/readme.txt', s, r);
    r.Position := 0;
    Memo1.Lines.Text := UTF8Decode(r.DataString);
  finally
    s.Free;
    r.Free;
  end;
end;


Delphi 2007, Indy 10_4885.

Ссылки:
Описание WebDav API Диска: https://tech.yandex.ru/disk/webdav/
Публикация файлов и папок: https://tech.yandex.ru/disk/doc/dg/reference/publish-docpage/
Об OAuth http://www.webdelphi.ru/tag/oauth/


Дополнительно.
У Яндекса есть Полигон для тестирования REST API https://tech.yandex.ru/disk/poligon/ , но это не относится к WebDAV.
автор: X11 добавлено: 27 ноя 14 просмотры: 5912, комментарии: 2


предыдущие записи