Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Управление TDBGrid во время выполнения





 

Объект DBGrid может быть полностью реконфигурирован во время выполнения программы. Вы можете прятать и показывать колонки, изменять порядок показа колонок и их ширину.

Вы можете использовать свойство Options объекта DBGrid, чтобы изменить ее представление. Свойство Options может принимать следующие возможные значения:

DgEditing Установлено по-умолчанию в true, позволяет пользователю редактировать grid. Вы можете также установить свойство ReadOnly grid в True или False.
DgTitles Будут ли видны названия колонок.
DgIndicator Будут ли видны небольшие иконки слева.
DgColumnResize Может ли пользователь менять размер колонки.
DgColLines Показывать ли линии между колонками.
DgRowLines Показывать ли линии между строками.
DgTabs Может ли пользователь использовать tab и shift-tab для переключения между колонками.

 

Как объявлено в этой структуре:

 

TDBGridOption = (dgEditing, gdAlwaysShowEditor, dgTitles,

dgIndicator, dgColumnResize, dgColLines,

dgRowLines, dgTabs);

 

Например, Вы можете установить опции в Runtime, написав такой код:

 

DBGrid1.Options:= [dgTitles, dgIndicator];

 

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

 

DBGrid1.Options:= DBGrid1.Options + [dgTitles];

 

Пусть есть переменная ShowTitles типа Boolean, тогда следующий код позволяют включать и выключать параметр одной кнопкой:

 

procedure TForm1.Button3Click(Sender: TObject);

begin

if ShowTitles then

DBGrid1.Options:= DBGrid1.Options + [dgTitles]

else

DBGrid1.Options:= DBGrid1.Options - [dgTitles];

ShowTitles:= not ShowTitles;

end;

 

Если Вы хотите скрыть поле в run-time, то можете установить свойство visible в false:

 

Query1.FieldByName(‘CustNo’).Visible:= False;

Query1CustNo.Visible:= False;

 

Обе строки кода выполняют идентичную задачу. Чтобы показать поле снова, установите “видимый” в true:

 

Query1.FieldByName(‘CustNo’).Visible:= True;

Query1CustNo.Visible:= True;

 

Если Вы хотите изменить положение колонки в Runtime, можете просто изменить индекс, (первое поле в записи имеет индекс нуль):

 

Query1.FieldByName(‘CustNo’).Index:= 1;

Query1CustNo.Index:= 2;

 

Нумерация полей начинается с нуля, так присвоение свойству Index 1 делает поле вторым в записи. Первое поле имеет Index 0.

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

Если Вы хотите изменить ширину колонки в Runtime, только измените свойство DisplayWidth соответствующего TField.

 

Query1.FieldByName(‘CustNo’).DisplayWidth:= 12;

Query1CustNo.DisplayWidth:= 12;

 

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

 

Основные понятия о запросах (queries) и транзакциях

 

Сокращение SQL означает Structured Query Language - Язык Структурированных Запросов, и обычно произноситься либо как "Sequel" либо " Ess Qu El”. SQL - это мощный язык БД, который легко доступен из Delphi, но который отличается от родного языка Delphi. Delphi может использовать утверждения SQL для просмотра таблиц, выполнять объединение таблиц, создавать отношения один-ко-многим, или исполнить почти любое действие, которое могут сделать ваши основные инструменты БД. Delphi поставляется с Local SQL, так что Вы можете выполнять запросы SQL при работе с локальными таблицами, без доступа к SQL серверу.

Delphi обеспечивает поддержку “pass through SQL”, это означает то, что Вы можете составлять предложения SQL и посылать их непосредственно серверам Oracle, Sybase, Inrterbase и другим. “Pass through SQL” - это мощный механизм по двум причинам:

1. Большинство серверов могут обрабатывать SQL запросы очень быстро, а это означает, что, используя SQL для удаленных данных, Вы получите ответ очень быстро.

2. Есть возможность составлять SQL запросы, которые заставят сервер исполнить специализированные задачи, недоступные через родной язык Delphi.

 

Основные понятия о TQuery

 

При использовании TTable, возможен доступ ко всему набору записей из одной таблицы. В отличие от TTable, TQuery позволяет произвольным образом (в рамках SQL) выбрать набор данных для работы с ним. Во многом, методика работы с объектом TQuery похожа на методику работы с TTable, однако есть свои особенности.

 

Вы может создать SQL запрос, используя компонент TQuery следующим способом:

1. Назначите Псевдоним (Alias) DatabaseName.

2. Используйте свойство SQL, чтобы ввести SQL запрос типа
“Select * from Country”.

3. Установите свойство Active в True

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

