Ответы пользователя по тегу Delphi
  • Возврат без карты pilot_nt?

    @acwartz
    Тут должна быть ваша реклама.
    Как сделать возврат на карту клиента, без карты?

    Найти карту и повторить п.1 ещё раз. Если все ещё нет то повторять п.2-п.1 до упаду.
    Ответ написан
    Комментировать
  • Как реализовать разграничение прав доступа в Delphi?

    @acwartz
    Тут должна быть ваша реклама.
    Нужно думать не о ролях а о привилегиях. Право на чтение таблицы или таблиц (SELECT) право на редактирование (UPDATE) право на удаление (DELETE). А роли это уже косметика которая иерархично выстраивает привилегии.
    Исходя из выданных привилегий сами решаете что есть админ т.к. ими же (привилегиями) можете проверять экклюзивный доступ требующий привилегии ADMIN_ACCESS например. Таким образом админ тот у кого есть ADMIN_ACCESS привилегия.

    Проще говоря есть некий код, который по логину-пароль возвращает интерфейс IUser у которого есть дочерний объект-интерфейс IRights у которого есть функция HavePrivilege(PriviligeID, ISecurityContext) где PriviligeID некое числовое или строковое обозначение привилегии (которая захардкожена в коде и используется где нужно),
    ISecurityContext - интерфейс на список данных доступ к которым проверяется, это может быть что угодно:
    - имя таблицы
    - имя компонента
    и .т.д.

    Допустим Вы проектируете форму кредитных заявок, есть 2 роли:
    - администратор, который видит все заявки в системе, от всех операторов и может их удалять.
    - операционист, который их создает, редактирует и видит только те заявки, которые создал сам.

    Система прав:
    Есть понятие привилегии, если говорить в рамках операций с БД, то привилегии могут быть:
    - с указанием таблиц к которым разрешено обращаться.
    - с указанием признака супер-привилегии, такая привилегия тупо имеет доступ ко всем таблицам.
    - с указанием пред.установленного фильтра, например запрос данных из таблицы сформируется с привязкой к текущему авторизованному пользователю, и юзер увидит только те записи которые создал он сам.

    Собственно у вас 2 формы:
    - 1. Форма с таблицей заявок.
    - 2. Форма заявки.

    Логика такая:
    Открывается форма-список заявлений, проверяется разрешение TABLE_READ, если его нет - отлуп с сообщением "У вас нет прав на просмотр этих данных". Юзер видит пустой грид и кнопку закрыть.
    Если TABLE_READ есть, и среди указанных там таблиц НЕТ "CreditRequests", то тот же отлуп с сообщением.
    Если TABLE_READ есть к этой таблице или это супер-привилегия чтения всех таблиц, то смотрим на фильтр, и применяем его к формируемому SELECT. Что такое фильтр?
    В таблице CreditRequests есть поле OperID которая указывает на IUser.ID т.е. связывает запись с её создателем, таким образом через привилегию открытия таблицы с указанием фильтра, вы покажете юзеру только записи которые делал он сам.
    Дальше открывается БД, с формированием выборки и отображением в грид.

    Дальше на форме лежит какой-нибудь ActionList , где на вставку, редактирование и удаление записей идет проверка TABLE_EDIT, TABLE_DELETE схожим образом, т.е. если IUser.IRights отвечает что тип нет такого или нет для запрашиваемого объекта то отлуп с сообщением о нехватке прав.

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

    Эта система прав сложна и обычно глубоко интегрируется в частности в компоненты отображения т.к. например оператор видит колонки (поля) записи таблицы, а администратор должен видеть и иметь возможность фильтровать данные в разрезе операторов которые заявки плодят, т.е. есть колонка которая из БД поднимает ФИО того кто заявку создал + можно сформировать лог изменений по заявке (кто и когда чего наизменял), сюда же встраивается механизм верификации т.е. оператор создал, админ принял/отказал, оператору вернулась заявка на доработку.
    А то и ещё глубже идет разграничение, например разрешается редактировать только некоторые компоненты на форме (например ставить отметки/галочки или писать примечания).
    Ответ написан
    Комментировать
  • Как растянуть форму на несколько мониторов?

    @acwartz
    Тут должна быть ваша реклама.
    В модуле Vcl.Forms есть класс TScreen, через который можно перечислить мониторы и получить их свойства.
    Класс создавать не надо, он уже создан в глобальной переменной Screen
    Примерно так:
    i, TotalWidth , TotalHeight : Integer;
    for i = 0 to Screen.MonitorCount -1 do
    begin
      TotalWidth := TotalWidth + Screen.Monitors[i].Width;
      TotalHeight := TotalHeight + Screen.Monitors[i].Heigth;
    end;
     Form.Width := TotalWidth;
     Form.Heigth := TotalHeight ;

    код на коленке писал.
    Ответ написан
    Комментировать
  • Как создать OLE объект для интеграции perco S-20 с внешним ПО?

    @acwartz
    Тут должна быть ваша реклама.
    Ну для начала не городить грабли, если мы говорим о COM, то SDK скорее всего зарегистрировал в системе библиотеку типов(TLB) из который Delphi сам создаст полноценный модуль со всеми интерфейсами и сам же пропишет функцию типа CoCreateMySuperDuperSDK: ISuperDuperSDKInterface, которую только что и останется вызвать и больше не думать о том "как вызвать что-то ещё".

    И делается это так:
    Меню Component -> Import Component... -> "Type library" -> ищем свою халабуду. И далее 3 раза Next ничего не трогая, потом Finish. И вуаля, delphi сделал за всю всю работу, полностью сгенерировав обертку над предоставляемыми интерфейсами.

    А если нет, то такую tlb можно поискать внутри dll/exe идущих вместе с SDK или лежащий вообще где-то рядом, потому что COM/OLE распространяются вместе библиотекой типов которая описывает все интерфейсы. Или спросить у разработчиков SDK о ней.
    Ответ написан
    Комментировать
  • Счётчик успешных операций в минуту на Delphi?

    @acwartz
    Тут должна быть ваша реклама.
    Ну и зачем вам юникстайм для этого?
    Есть же функция ОС GetTickCount , а если работать с датами то в DateUtils есть MillisecondsBetween который вернет ровно тот же результат что и GetTickCount. Дальше хоть в секунды хоть в часы...
    Ответ написан
    Комментировать
  • Как собрать программу (несколько вопросов)?

    @acwartz
    Тут должна быть ваша реклама.
    Имя файла это имя проекта, можно изменить в менеджере проектов:
    5f896f9c34249105669309.png

    Расположение выходного файла меняется в настройках проекта,
    обратите внимание на наличие вагона конфигураций:
    5f896fb08365a536392909.png

    Я для output directory для all values - all platforms указываю ..\bin\, там и плодятся все бинарники.
    Но это у меня т.к. структура проектов всегда такая:
    ./prjects//bin/.exe
    ./prjects//source/DCU/{Platform}/{BuildMode}/
    ./prjects//source/.dproj
    3) В настройках проекта указал лого и иконку(почему то у exe'шника и в трее они не меняются) - их(иконки) нужно так же около exe файла держать?

    С лого и прочим тоже самое, для каждого конфига нужны свои настройки.
    Иконка в трее берется из соотв. свойства компонента.

    4)Еще такой вопрос - как лучше хранить настройки по умолчанию?(сейчас они просто прописаны в коде) Была мысль - ini файл рядом с exe положить, но среди настроек есть некоторые "секретные", поэтому нужно, чтобы обычный пользователь их не трогал и не видел - нормальное ли решение будет добавить dll в котором прописать функцию устанавливающую эти настройки(например логин, пароль, адрес сервера куда отправляются запросы)
    обычные настройки(автозапуск, горячие клавиши) записываю в реестр.

    Вдумайтесь, настройки по-умолчанию это те настройки которые есть всегда вне зависимости от доступности реестра/файлов. Они должны быть внутри самого exe, т.е. прямо в коде прописаны либо модулем с константами/функциями. И не надо городить ни в ресурсах ни рядом ни в dll ничего, никаких конф. файлов. Это лишняя и пустая трата времени, в 95% случаев вы туда только в первый раз полезете и всё.

    5) Нужно ли сжимать exe файл с помощью upx?

    И зачем это нужно делать? Чтобы лишний раз панику пользователю развести на пустом месте из ничего?
    Если задаётесь этим вопросом, ответ - НЕ НУЖНО. Соберите Release и всё.

    6) С помощью чего создать инсталлятор? сильно ли критичный вариант создать sfx-архив с exeшником, файлом реестра и dll файлам?.

    А точно нужен этот инсталлятор?
    Батника Uninstall с командой start /wait yourapp.exe --uninstall недостаточно? Программа запустится, найдет аргумент вычистит все свои данные, и завершится. Батник грохнет свою папку и себя. Всё.

    Инсталлятор нужен когда приложение очень много файлов ставит в т.ч. в систему (системные библиотеки, масса записей в ресстр). Если очень хочется модно/молодёжно, то создавайте при помощи InnoSetup.
    Ответ написан
    Комментировать
  • Delphi 10.4.1 видит регистр XMM0-XMM7 но ругается на XMM8 и более, почему?

    @acwartz
    Тут должна быть ваша реклама.
    Все что после XMM7 это для x64. Вики.

    Переключите приложение в сборку под x64, а лучше оберните нужный кусок кода в соотв. условие:
    {$IFDEF CPUX86}
      asm
        // ...
      end;
      {$ENDIF CPUX86}
      {$IFDEF CPUX64}
      asm
        // ...
      end;
    {$ENDIF CPUX64}
    Ответ написан
    Комментировать