Delphi. Как сделать Ribbon меню на DevExpress?

Делая меню для одной из своих программ, я экспериментировал со встроенными Риббонами из стандартной библиотеки Delphi. Но, скажу честно, отказался от этой идеи. Местами были глюки. Всё настроил, но оно слетает. Пожелание разработчикам стандартных Риббонов Delphi – довести до ума.

Остановился на риббонах от DevExpress. Скажу честно, мне эта библиотека очень понравилась, но в неё нужно “вьезжать” какое-то время. Чтоб это время сэкономить тем, кто хочет сделать себе красивое меню для VCL программы, предлагаю данный пост.

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

Итак, что нужно сделать? Разберем по шагам.  Читать далее

MySQL. Добавляем хранимые процедуры и функции ( “рутину” ) в модель и физическую базу данных

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

Добавление хранимой функции в физическую базу данных

Здесь всё просто. Открываем WorkBench

Добавляем хранимую функцию. Скажем это будет проверка логина, пароля и роли при входе.

Функция проверяет логин, пароль и роль, если они одновременно подходят, значит возвращает единицу. Если нет, или таких записей больше чем 1, то возвращает 0. Предполагается, что логин должен быть уникальным. Соответственно записи тоже. Читать далее

Delphi.MySQL.Мои компоненты.TPSDBTreeView

Вот что у нас получится.  Дерево работает над базой MySQL. В примере 2 дерева, работающие над одной таблицей базы. 3-й ряд кнопок сам определяет какое дерево активно. Исходники прилагаю.

Типовая таблица для дерева. Это минимальный набор полей. Всё остальное можно добавлять по необходимости. При этом копирование-вставка записей будут происходить корректно.

Читать далее

Delphi. MySQL. InsertSelect всех полей для реализации Copy Paste

Делал для своего компонента TPSDBTreeView функцию “вырезать, копировать, вставить” на основе InsertSelect. Проблема в том, что если пытаться копировать все поля, скажем так

то получим

Что же делать в таком случае? Нашёл такой выход

Вот пример из проекта

 

При вставке в Delphi TFDQuery

Что происходит в коде? Мы просто составляем запрос на уровне базы, выкидывая ненужные колонки, в нашем случае id и исполняем его там.

И далее обращаться, скажем так

 

Delphi. Архитектура приложения. Видимость объектов

Увидел на DelphiMaster, решил сохранить себе

Вот несколько принципов, соблюдая которые навсегда избавишься от проблем “видимости”:

1. Объекты, переменные, методы ОБЩЕГО ПОЛЬЗОВАНИЯ всегда размещать в датамодуле, причем сам код датамодуля не должен “ведать” ни о каких переменных извне – все, что ему надо, должно передаваться в параметрах.
Ссылку на датамодуль располагать в инфтерфейсной части всех юнитов – “клиентов”, там, где перечисляются VCL-ные юниты. Датамодуль так же, как и гл.формы, должен быть включен в список автосоздаваемых.

2. Главная форма не должна обращаться ни к какому юниту, кроме датамодуля, ПО ИМЕНИ. Только по явной ссылке, используя разыменование типа. Уместно иногда вместо прямых вызовов внешних процедур использовать сообщения – при этом нет необходимости делать методы сторонних юнитов видимыми (uses в implementation) – такая технология удобна, например, при реализации общего функционала в MDI – приложениях.

3. “Дочерние” формы могут обращаться к переменным и методам Главной формы так же, как к датамодулю, для чего имя инита гл.формы также располагается в интерфейсной части uses. Все “дочерние” формы должны быть исключены из списка автосоздаваемых.

4. Не следует хранить данные, относящиеся к какому-то объекту (например, доч.форме), вне этого объекта. В сторонние методы, обрарабывающие объект, адрес на него передавать параметром.

5. Объекты уничтожает тот, что его создает.

6. Объект никогда не уничтожается в процедуре (функции), которой он передается как параметр (точнее, ссылка на него)

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

Это схема, конечно, не является догмой, но новичкам позволяет избежать массу ошибок.

Delphi. Передаем ссылку на Owner через (Self.Owner as TOwnerType) а не через UnitVar

Проблема

Разрабатывал компонент. Ссылку на Owner всегда передавал в inherited конструкторе так

Компонент визуальный. Разместил несколько его экземпляров на форме, стал тестировать. Начались глюки.

Скажем, если заполняю какое-то свойство у SomeComponentName1.SomeProperty, то оно заполняется у SomeComponentName2.SomeProperty, а у первого не заполняется. В общем стал копать и похоже SomeUnitVar работает как глобальная переменная, от которых все бегут.

Решение

Обращаться в локальных методах к Owner через (Self.Owner as TOwnerType), например так…

Такой подход дал положительный результат. Сделать полем объекта мы здесь не можем, потому как возникнет циклическая связь. Под Implementation писать тоже не можем, в силу указанной выше причины.

 

 

MySQL. Вход по ролям на уровне базы

Напишем простейшую функцию, которая позволит входить по ролям на уровне базы.

Допустим у нас есть таблицы

Следующая функция позволит осуществлять вход по ролям. На выходе мы получим название роли. И в клиенте можем загружать тот или иной кабинет.

Тестируем

MySQL. Простейший триггер на BEFORE INSERT заполняющий creationDateTime

Всегда делал это из клиента, как то так, а оно оказывается всё проще. Век живи, век учись!

Триггер

И вот он результат

 

MySQL. Авторизация на языке базы (хранимая функция). И вызов из Delphi

Пример №1

Простая и надежная функция проверки логина, пароля, роли, с результатом tinyint(1)

C результатом VarChar

Вызов из Delphi

Вызов из Delphi

Пример №2

Вот функция в MySQL, которая проверяет пару логин пароль и при обнаружении выдает id пользователя

Эту функцию дал мне Денис Зубов, который также сейчас работает активно с базой MySQL.

Вариант от Дениса Зубова

Простая и понятная функция в стиле Си я бы сказал. Делаем выборку по логину и сравниваем пароль. Если ID не найден, тогда он 0. Можно использовать в качестве авторизации.

Я в своих проектах использую авторизацию через СМС, поэтому мне нужно проверять телефон и пароль. Немного изменил эту функцию на свой лад.

Далее нам нужно вызывать эту функцию, например таким образом

Как вызывать хранимую функцию из Delphi?

Подробное описание на официальном сайте Embarcadero

Если возвращается результат, используем ExecFunc, если нужно просто, чтобы процедура отработала на сервере базы, тогда ExecProc

Delphi. UniGUI. Делаем фильтры. Быстро и просто

Вот, что у нас получится на выходе

Чтобы освоить базовые принципы работы с фильтрами, посмотрите пример, который находится в

Вообще, у UniGUI отличные демки! Можно просто смотреть их и многое делать по аналогии! Читать далее