Delphi использует pass through SQL, поэтому для разных SQL серверов синтаксис может быть несколько разным. Версия SQL для локальных таблиц (Local SQL) очень сильно урезана, по сравнению со стандартом. Чтобы узнать о его возможностях, Вы должны прочитать не только эту статью, но также файл LOCALSQL.HLP.

Объект TQuery один из наиболее полезных и гибких компонентов, доступных в Delphi. С ним Вы сможете воспользоваться всей мощью, предоставляемой лидерами среди промышленных SQL серверов, вроде InrterBase, Oracle или Sybase.

 

 

Свойство SQL

 

Свойство SQL - вероятно, самая важная часть TQuery. Доступ к этому свойству происходит либо через Инспектор Объектов во время конструирования проекта (design time), или программно во время выполнения программы (run time).

Интересней, конечно, получить доступ к свойству SQL во время выполнения, чтобы динамически изменять запрос. Например, если требуется выполнить три SQL запроса, то не надо размещать три компонента TQuery на форме. Вместо этого можно разместить один и просто изменять свойство SQL три раза. Наиболее эффективный, простой и мощный способ - сделать это через параметризованные запросы, которые будут объяснены в следующей части. Однако, сначала исследуем основные особенности свойства SQL, а потом рассмотрим более сложные темы, типа запросов с параметрами.

Свойство SQL имеет тип TStrings, который означает что это ряд строк, сохраняемых в списке. Список действует также, как и массив, но, фактически, это специальный класс с собственными уникальными возможностями. В следующих нескольких абзацах будут рассмотрены наиболее часто используемые свойства.

При программном использовании TQuery, рекомендуется сначала закрыть текущий запрос и очистить список строк в свойстве SQL:

 

Query1.Close;

Query1.SQL.Clear;

 

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

Следующий шаг - добавление новых строк в запрос:

 

Query1.SQL.Add(‘Select * from Country’);

Query1.SQL.Add(‘where Name = ’’Argentina’’’);

 

Метод Add используется для добавления одной или нескольких строк к запросу SQL. Общий объем ограничен только количеством памяти на вашей машине.

Чтобы Delphi отработал запрос и возвратил курсор, содержащий результат в виде таблицы, можно вызвать метод:

 

Query1.Open;

 

Демонстрационная программа THREESQL показывает этот процесс (см. Рис.1)

 

Рис.1: Программа THREESQL показывает, как сделать несколько запросов с помощью единственного объекта TQuery.

 

Программа THREESQL использует особенность локального SQL, которая позволяет использовать шаблоны поиска без учета регистра (case insensitive). Например, следующий SQL запрос:

 

Select * form Country where Name like ’C%’

 

возвращает DataSet, содержащий все записи, где поле Name начинается с буквы ‘C’. Следующий запрос позволит увидеть все страны, в названии которых встречается буква ‘C’:

 

Select * from Country where Name like ‘%C%’;

 

Вот запрос, которое находит все страны, название которых заканчивается на ‘ia’:

 

Select * from Country where Name like ‘%ia’;

 

Одна из полезных особенностей свойства SQL - это способность читать файлы, содержащие текст запроса непосредственно с диска. Эта особенность показана в программе THREESQL.

Вот как это работает. В директории с примерами к данному уроку есть файл с расширением SQL. Он содержат текст SQL запроса. Программа THREESQL имеет кнопку с названием Load, которая позволяет Вам выбрать один из этих файлов и выполнять SQL запрос, сохраненный в этом файле.

Кнопка Load имеет следующий метод для события OnClick:

 

procedure TForm1.LoadClick(Sender: TObject);

begin

if OpenDialog1.Execute then

with Query1 do begin

Close;

SQL.LoadFromFile(OpenDialog1.FileName);

Open;

end;

end;

 

Метод LoadClick сначала загружает компоненту OpenDialog и позволяет пользователю выбрать файл с расширением SQL. Если файл выбран, текущий запрос закрывается, выбраный файл загружается с диска в св-во SQL, запрос выполняется и результат показывается пользователю.

 

 

TQuery и Параметры

 

Delphi позволяет составить “гибкую” форму запроса, называемую параметризованным запросом. Такие запросы позволяют подставить значение переменной вместо отдельных слов в выражениях “where” или “insert”. Эта переменная может быть изменена практически в любое время. (Если используется локальный SQL, то можно сделать замену почти любого слова в утверждении SQL, но при этом та же самая возможность не поддерживается большинством серверов.)

Перед тем, как начать использовать параметризованные запросы, рассмотрим снова одно из простых вышеупомянутых предложений SQL:

 

