Faq вставка и удаление компонент в форму в design time


Содержание

Faq вставка и удаление компонент в форму в design time

wm_NextShow_Event = wm_User + 133;

wm_PrevShow_Event = wm_User + 134;

procedure FormCreate(Sender: TObject);

procedure WM_NextMSG (Var M : TMessage); message wm_NextShow_Event;

procedure WM_PrevMSG (Var M : TMessage); message wm_PrevShow_Event;

function Key_Hook : Longint; far; external ‘SendKey’;

procedure TForm1.WM_NextMSG (Var M : TMessage);

procedure TForm1.WM_PrevMSG (Var M : TMessage);

procedure TForm1.FormCreate(Sender: TObject);

то компилятор удалит загрузку DLL из программы>

Конечно, свойство Caption в этой форме должно быть установлено в «XXX».

Как сделать так, что при нажатии на Enter происходил переход к следующему элементу формы

Ставите у формы KeyPreview = true и создаете событие KeyPress следующего вида:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

if (Key = #13) then begin

Вставка и удаление компонент в форму в design-time

Каким образом можно отследить вставку и удаление компонент в форму в design-time? Такая информация могла бы пригодится, если моя компонента имеет ссылки на другие компоненты (например, как в связке TDateSource,TTable и др.)

Для получения такой информации предназначен метод

procedure Notification (AComponent: TComponent; Operation: TOperation); virtual;

класса TComponent. Перекрыв его в своей компоненты Вы можете произвести необходимые действия, в зависимости от значения параметра Operation типа

TOperation = (opInsert, opRemove);

объявленного в модуле Classes. Параметр AComponent — компонента, соответственно вставлемая или удаляемая, в зависимости от Operation.

Создание отчета в MS Word

(Пример для Delphi 1.0 поскольку в Delphi 2-3 лучше использовать:

var MsWord : variant;

Для Delphi 3, пример ниже)

Создавать отчет в программе Word удобно если отчет имеет сложную структуру (тогда его быстрее создать в Word, чем в Qreport от Delphi, кроме того, этот QReport имеет «глюки»), либо, если после создания отчета его нужно будет изменять. Итак, первым делом в Word создается шаблон будущего отчета, это самый обыкновенный не заполненный отчет. А в места куда будет записываться информация нужно поставить метки. Например (для наглядности метки показаны синим цветом, реально они конечно не видны):

Накладная № Num

Поставщик Наименование товара Код товара Кол-во Цена Сумма
Table ? ? ? ? ? ?

Далее в форму, откуда будут выводиться данные, вставляете компоненту DdeClientConv из палитры System. Назовем ее DDE1. Эта компонента позволяет передавать информацию между программами методом DDE. Свойства:

ConnectMode : ddeManual — связь устанавливаем вручную

DdeService : (winword) — с кем устанавливается связь

ServiceApplication : C:\MSOffice\Winword\WINWORD.EXE — полный путь доступа к программе. (Вот здесь можно наступить на грабли. Ведь Word может лежать в любой папке! Поэтому путь доступа к нему лучше взять из реестра, а еще лучше использовать OLE см.начало раздела)


Теперь пишем процедуру передачи данных:

StrPCopy(Tv, ‘[FileOpen «‘+S+'»][StartOfDocument]’);

StrCat(Tv, StrPCopy(SS, ‘[EditBookmark .Name = «Num», .Goto][Insert «‘+S+'»]’+

‘[EditBookmark .Name = «Table», .Goto]’);

if not DDE1.ExecuteMacro(Tv, false) then

MessageDlg(‘Ошибка связи с Microsoft Word.’, mtError, [mbOk], 0);

for i:=0 to TCount do

StrPCopy(Tv, ‘[Insert «‘+IntToStr(Nn)+'»][NextCell][Insert «‘+T[i].Company+'»]’+

‘[NextCell][Insert «‘+T.TName+'»][NextCell][Insert «‘+T.Cod+'»][NextCell]’+

if not DDE1.ExecuteMacro(Tv, false)

MessageDlg(‘Ошибка связи с Microsoft Word.’, mtError, [mbOk], 0);

if not DDE1.ExecuteMacro(Tv, false)

then MessageDlg(‘Ошибка связи с Microsoft Word.’, mtError, [mbOk], 0)

else MessageDlg(‘Акт удачно создан. Перейдите в Microsoft Word.’,

mtInformation, [mbOk], 0);

Для Delphi 2 и выше

=== Cut Пример by Sergey Arkhipov 2:5054/88.10 ===

Пример проверен только на русском Word 7.0! Может, поможет.

procedure TPrintForm.MPrintClick(Sender: TObject);

try // А вдруг где ошибка :)

// Создаем документ по шаблону MyWordDot

// с указанием пути если он не в папке шаблонов Word

// Отключение фоновой печати (на LJ5L без этого был пустой лист)

// Переходим к закладке Word’a ‘Num’

W.FilePrint(NumCopies:=’2′); // Печать 2-х копий

=== Cut Конец примера ===

Спасибо Сергею :) И еще, как определить установлен ли на компьютере Word, запустить его и загрузить в него текст из программы?

// Если Word уже запущен

// Взять ссылку на запущенный OLE объект

// Word не запущен, запустить

// Создать ссылку на зарегистрированный OLE объект

ShowMessage(‘Не могу запустить Microsoft Word’);

MSWord.Documents.Add; // Создать новый документ


MsWord.Selection.Font.Bold := True; // Установить жирный шрифт

MsWord.Selection.Font.Size := 12; // установить 12 кегль

По командам OLE Automation сервера см. help по Microsoft Word Visual Basic.

и он будет открыт >

Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs,StdCtrls,

procedure FormCreate(Sender: TObject);

Статьи 1
Советы по Delphi 1
Советы по работе с системой 1
Советы для написания программ-инсталляторов 1
Регистрация программ в меню «Пуск» Windows 95 1
Как программно создать ярлык? 1
Затенить кнопку «Закрыть» в заголовке формы 1
Копирование файлов 1
Как скопировать все файлы вместе с подкаталогами 1
Удаление каталога со всем содержимым 1
Определение системной информации 1
Как проинсталлировать свои шрифты? 2
Вставить какую-нибудь программу внутрь EXE файла 2
Как написать маленький инсталлятор? 2
Рисую две иконки 32х32 и 16х16, но под NT 32х32 не показывается! 2
Работа с принтером. 2
Система 2
Внешние модули (DLL), нити 6
Советы по работе с реестром. 7
Использование некоторых ключей реестра 7
Работа с реестром в Delphi 1 7
Объект INIFILES — работа с INI файлами. 7
Советы по работе с графикой 8
Разное 9
Глюки 14
Создание редактора карт в стратегиях типа WarCraft 14
Шпаргалка по ресурсам Windows-32 (для Delphi) 18
Стандартная технология доступа к ресурсам 18
Внутренний формат ресурсов Windows 18
Описание формата ресурсов в MS PE COFF. 19
Дамп памяти (взят из PE.TXT) 19
API 20
Программирование на основе Win32 API в Delphi 20
1. Введение 20
2. Существующие решения 20
3. Принципы построения API-библиотеки 20
4. Библиотека WinLite 21
5. Пример программы на основе библиотеки WinLite 23
KOL 23
Состояние проекта KOL 23
FAQ 24
Часто задаваемые вопросы по Borland Delphi 24
Общие вопросы по Delphi и данному FAQ (часть 1) 24
Введение 24
Вопросы общего характера 24
Совместимость 26
Базы данных — Interbase и локальные данные 27
Базы данных — прочие SQL сервера 28
Общие вопросы по Delphi и данному FAQ (часть 2) 29
Базы данных — компоненты и VCL. 29
Компоненты и VCL 31
Общие вопросы по Delphi и данному FAQ (часть 3) 34
Object Pascal и Windows API 34
Разное 37
Полезные хитрости 38
Вопросы по Delphi 1.0 38
Вопросы общего характера 38
Delphi и Visual Basic 39
Базы данных 40
Object Pascal и Windows API 40
Компоненты и VCL 41
Разное 41
Вопросы по Delphi 2.0 41
Что нового в Delphi 2.0 по сравнения с Delphi 1.0? 41
Вопросы общего характера 41
Базы данных 44
Object Pascal и Windows API 44
Разное 44
Вопросы по Delphi 3.0 45
Вопросы общего характера 45
Object Pascal и Windows API 45
Delphi, С++ Builder и базы данных: вопросы и ответы 46
Delphi VCL FAQ 48

Лучшие электронные книги в формате fb2
Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

Илон Маск рекомендует:  Использование microsoft visual studio net

Практическое руководство. Добавление или удаление элемента в коллекции элементов управления во время выполнения How to: Add to or Remove from a Collection of Controls at Run Time

Распространенные задачи при разработке приложений — это добавление элементов управления и удаление элементов управления из любого контейнера в формах (например Panel , или GroupBox , или даже самой формы). Common tasks in application development are adding controls to and removing controls from any container control on your forms (such as the Panel or GroupBox control, or even the form itself). Во время разработки элементы управления можно перетаскивать непосредственно на панель или в группу. At design time, controls can be dragged directly onto a panel or group box. Во время выполнения эти элементы управления поддерживают коллекцию Controls , которая отслеживает размещенные в них элементы управления. At run time, these controls maintain a Controls collection, which keeps track of what controls are placed on them.

Следующий пример кода применяется к любому элементу управления, который поддерживает внутри себя коллекцию элементов управления. The following code example applies to any control that maintains a collection of controls within it.

Программное добавление элемента управления в коллекцию To add a control to a collection programmatically

Создайте экземпляр элемента управления, подлежащий добавлению. Create an instance of the control to be added.

Задайте свойства нового элемента управления. Set properties of the new control.

Добавьте этот элемент управления в коллекцию Controls родительского элемента управления. Add the control to the Controls collection of the parent control.

В следующем примере кода показано, как создать экземпляр Button элемента управления. The following code example shows how to create an instance of the Button control. Для этого требуется форма с Panel элементом управления и метод обработки событий для NewPanelButton_Click создаваемой кнопки, уже существует. It requires a form with a Panel control and that the event-handling method for the button being created, NewPanelButton_Click , already exists.

Программное удаление элементов управления из коллекции To remove controls from a collection programmatically

Удалите обработчик событий из события. Remove the event handler from the event. В Visual Basic используйте ключевое слово оператора RemoveHandler . в C#используйте оператор-=. In Visual Basic, use the RemoveHandler Statement keyword; in C#, use the -= operator.

Используйте метод Remove для удаления требуемого элемента управления из коллекции Controls панели. Use the Remove method to delete the desired control from the panel’s Controls collection.

Вызовите Dispose метод, чтобы освободить все ресурсы, используемые элементом управления. Call the Dispose method to release all the resources used by the control.

Faq вставка и удаление компонент в форму в design time

Далее приведен код модуля в Delphi, который загружает DLL и обрабатывает сообщения от ловушки, просто отображая их в Label1.

wm_NextShow_Event = wm_User + 133;

wm_PrevShow_Event = wm_User + 134;

procedure FormCreate(Sender: TObject);

procedure WM_NextMSG (Var M : TMessage); message wm_NextShow_Event;

procedure WM_PrevMSG (Var M : TMessage); message wm_PrevShow_Event;

function Key_Hook : Longint; far; external ‘SendKey’;

procedure TForm1.WM_NextMSG (Var M : TMessage);

procedure TForm1.WM_PrevMSG (Var M : TMessage);

procedure TForm1.FormCreate(Sender: TObject);

то компилятор удалит загрузку DLL из программы>

Конечно, свойство Caption в этой форме должно быть установлено в «XXX».


Как сделать так, что при нажатии на Enter происходил переход к следующему элементу формы

Ставите у формы KeyPreview = true и создаете событие KeyPress следующего вида:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

if (Key = #13) then begin

Вставка и удаление компонент в форму в design-time

Каким образом можно отследить вставку и удаление компонент в форму в design-time? Такая информация могла бы пригодится, если моя компонента имеет ссылки на другие компоненты (например, как в связке TDateSource,TTable и др.)

Для получения такой информации предназначен метод

procedure Notification (AComponent: TComponent; Operation: TOperation); virtual;

класса TComponent. Перекрыв его в своей компоненты Вы можете произвести необходимые действия, в зависимости от значения параметра Operation типа

TOperation = (opInsert, opRemove);

объявленного в модуле Classes. Параметр AComponent — компонента, соответственно вставлемая или удаляемая, в зависимости от Operation.

Создание отчета в MS Word

(Пример для Delphi 1.0 поскольку в Delphi 2-3 лучше использовать:

var MsWord : variant;

Для Delphi 3, пример ниже)

Создавать отчет в программе Word удобно если отчет имеет сложную структуру (тогда его быстрее создать в Word, чем в Qreport от Delphi, кроме того, этот QReport имеет «глюки»), либо, если после создания отчета его нужно будет изменять. Итак, первым делом в Word создается шаблон будущего отчета, это самый обыкновенный не заполненный отчет. А в места куда будет записываться информация нужно поставить метки. Например (для наглядности метки показаны синим цветом, реально они конечно не видны):

Поставщик Наименование товара Код товара Кол-во Цена Сумма Table ? ? ? ? ? ?

Далее в форму, откуда будут выводиться данные, вставляете компоненту DdeClientConv из палитры System. Назовем ее DDE1. Эта компонента позволяет передавать информацию между программами методом DDE. Свойства:

ConnectMode : ddeManual — связь устанавливаем вручную

DdeService : (winword) — с кем устанавливается связь

Читать онлайн «Виртуальная библиотека Delphi» — RuLit — Страница 17

wm_NextShow_Event = wm_User + 133;

wm_PrevShow_Event = wm_User + 134;

HookHandle: hHook = 0;

function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint; export;

<если Code>=0, то ловушка может обработать событие>

if Code >= 0 then

if ((wParam = VK_ADD)or(wParam = VK_SUBTRACT)) and

(lParam and $40000000 = 0)

H := FindWindow(‘TForm1’, ‘XXX’);

if wParam = VK_ADD then

SendMessage(H, wm_NextShow_Event, 0, 0)

SendMessage(H, wm_PrevShow_Event, 0, 0);


Result := CallNextHookEx(HookHandle,Code, wParam, lParam);

procedure LocalExitProc; far;

if HookHandle<>0 then

HookHandle := SetWindowsHookEx(wh_Keyboard, Key_Hook,

if HookHandle = 0 then

MessageBox(0, ‘Unable to set hook!’, ‘Error’, mb_Ok)

Размер такой DLL в скомпилированном виде будет около 3Кб, поскольку в ней не используются объекты из VCL.

Далее приведен код модуля в Delphi, который загружает DLL и обрабатывает сообщения от ловушки, просто отображая их в Label1.

wm_NextShow_Event = wm_User + 133;

wm_PrevShow_Event = wm_User + 134;

procedure FormCreate(Sender: TObject);

procedure WM_NextMSG (Var M : TMessage); message wm_NextShow_Event;

procedure WM_PrevMSG (Var M : TMessage); message wm_PrevShow_Event;

function Key_Hook : Longint; far; external ‘SendKey’;

procedure TForm1.WM_NextMSG (Var M : TMessage);

procedure TForm1.WM_PrevMSG (Var M : TMessage);

procedure TForm1.FormCreate(Sender: TObject);

то компилятор удалит загрузку DLL из программы>

Конечно, свойство Caption в этой форме должно быть установлено в «XXX».

Ставите у формы KeyPreview = true и создаете событие KeyPress следующего вида:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

if (Key = #13) then begin

Каким образом можно отследить вставку и удаление компонент в форму в design-time? Такая информация могла бы пригодится, если моя компонента имеет ссылки на другие компоненты (например, как в связке TDateSource,TTable и др.)

Для получения такой информации предназначен метод

procedure Notification (AComponent: TComponent; Operation: TOperation); virtual;

класса TComponent. Перекрыв его в своей компоненты Вы можете произвести необходимые действия, в зависимости от значения параметра Operation типа

TOperation = (opInsert, opRemove);

объявленного в модуле Classes. Параметр AComponent — компонента, соответственно вставлемая или удаляемая, в зависимости от Operation.

(Пример для Delphi 1.0 поскольку в Delphi 2-3 лучше использовать:

var MsWord : variant;

Для Delphi 3, пример ниже)

Создавать отчет в программе Word удобно если отчет имеет сложную структуру (тогда его быстрее создать в Word, чем в Qreport от Delphi, кроме того, этот QReport имеет «глюки»), либо, если после создания отчета его нужно будет изменять. Итак, первым делом в Word создается шаблон будущего отчета, это самый обыкновенный не заполненный отчет. А в места куда будет записываться информация нужно поставить метки. Например (для наглядности метки показаны синим цветом, реально они конечно не видны):

Faq вставка и удаление компонент в форму в design time


Доброго времени суток, уважаемые подписчики!

Сегодня будут рассмотрены остальные основные компоненты ODAC.

А для начала — интересная новость от IBM:

IBM выпустила бесплатную версию DB2
IBM начала предлагать бесплатную версию СУБД DB2 — DB2 Universal Database Express-C, которую можно использовать не более чем на двух двухпроцессорных серверах, имеющих до 4 Гбайт памяти. Продукт доступен в вариантах для Linux и Windows. Отличием от аналогичных предложений основных конкурентов IBM является отсутствие ограничений на количество одновременно подключенных к СУБД пользователей и на размер баз. Однако в DB2 Express-C отсутствуют некоторые из функций платной DB2 Express, включая модуль DB2 Warehouse Manager, механизм тиражирования источников данных формата Informix и адаптеры обмена данными DB2 Connect. Лицензия разрешает использовать Express-C для нужд предприятия и использовать в составе коммерческих программных продуктов. Продукт можно загрузить по этому адресу. До IBM бесплатные варианты своих СУБД также выпустили Oracle и Microsoft.

Илон Маск рекомендует:  Что такое код swfmovie &#62;add

Если после выходных Вам лень работать, то ждем Вас на форуме, где можно малость отвлечься от работы и поболтать на отвлеченные темы:

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

Голосование и обсуждение.
К сожалению, наблюдается тенденция, что для повышения зп и своего статуса приходится менять работу.
А для многих это стало способом быстрого увеличения зп и они буквально скачут с места на место.
Как часто меняете работу Вы ? С чем это связано и как по Вашему должно быть?

Обсудить

Собственно хочу узнать какую пользу природа хотела получить и что она получила в итоге, создав человечество на этом земном шаре? Высказывайте свои предположения!
Обсудить

В начале сегодняшнего выпуска хотелось бы остановится на объектах-полях. Объекты-поля не являются «собственностью» ODAC, а уже заложены в механизм доступа к БД TDataSet.

При выполнении запроса датасет автоматически создает в памяти поля-объекты и именно к ним происходит обращение при помоши FieldByName/Fields. Однако такие поля-объекты можно создавать самим, что дает определенные преимущества, например, можно настраивать формат отображения, заголовок поля, а также обращаться к значению поля как к обычному компоненту. Также можно создавать лукап-поля и калк-поля. Рассмотрим все перечисленные возможности.

Создать объекты-поля очень легко — для этого нужно вызвать редактор Fields Editor (одноименный пункт в контекстном меню датасета или редактор свойства Fields). В появившемся пустом списке
из контекстного меню нужно выбрать один из трех вариантов:

  • Add fields. — добавить одно или несколько плей (из предложенных в списке)
  • New field. — создать новое поле (тут можно создать калк- или лукап-поле)
  • Add all fields. — добавить все поля.

Внимание! обратите внимание, что если Ваш запрос выбирает скажем 10 полей, а Вы создали 4 объекта-поля, то и обращаться в коде будет возможно только к этим четерем полям. При попытке обратится к другим полям будет выдана ошибка, мол поле не найдено.

Чтобы не лить много воды (хоть я и Водолей :) ) рассмотрим создание полей на конкретном примере. Создаем новый проект, настраиваем подключение к Ораклу (TOraSession, см 7 выпуск), в TOraQuery пишем следующий запрос select owner, object_name, object_type, status from all_objects. Теперь открываем редактор полей и вызываем команду Add all fields. У вас должно получится так:

Свойства подробно расписаны в справочной системе и я останавливаться на них не буду, замечу, что назначение свойств понятно из названия. Обратите просто внимание на такие свойства, как DisplayFormat, DisplayLabel, ReadOnly, Required. Остановлюсь только на событии OnGetText. Это событие позволяет произвольно изменять визуальное содержимое поля. Например, если в поле Вы храните пол человека в виде M/F, то в этом событии можно сделать виртуальную подстановку на Муж/Жен:

Если такие поля будут редактируемыми, то нужно также написать обработчик OnSetText, где выполнить обратные преобразования.

Теперь для доступа к полям можно написать OraQuery1STATUS.Value, хотя OraQuery1.FieldByName(‘status’).asString никто не отменял :)

Очень часто Вы будите создавать калк- и лукап-поля. Для примера создадим калк-поле. Для этого выберем команду New field. В появившемся окне вводим имя поля, тип, и выбираем вид поля — Calculated:

Так как поле вычисляемое на стороне клиента, то Вы сами должны позаботится о его значении. Для этого у TDataSet есть событие onCalcFields:

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

Рассмотрим создание лукап-поля. Лукап-поля используются для подстановки значения указанного поля из другой таблицы вместо поля текущего запроса (организация связи основной запрос — справочники). Давайте в нашем примере добавим новое поле, которое будет показывать код владельца объекта базы. (Хотя это лучше сделать одним запросом). Для этого добавим еще один компонент TOraQuery и припишем там запрос select * from all_users. У OraQuery1 создаем новое поле:

Результат виден моментально.

Теперь вернемся к рассмотрению компонентов ODAC.

OraQuery может также выполнять хранимые процедуры/функции, а также анонимные блоки PL/SQL. Вот рабочий пример вызова хранимой функции:

Хотя здесь и используется компонент OraSession вместо OraQuery, но в этом нет ничего страшного, можно смело использовать OraQuery.

Компонент TSmartQuery

В прошлом выпуске мы научились создавать «живые» запросы (это такие запросы, которые поддерживают модификацию данных). Для этого нужно было заполнить соответствующими командами свойства SQLInsert/SQLUpdate/SQLDelete. Это все хорошо, если бы не было столь утомительным :) (даже с учетом того, что редактор помогает сгенерировать эти команды). SmartQuery расширяет возможности OraQuery и самостоятельно во время генерирует нужные команды модификации. Достаточно только заполнить свойства SQL, KeySequence, KeyFields — все остальное сделает компонент. В конце выпуска будет приведен рабочий пример.

SmartQuery поддерживает очень интересную возможность SmartRefresh (см. одноименное свойство). Суть этой техники состоит в следующем. Как вы наверное заметили при многопользовательской работе, если один клиент внес какие-либо изменения в таблицу, то все другие клиенты для отображения изменений должны переоткрыть нужные запросы. Это справедливо для всех СУБД и всех библиотек доступа к СУБД. Но ODAC и тут на высоте. Благодаря встроенному пакету Оракла dbms_pipe ODAC может давать сигналы другим клиентам, что были внесены изменения в данные и их нужно перечитать. Чтобы посмотреть SmartRefresh в действии, создайте новый проект, «натравите» TSmartQuery на какую-либо табличку (примерный запрос select t.*, t.rowid from mytable), включите SmartRefresh и подключите SmartQuery к гриду. Запустите программу несколько раз (или на разных компах) и внесите изменения на одном клиенте. Посмотрите, как ведут себя другие клиенты.

Компонент TOraSQL

Этот компонент аналогичен TOraQuery за небольшим исключением. Он предназначен для выполнения любой команды/процедуры/анонимного блока PL/SQL, кроме команды select. В результате этого этот компонент меньше весит и меньше расходует память.

Компонент TOraTable

Предназначен для работы с одной таблицей без написания какого-то бы ни было sql-кода, просто указываете имя таблицы. Является наследником TSmartQuery.

Компонент TOraStoredProc

Предназначен для выполнения хранимых процедур/функций без написания какого-то бы ни было sql-кода, просто укажите имя процедуры/функции. Приведенный выше sql-код в функции IsUniqueRNN я получил именно с помощью этого компонента.


Компонент TOraScript

Этот компонент предназначен для выполнения последовательности команд. Вы можете сказать, что последовательность команд можно оформить в виде PL/SQL кода и выполнить через другие компоненты, но в PL/SQL коде нельзя указывать команды DDL. Вот тут и приходит на помощь TOraScript. Каждая команда должна быть отделена от других символом ; или /, причем / должен начинаться с новой строки и любой блок PL/SQL должен заканчиваться символом /.

Компонент TOraPackage

Предназначен для инкапсуляции работы с пакетами. Хочу заметить, что с пакетами можно работать с помощью анонимного блока PL/SQL, а следовательно с помощью компонент TOraQuery, TOraSmartQuery, TOraSQL.

Компонент TOraLoader

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

  • триггеры не поддерживаются
  • проверочные ограничения не поддерживаются
  • ограничения справочной целостности не поддерживаются
  • кластерные таблицы не поддерживаются
  • пользовательские типы данных не поддерживаются

Для использования загрузчика Оракла нужно выполнить следующие шаги:

  1. указать имя таблицы в свойстве TableName
  2. настроить поля, в которые будут загружаться данные (свойство Columns)
  3. написать обработчик события OnGetColumnData или OnPutData
  4. вызвать метод Load для начала загрузки данных

Ниже приведены примеры обработчиков OnGetColumnData и OnPutData Где строка EOF := True; сигнализирует о том, что достигнут конец данных.

Компонент TOraErrorHandler

Этот компонент позволяет транслировать сообщения Oracle в понятные для пользователя сообщения. Трансляция текста ошибки проходит или в событии OnError или с помощью специальной таблицы, которую можно создать и редактировать в design-time с помощью самого компонента (дважды кликните на компоненте). Например, таблица может содержать такие данные:

Обработчик OnError может быть примерно таким:

Тут все должно быть понятно, кроме разве конструкции

Если у поля установлен флаг Required, то поле обязательно должно иметь какое-либо значение. Если поле не будет содержать никакого значения (скажем пользователь не ввел его) то датасет перед отправкой данных на сервер выполнит проверку на наличие значения, и если поле не содержит значение, то будет выведено стандартное сообщение на английском языке (Field . must have a value), что обычному пользователю не совсем понятно. Хочу обратить Ваше внимание, что эту ошибку генерирует не Оракл. А так как TOraErrorHandler обрабатывает все ошибки, а не только ошибки Оракла, то введя для отображаемого имени поля (TField.DisplayLabel) специальные маркеры, можно написать единый централизованный обработчик для таких ошибок, причем для каждого поля можно сделать свой текст ошибок.

Илон Маск рекомендует:  Select операторы сравнения, логические и специальные

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

Для начала была создана следующуя стуктура таблиц:

Несколько замечаний по структуре:
1. На таблицу periods_tab не выданы гранты на изменение, так как нет абсолютно никакого смысла изменять период.
2. На таблицу PLAN_CITY_TAB не были выданы гранты на вставку и удаление, так как вставка и удаление происходит автоматически — добавление городов в триггере trg_periods_ai, а удаление — ограничением справочной целостности FK_PLAN_CITY_PERIOD.
3. В триггерах trg_plan_city_bi и trg_periods_bi сначала проверяется, установлено ли значение первичного ключа и если нет, то генерируется.
4. Значение месяца должно быть в интервале 1..12 (проверка CHK_PERIODS_MONTH)
Таким образом, вся бизнес-логика была реализована на стороне сервера. Клиент будет реализовывать только интерфейс пользователя (ввод и редактирование первичных данных).

В качестве интерфейса были взяты два DBGridEh (библиотека EhLib). В первом гриде будут отображаться плановые периоды, а во втором — планы по городам за выбранный период (классическая связь master/detail)
Настройки первого грида:

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

Настройки второго грида:

Обратите внимание, что грид будет поддерживать только операции редактирования (наши юзеры каким-то образом умудрились добавить вручную города в таблицу plan_city_tab, хотя на уровне самой таблицы у них не было прав, как им это удалось — уму непостижимо :)). Название колонок грид берет у соответствующего датасета (а точнее у его полей-объектов), в то время как у первого грида заголовки колонок были заданы явно.

Настала очередь датасетов. С первым гридом ассоциирован датасет:

Тут должно быть все понятно (если внимательно читали прошлые выпуски). Единственно хочу сказать, что сразу перевожу датасет в режим ReadOnly, чтобы пользователи бесконтрольно не стали вводить периоды.

Второй датасет (ассоциирован со втором гридом):

В этом датасете было создано лукап-поле для отображения названия города по его коду.

Осталась самая малость — при открытии формы открыть датасеты:
qPeriods.Open;
qPlanCity.Open;
и сделать три кнопочки:
* добавить период
* удалить период
* сохранить изменения
вот их обработчики:

Ну и еще несколько обработчиков для управления кнопками

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

Вы не забыли, что мы ждем Вас на форуме Чертенок.ру?

Приглашаем авторов в рассылку!

С уважением,
координатор рассылки Алексей aka Gelios.


Как я могу удалить компонент в дизайнере форм?

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

Теперь я могу понять, как это может быть полезной функцией, если это отдельный элемент управления, но он является частью совокупного компонента и поэтому должен подчиняться правилам управления родителями, а не дизайнерам форм. Есть ли способ убедиться, что элемент управления исчезнет, ​​когда я установил .Visible := false; , даже если он находится в конструкторе форм?

Faq вставка и удаление компонент в форму в design time

Обязательно выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом .

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.

Faq вставка и удаление компонент в форму в design time

У Вас форма является владельцем объектов D8CustomPanel1/D8CustomPanel2. Поэтому эти компоненты тоже пишутся в .dfm. Чтобы их считать нужен класс, а он не зарегистрирован.

Это причина ошибки. Но это не все.

Можно, конечно зарегистрировать класс. Он будет читаться. Но догда в Design time можно будет легко удалить любую из панелей, которые вроде-бы объявлены private. Еще будут проблемы с лишними вызовами Create, но не буду углубляться.

Можно сделать по другому. Убрать владение и удалять панели самому.

Но в этом случае в Design-Time с панелями ничего нельзя будет сделать (например переместить).

А вообще то, что Вы пытаетесь сделать не простая задача. Посмотрите VCL — как со своими страницами управляется TPageControl. Я бы не стал морочить голову, а создал этот компонент в run-time.

——————
Еще вариант. Обрабатывать момент вставки/удаления компонента TD8Skn на форму (в design-time) и там создавать/удалять панели TD8CustomPanel. Там же можно будет запомнить ссылки на них и работать с этими ссылками. TD8CustomPanel придется тоже сделать компонентом и зарегистрировать.

Faq вставка и удаление компонент в форму в design time

Создаю компонент — наследник TPanel. В коде при создании панели — создаю на ней Image.

Код: Выделить всё constructor TMyPanelForm.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
FImage := TImage.Create(Self);
Include(FImage.ComponentStyle, csSubComponent);
FImage.Parent := self;
FImage.Picture.LoadFromFile(‘D:\1.jpg’);
FImage.Align:= alClient;
end;

Вопрос: как сделать так, что бы в design time все действия производимые с Image (щелчок мыши, изменение размера и т.д.) переадресовывались панели. Т.е. если щёлкнуть по Image, то выделялся бы не Image для редактирования его свойств, а мой компонент на основе панели. Если подвести мышь к краю Image то что бы активировалось изменение размера не Image, а моего компонента на основе панели.

Re: Создание компонента и его свойства в design time

Re: Создание компонента и его свойства в design time

Re: Создание компонента и его свойства в design time

Добавлено спустя 4 часа 16 минут 2 секунды:
Не дословный перевод свойств ControlStyle:

csAcceptsControls может иметь потомков в конструкторе
csCaptureMouse, захват мыши
csDesignInteractive может обрабатывать событий в режиме дизайна
csClickEvents обработка событий нажатия
csFramed фрейм
csSetCaption установка заголовка
csOpaque непрозрачный
csDoubleClicks обработка двойного нажатия мыши
csTripleClicks обработка тройного нажатия мыши
csQuadClicks обработка четырёхкаратного нажатия мыши
csFixedWidth фиксированая ширина
csFixedHeight фиксированая ширина
csNoDesignVisible неотображать в режиме дизайна
csReplicatable репликация таблицы
csNoStdEvents не имеет стандартных событий
csDisplayDragImage отображать изиображения из DragImageList при произведении операции Drag (перетаскивание)
csReflector отражения
csActionClient действия клиента
csMenuEvents меню событий
csNoFocus нет фокуса
csNeedsBorderPaint не реализованна (потребностей пограничной Paint)
csParentBackground не реализованна (Родители История)
csDesignNoSmoothResize не WYSIWYG изменение размера в режиме дизайна
csDesignFixedBounds компонент не может быть перемещён или изменен в режиме дизайна
csHasDefaultAction действий по умолчанию для компонента
csHasCancelAction отмена всех действий над компонентом
csNoDesignSelectable компонент неможет быть выбран в режиме дизайна
csOwnedChildsSelectable контроль дочерних компонентов в режиме дизайна

Поправьте если, что не так перевёл. если интерестно.

VisualStudio настроить операцию вставки для моего компонента во время разработки

Я создал компонент WinForm и хочу заменить некоторые свойства моего компонента при копировании разработчиком, а затем вставить (не когда копирую, а когда вставить) компонент из буфера обмена во время разработки.

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

Мне нужно заменить некоторые свойства на операции вставки в зависимости от выбранного компонента.

Это очень похоже на стандартную операцию копирования/вставки с компонентом Control. Когда дизайнер меняет Parent компонента, если разработчик выбирает другой контейнер (например, Panel) перед Paste Control.

Я думаю, что код для его выполнения должен быть где-то в моем классе ComponentDesigner. Я исследовал методы ComponentDesigner, но не могу найти какие-либо методы, которые управляют операциями с буфером обмена.

Вы можете переопределить метод OnParentChanged вашего компонента, который выполняется, когда компонент вставляется в форму. Затем проверьте свойство DesignMode чтобы убедиться, что вы находитесь в режиме разработки:

Когда компонент удаляется из панели инструментов, этот код не выполняется. (Я не могу объяснить почему, но это именно то, что нам нужно.)

Если вы получили свой компонент из System.ComponentModel.Component , вы можете переопределить свойство Site ; однако для этого потребуется дополнительная логика, чтобы проверить, вставлен ли компонент.

Но, вероятно, описание транзакции локализовано, потому что это текст, который вы видите в раскрывающемся Undo кнопки » Undo на панели инструментов Visual Studio после вставки компонента.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL