-
MY PROJECTS
-
Recent Posts
- SQL.How can you compare two nullable values safely, and how does IS DISTINCT FROM differ from <>?
- SQL.How are NULL values ordered by ORDER BY, how do defaults differ between databases, and how can you control their placement?
- SQL.How does NULL propagate through arithmetic expressions, and how can COALESCE and NULLIF help handle missing values and division by zero?
- SQL.How does NULL affect join conditions, and why can filtering the right-hand table in WHERE remove unmatched rows from a LEFT JOIN?
- SQL.How do GROUP BY and DISTINCT treat NULL values, even though NULL = NULL evaluates to UNKNOWN?
- SQL.How do aggregate functions handle NULL, and what is the difference between COUNT(*), COUNT(column), and COUNT(DISTINCT column)?
- SQL.How does NULL affect IN and NOT IN, and why can NOT EXISTS be a safer choice when a subquery returns nullable values?
- SQL.How do WHERE, HAVING, and CHECK constraints treat conditions that evaluate to UNKNOWN?
- SQL.Why do column = NULL and column <> NULL not work as expected, and when should you use IS NULL and IS NOT NULL?
- SQL.What is SQL’s three-valued logic (TRUE, FALSE, UNKNOWN), and how do AND, OR, and NOT behave with UNKNOWN?
- ChromeDevTools.Watch all failed requests
- SQL.What are domain types (or constraints on data types), and how do they help enforce data correctness?
- SQL.How does SQL handle comparisons between different data types (for example, string vs number), and why is this dangerous?
- SQL.What is the difference between DATE, TIME, TIMESTAMP, and TIMESTAMPTZ, and which one should be used for business events?
- SQL.How do numeric types like INTEGER, BIGINT, DECIMAL, and FLOAT differ in terms of precision and use cases?
- SQL.What problems can arise from implicit type casting in SQL, and how can it affect indexes?
- SQL.How does NULL differ from 0, an empty string, or FALSE in SQL?
- SQL.What is the difference between CHAR, VARCHAR, and TEXT, and when would you choose each?
- SQL.What is MVCC ?
- SQL.What is AutoVacuum Postgres ?
Categories
- Aptana
- Azure
- C#
- DataSnap
- DBExpress
- Delphi
- Delphi и сети
- Delphi. Язык программирования
- ExtJS
- FastReport
- FireDAC
- FireMonkey
- GIT
- ICS
- IDE
- IIS
- Indy
- InnoSetup
- javascript
- jQuery
- JSON
- LiveBindings
- MSHTML
- MySQL
- PHP
- REST
- Ribbons
- SMS
- SQL инструкции
- SVN
- TRichView
- UniGui
- WebBroker
- WinAPI
- Windows
- Алгоритмы
- Без рубрики
- Деревья
- Ищу ответ
- Компонентостроение
- Мои компоненты
- Начальный уровень
- Обработка исключений
- Парсинг
- Потоки(Threads)
- Регулярные выражения
- Тестирование приложений
Category Archives: Компонентостроение
Delphi. DBTreeView. Загрузка картинок проекта из ресурсов
Добавляем ресурсы в проект Project > Resources and Images Модуль загрузки из ресурсов
Posted in Delphi, Компонентостроение
Comments Off on Delphi. DBTreeView. Загрузка картинок проекта из ресурсов
Delphi.DBTreeView своими руками.Прорисовка картинок папок и файлов
В событии CustomTreeDraw делаем следующее
Posted in Delphi, Компонентостроение
Comments Off on Delphi.DBTreeView своими руками.Прорисовка картинок папок и файлов
Delphi. DBTreeView. Обработка CheckBoxes
В главном модуле компонента при обработке события onClick
Posted in Delphi, Компонентостроение
Comments Off on Delphi. DBTreeView. Обработка CheckBoxes
Delphi. DBTreeView своими руками. Дополнительный модуль uSQLQueries
Дополнительный модуль, в котором сосредоточены основные SQL запросы. Имена некоторых полей берутся из ObjectInspector. Из специфичного для MySQL инструкция Insert… Select… для копирования узлов
Posted in Delphi, Компонентостроение
Comments Off on Delphi. DBTreeView своими руками. Дополнительный модуль uSQLQueries
Delphi. DBTreeView своими руками. Поиск
Модуль поиска по имени узла в компоненте выглядит следующим образом
Posted in Delphi, Компонентостроение
Comments Off on Delphi. DBTreeView своими руками. Поиск
Delphi.DBTreeView своими руками.Вставка скопированных, вырезанных узлов
Здесь самая большая сложность – восстановление структуры вставленных узлов в процедуре Structuring. В главном модуле компонента код выглядит следующим образом. Здесь у нас 2 потока должны работать по очереди, поэтому используем синхронизацию.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
//----------------------Вставка выбранных узлов----------------------------------------------------- procedure TDBTreeView.PasteNodes; {Здесь можно увидеть наглядный пример синхронизации потоков!!!} var PasteThread:TPasteThread; UpdateIndexesThread:TUpdateIndexesThread; Event:TEvent; IDSelected:integer; begin if not Assigned(FIDList) then FIDList:=TStringList.Create; //Защита, если список пустой, то выходим if FIDList.Count=0 then exit; //Если копируем родителя в ребенка, тоже выходим IDSelected:=integer(Self.Selected.Data^); if FIDList.IndexOf(IDSelected.ToString())<>-1 then begin raise Exception.Create('Начальный элемент содержит конечный.Вставка невозможна'); exit; end; Event:=TEvent.Create( nil, //Security Attributes true, //Manual Reset false,// Initial State '' ); //Event.ReSetEvent; // <<Вошли в событие //Запускаем поток копирования, передаем ссылки... Self.Items.BeginUpdate; PasteThread:=TPasteThread.Create(true);//true означает ручное управление потоком PasteThread.DBTreeView:=Self; //Передаем ссылку на дерево PasteThread.Event:=Event; //Передали ссылку на событие снаружи PasteThread.MyCreate; // Создаем внутренние переменные потока PasteThread.IDList.Assign(FIDList); PasteThread.IDofCopiedNode:=FIDofCopiedNode; PasteThread.Cut:=FCut; PasteThread.Start; PasteThread.FreeOnTerminate:=true; //Event.SetEvent; // << Вышли из события //if PasteThread.Finished then begin //Перенумерация индексов UpdateIndexesThread:=TUpdateIndexesThread.Create(true); UpdateIndexesThread.Event:=Event; UpdateIndexesThread.DBTreeView:=Self; UpdateIndexesThread.MyCreate; UpdateIndexesThread.Start; UpdateIndexesThread.FreeOnTerminate:=true; end; Self.Items.EndUpdate; FCut:=false; //Освобождение Event происходит внутри UpdateIndexesThread потока по ссылке //if Event<>nil then FreeAndNil( Event );// <<Так делать не надо, так как поток может // закончиться позже end; |
Posted in Delphi, Компонентостроение
Comments Off on Delphi.DBTreeView своими руками.Вставка скопированных, вырезанных узлов
Delphi.DBTreeView своими руками. Копирование, вырезка узлов
В главном модуле копирование, вырезка узлов выглядит следующим образом. FIDList это список (TStringList), в который мы собираем узлы для копирования и вырезки. Также используется модуль uSelectedOrChecked, он приведен ниже.
Posted in Delphi, Компонентостроение
Comments Off on Delphi.DBTreeView своими руками. Копирование, вырезка узлов
Delphi. DBTreeView. Поднятие, опускание узлов.
В главном модуле компонента поднятие опускание узлов выглядит следующим образом
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
//--------------------------------Поднятие, опускание узлов----------------------------------------- procedure TDBTreeView.NodeDown; var NodeUpDown:TNodeUpDown; begin try Screen.Cursor:=crSQLWait; //Do_Something NodeUpDown:=TNodeUpDown.Create(Self); NodeUpDown.DBTReeView:=Self; // << Передаем в поле экземпляра класса ссылку на себя NodeUpDown.NodeDown; finally Screen.Cursor:=crDefault; FreeAndNil(NodeUpDown); end; end; procedure TDBTreeView.NodeUp; var NodeUpDown:TNodeUpDown; begin try Screen.Cursor:=crSQLWait; //Do_Something NodeUpDown:=TNodeUpDown.Create(Self); NodeUpDown.DBTReeView:=Self; // << Передаем в поле экземпляра класса ссылку на себя NodeUpDown.NodeUp; finally Screen.Cursor:=crDefault; FreeAndNil(NodeUpDown); end; end; |
Сам модуль uNodeUpDown выглядит следующим образом
Posted in Delphi, Компонентостроение
Comments Off on Delphi. DBTreeView. Поднятие, опускание узлов.
Delphi.DBTreeView. Удаление узлов
В главном модуле компонента код выглядит следующим образом. Здесь важно корректно рекурсивно удалить память под указателями и только после этого удалить сами узлы.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
//-----------------------------------Удаление узлов------------------------------------------------- procedure TDBTreeView.DeleteNodes; var DeleteThread:TDeleteThread; SelectedOrChecked:TSelectedOrChecked; begin try Screen.Cursor:=crSQLWait; //Do_Something // Собираем в список выделенные или отмеченные галочками и их потомков SelectedOrChecked:=TSelectedOrChecked.Create(nil); SelectedOrChecked.DBTreeView:=Self; //Передаем ссылку на объект SelectedOrChecked.List; // Собрали в список finally Screen.Cursor:=crDefault; end; Self.Items.BeginUpdate; //Запускаем поток DeleteThread:=TDeleteThread.Create(true); DeleteThread.DBtreeView:=Self; // Ссылка на объект дерева DeleteThread.MyCreate; // Создание внутренних переменных //Передаем список в экземпляр класса DeleteThread.IDList.Assign(SelectedOrChecked.IDListToCopyOrCutOrDelete); //Запускаем поток DeleteThread.Start; DeleteThread.FreeOnTerminate:=true; FreeAndNil(SelectedOrChecked); Self.Items.EndUpdate; end; |
Как видно, само удаление происходит в потоке. Модуль потока удаления выглядит следующим образом
Posted in Delphi, Компонентостроение
Comments Off on Delphi.DBTreeView. Удаление узлов
Delphi. DBTreeView своими руками. Соединение с базой данных
Все остальные модули DBTreeView используют модуль соединения. В данном модуле 3 класса 1) класс параметров соединения, – TDBConnectionParams Он нужен для показа параметров соединения в инспекторе объектов 2)Класс таблицы TDBTable и её полей 3) Класс непосредственно соединения TDBConnectionBPL Выглядит он … Continue reading
Posted in Delphi, Компонентостроение
Comments Off on Delphi. DBTreeView своими руками. Соединение с базой данных