Select * from Country where Name like ’C%’

 

Можно превратить это утверждение в параметризованный запрос, заменив правую часть переменной NameStr:

 

select * from County where Name like:NameStr

 

В этом предложении SQL, NameStr не является предопределенной константой и может изменяться либо во время дизайна, либо во время выполнения. SQL parser (программа, которая разбирает текст запроса) понимает, что он имеет дело с параметром, а не константой потому, что параметру предшествует двоеточие ":NameStr". Это двоеточие сообщает Delphi о необходимости заменить переменную NameStr некоторой величиной, которая будет известна позже.

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

Есть два пути присвоить значение переменной в параметризованном запросе SQL. Один способ состоит в том, чтобы использовать свойство Params объекта TQuery. Второй - использовать свойство DataSource для получения информации из другого DataSet. Вот ключевые свойства для достижения этих целей:

 

property Params[Index: Word];

function ParamByName(const Value: string);

property DataSource;

 

Если подставлять значение параметра в параметризованный запрос через свойство Params, то обычно нужно сделать четыре шага:

1. Закрыть TQuery

2. Подготовить объект TQuery, вызвав метод Prepare

3. Присвоить необходимые значения свойству Params

4. Открыть TQuery

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

Вот фрагмент кода, показывающий, как это может быть выполнено практически:

 

Query1.Close;

Query1.Prepare;

Query1.Params[0].AsString:= ‘Argentina’;

Query1.Open;

 

Этот код может показаться немного таинственным. Чтобы понять его, требуется внимательный построчный анализ. Проще всего начать с третьей строки, так как свойство Params является “сердцем” этого процесса.

Params - это индексированное свойство, которое имеет синтаксис как у свойства Fields для TDataSet. Например, можно получить доступ к первой переменной в SQL запросе, адресуя нулевой элемент в массиве Params:

 

Params[0].AsString:= ‘”Argentina”’;

 

Если параметризованный SQL запрос выглядит так:

 

select * from Country where Name =:NameStr

 

то конечный результат (т.е. то, что выполнится на самом деле) - это следующее предложение SQL:

 

select * from Country where Name = “Argentina”

 

Все, что произошло, это переменной:NameStr было присвоено значение "Аргентина" через свойство Params. Таким образом, Вы закончили построение простого утверждения SQL.

 

Если в запросе содержится более одного параметра, то доступаться к ним можно изменяя индекс у свойства Params

 

Params[1].AsString:= ‘SomeValue’;

 

либо используя доступ по имени параметра

 

ParamByName(‘NameStr’).AsString:=’”Argentina”’;

 

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

Прежде, чем использовать переменную Params, сначала можно вызвать Prepare. Этот вызов заставляет Delphi разобрать ваш SQL запрос и подготовить свойство Params так, чтобы оно "было готово принять” соответствующее количество переменных. Можно присвоить значение переменной Params без предварительного вызова Prepare, но это будет работать несколько медленнее.

После того, как Вы вызывали Prepare, и после того, как присвоили необходимые значения переменной Params, Вы должны вызвать Open, чтобы закончить привязку переменных и получить желаемый DataSet. В нашем случае, DataSet должен включать записи, где в поле “Name” стоит “Argentina”.

Рассмотрим работу с параметрами на примере (программа PARAMS.DPR). Для создания программы, разместите на форме компоненты TQuery, TDataSource, TDBGrid и TTabSet. Соедините компоненты и установите в свойстве TQuery.DatabaseName псевдоним DBDEMOS. См. рис.2

 

Рис.2: Программа PARAMS во время дизайна.

 

В обработчике события для формы OnCreate напишем код, заполняющий закладки для TTabSet, кроме того, здесь подготавливается запрос:

 

procedure TForm1.FormCreate(Sender: TObject);

var

i: Byte;

begin

Query1.Prepare;

for i:=0 to 25 do

TabSet1.Tabs.Add(Chr(Byte('A')+i));

end;

 

Текст SQL запроса в компоненте Query1:

 

select * from employee where LastName like:LastNameStr

 

Запрос выбирает записи из таблицы EMPLOYEE, в которых поле LastName похоже (like) на значение параметра:LastNameStr. Параметр будет передаваться в момент переключения закладок:

 

procedure TForm1.TabSet1Change(Sender: TObject;

NewTab: Integer;

var AllowChange: Boolean);

begin

with Query1 do begin

Close;

Params[0].AsString:=

'"'+TabSet1.Tabs.Strings[NewTab]+'%"';

Open;

end;

end;

 

Рис.3: Программа PARAMS во время выполнения.

 

 







ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования...

Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор...

Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычис­лить, когда этот...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.