Circular datalinks are not allowed delphi - IT Справочник
Llscompany.ru

IT Справочник
53 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Circular datalinks are not allowed delphi

Circular datalinks are not allowed delphi

Выдает при изменении ширины поля в сетке (runtime).

Если сетку заново сделать — бесполезно.
ADODataSet новый сделать внутри DataModule — то же самое.
ADODataSet новый сделать на той же форме где и сетка — все работает хорошо.

2 часа разбираюсь не могу понять почему так?


LA33 ( 2007-04-04 22:25 ) [1]

У сети какая ячея?


LA33 ( 2007-04-04 22:25 ) [2]

Интерисует размер, подозреваю, что сороковка.


Kostafey © ( 2007-04-04 22:29 ) [3]

Ячейки разные. В среднем около 20.


LA33 ( 2007-04-04 22:34 ) [4]

Kostafey © (04.04.07 22:29) [3]

У рыбнадзора справки все взял? А то там в разные периоды, разные проблемы могут быть.


Kostafey © ( 2007-04-04 22:34 ) [5]

Вообще история болезни такая.
Сначала понаделал для сетки колонок с привязками к полям датасета.
(это для того, чтобы задать DisplayLabel и DisplayWidth)
Потом думаю, зачем ерундой заниматься. Сделал у датасета TXXXFields
для всех полей таблицы. И в инх уже и задавал DisplayLabel и DisplayWidth.
А в сетке все колонки удалил.
Вот с тех пор и пошли такие ошибки как пытаешься иземнить ширину колонки.

Я даже не поленился все то же самое в том же порядке проделать для пустого проекта
с нуля — не возникает такой ошибки.


Kostafey © ( 2007-04-04 22:37 ) [6]

Добавляю в сетку колонки — ошибка исчезает.
Правда мне это колонки нужны сейчас как летом валенки.

Вот еще что смешно: делаю в в этом же основном проекте новую форму
на ней сетку. Сеткой подключаюсь к дому же датасету — та же самя ошибка
WTF!


LA33 ( 2007-04-04 22:38 ) [7]


Kostafey © ( 2007-04-04 22:38 ) [8]

> [2] LA33 (04.04.07 22:25)

Ну что вы с сеткой возитесь.
Удочкой слабо чтоль?


LA33 ( 2007-04-04 22:41 ) [9]

Что за сетка? какие колонки? какая рыба? какая музыка?
Вы сами себе на уме (видимо творческий захлеб). Ну хоть, какой компонент эта сетка, скажите :)))


Kostafey © ( 2007-04-04 22:47 ) [10]

> [9] LA33 (04.04.07 22:41)

:))))))))))))))))))))
Мде есть маленько с 11 часов за компом.

Сетка это TDBGrid.
Колонки это TColumn.


LA33 ( 2007-04-04 22:53 ) [11]

Kostafey © (04.04.07 22:47) [10]
> [9] LA33 (04.04.07 22:41)
:))))))))))))))))))))
Мде есть маленько с 11 часов за компом.
Сетка это TDBGrid.
Колонки это TColumn.

Я с 1-часа ночи, сегодня, релиз выпускали, часов в 21 выпустили, пивко попиваем. Про TDBGrid ничего не скажу, т.к. использую DevExpress`овские компоненты.

А вот про сеть не сдержался :))

PS: я не оффтопил(offtop), я упал(up).
🙂


Kostafey © ( 2007-04-04 22:56 ) [12]

Не я просто что думаю.
Где корень всех зол зарыт ?
В DataModule. Не иначе.


Kostafey © ( 2007-04-04 22:59 ) [13]

Ладно. Пойду модуль данных убивать.


Johnmen © ( 2007-04-04 23:18 ) [14]


> Где корень всех зол зарыт ?

Как обычно, в 17 строке.
Ибо образовалась закольцованная ссылка в компоненте набора данных.


Kostafey © ( 2007-04-04 23:28 ) [15]

> Как обычно, в 17 строке.

просто интересно, а от куда это пошло про 17-ю строку


> Ибо образовалась закольцованная ссылка в компоненте набора
> данных.

Нет там никакой закольцованности.
В наборе данных простая таблица.
Сделал модуль данных с нуля (не весь, а только необходимую его часть).
Поднял из архива ту версию формы, где я еще колонки не добавлял.
Компилирую — та же самая ошибка .

Так и придется оставлять эти самые чертовы колонки.


Johnmen © ( 2007-04-04 23:53 ) [16]


> Нет там никакой закольцованности.

Есть. О чём и говорит Circular datalinks are not allowed.
Т.е. один НД ссылается на второй, а второй на первый.
Или одно поле ссылается на другое в том же НД.


Kostafey © ( 2007-04-05 01:18 ) [17]

> [16] Johnmen © (04.04.07 23:53)

Говорю ведь. Удалил я модуль данных. Вообще удалил.
Новый сделал.
Кинул на него набор данных (ADODataSet) тот из которого указанная сетка данные берет.
Набор данных — суть таблица. Даже Lookup-полей нет. Просто 1 таблица из БД.
С ним DataSource связал, его с сеткой.

Результат тот же.
Если размеры колонок в сетке начать мышкой двигать — ошибка вылетает.

Делаю тот же самый датасет, но уже в самой форме с сеткой — все ОК!

Логики в этой ошибке я вообще никакой не вижу.


Kostafey © ( 2007-04-05 01:44 ) [18]

Вот еще одну интересную вешь заметил.
Если удалить из проекта один из модулей с формой (не удалить файл, а просто исключить из проекта),
то ошибка исчезает.
Подключаю снова — ошибка возвращается.

Этот модуть содержит DBEdit подключенный к LookUp-полю другого датасета, который берет данные в том числе
и из того DataSourse, из которого берет данные сетка, в которой возникает ошибка.

Но если удалить это LookUp-поле, DBEdit формы, то ничего не изменится. Ошибка остается.

Но опять никакой логики. Нет никакого кругового подключения. Просто один НД берет данные из другого и все.


Kostafey © ( 2007-04-05 02:06 ) [19]


СОХРАНЯЙТЕ В ОРЕШНИКЕ, ГДЕ ХОТИТЕ ЭТО ПРОСТО ЧУДО.

Суть вот в чем. В совершенно другой форме (не в той в которой происходила ошибка)
я кинул компонентик TLookupComboBox, начал настраивать, да и бросил, недоделав, не в нем
суть задачи. Оказывается в нем я по ошибке ListSource и DataSource настроил на один
и тот же DataSource! И именно на этот DataSource ссылалась и та сетка, в которой
происходила причина моей бессоницы.

Вроде глупость, а потерял уйму времени.

Да, и все же почему именно на 17-й строчке ? ;)))


Desdechado © ( 2007-04-05 11:48 ) [20]

> в нем я по ошибке ListSource и DataSource настроил на один и тот же DataSource!
О чем тебе в ошибке и сообщалось.

> почему именно на 17-й строчке ?
unit Unit1;

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

var
Form1: TForm1; // вот она, 17-я, здесь начинается код!

Поиск в Базе Данных (.db) на Delphi

Привет!
У меня такой вопрос!
У меня курсовая Телефонный справочник и я сделал таблицу Table 1.db где заголовки Фамилия Имя Адрес и Телефон. В Administrator BDE сделал базу данных «Телефонный справочник». Сделал кнопку «Поиск» !
А теперь вопрос а как сделать поиск по моей базе, я уже искал много где примеров, но не получается! Вот текст моей программы(если он поможет):

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, ExtCtrls, DBCtrls, StdCtrls, Buttons,
MPlayer, Menus, ActnList, QRPrntr;

type
TForm1 = class(TForm)

Table1: TTable;
Query1: TQuery;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Button1: TButton;
procedure Button1Click(Sender: TObject);

Читать еще:  Css выделение текста цветом

var
Form1: TForm1;

procedure TForm1.Button1Click(Sender: TObject);
var
fam:string[50];
begin
fam:=InputBox(‘Поиск’,’Введите фамилию для поиска и нажмите ОК’,»);

if fam <> » then
begin
with Form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add(‘SELECT Фамилия, Имя, Адрес’);
SQL.Add(‘FROM «:Телефонный справочник:Table 1.db»‘);
SQL.Add(‘WHERE’);
SQL.Add(‘(Фамилия = «‘+ fam + ‘»)’);
SQL.Add(‘ORDER BY Имя, Фамилия’);
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage(‘Нет записей.’);
DataSource1.DataSet:=Table1;
end;

Я попробывал сделать с помощью SQL :
В свойствах Query:
DataBaseName: Телефонный справочник
DataSource: DataSource1
Name: Query1
Active: False

Когда Active ставлю True выдает ошибку: Query1: No SQL statement available.

А если оставить False, то при поиске выдает всё время, что «Нет Записей»!

Помогите пожалуйста!
Заранее спасибо!

7 ответов

Я поменял заголовки в Таблице на Английские!
Но всё равно не работает! В SQL не хочет ставиться Active: True; выдает туже ошибку что и раньше.
При компиляции всё запускается, нажимаю кнопку Поиск открывается окно поиска, пишу фамилию и нажимаю ОК и оно выдает вот такую ошибку:
«Project Project1.exe raised exception class EdatabaseError with massage ‘DataSource1: Circular datalinks are not allowed’. Process stopped. Use Step or Run to continue.»

Нажимаю ОК выделяет строчку: «DataSource1.DataSet:=Query1»

Я не знаю может что-то в SQL надо прописать т.к. я там ничего не писал!
С SQL я делал только это:
Создал Query.
Поставил:Action: False (на True не ставится)
DatabaseName: STABDART1
DataSource: DataSource1
Name: Query1 (стандартно не менял)

Ну и текст программы (на всякий случай):

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Query1: TQuery;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s: string[50];
begin
s := InputBox(‘Поиск’,’Введите фамилию и нажмите OK’,»);
if s <> » then
begin
with form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add(‘SELECT Famil, Name, Telefon’);
SQL.Add(‘FROM «:STANDARD1:Table 1.db»‘);
SQL.Add(‘WHERE’);
SQL.Add(‘(Famil = «‘+ s + ‘»)’);
SQL.Add(‘ORDER BY Name, Famil’);
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage(‘Нет записей.’);
DataSource1.DataSet:=Table1;
end;

Помогите пожалуйста!
Заранее спасибо!

Originally posted by Zorro_13
Привет hardcase!

Я поменял заголовки в Таблице на Английские!
Но всё равно не работает! В SQL не хочет ставиться Active: True; выдает туже ошибку что и раньше.
При компиляции всё запускается, нажимаю кнопку Поиск открывается окно поиска, пишу фамилию и нажимаю ОК и оно выдает вот такую ошибку:
«Project Project1.exe raised exception class EdatabaseError with massage ‘DataSource1: Circular datalinks are not allowed’. Process stopped. Use Step or Run to continue.»

Нажимаю ОК выделяет строчку: «DataSource1.DataSet:=Query1»

Я не знаю может что-то в SQL надо прописать т.к. я там ничего не писал!
С SQL я делал только это:
Создал Query.
Поставил:Action: False (на True не ставится)
DatabaseName: STABDART1
DataSource: DataSource1
Name: Query1 (стандартно не менял)

Ну и текст программы (на всякий случай):

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables;

type
TForm1 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Query1: TQuery;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s: string[50];
begin
s := InputBox(‘Поиск’,’Введите фамилию и нажмите OK’,»);
if s <> » then
begin
with form1.Query1 do begin
Close;
SQL.Clear;
SQL.Add(‘SELECT Famil, Name, Telefon’);
SQL.Add(‘FROM «:STANDARD1:Table 1.db»‘);
SQL.Add(‘WHERE’);
SQL.Add(‘(Famil = «‘+ s + ‘»)’);
SQL.Add(‘ORDER BY Name, Famil’);
Open;
end;
if Query1.RecordCount <> 0 then
DataSource1.DataSet:=Query1
else begin
ShowMessage(‘Нет записей.’);
DataSource1.DataSet:=Table1;
end;

Помогите пожалуйста!
Заранее спасибо!

Когда описываешь кляузу FROM, попробуй писать просто table1 (дабы не иметь на свою голову лишнего гимора, рекомендую таблицу все-таки переименовать, чтоб без пробелов была), а в свойстве DatabaseName объекта Query1 прописать алиас твоей БД (какой указан в BDE-администраторе), т.е. по аналогии с объектом Table1.

Remove or allow a circular reference

You’ve entered a formula, but it’s not working. Instead, you’ve got this message about a “circular reference.” Millions of people have the same problem, and it happens because your formula is trying to calculate itself, and you have a feature called iterative calculation turned off. Here’s what it looks like:

The formula =D1+D2+D3 breaks because it lives in cell D3, and it’s trying to calculate itself. To fix the problem, you can move the formula to another cell. Press Ctrl+X to cut the formula, select another cell, and press Ctrl+V to paste it.

Another common mistake is using a function that includes a reference to itself; for example, cell F3 contains =SUM(A3:F3). Here’s an example:

You can also try one of these techniques:

If you just entered a formula, start with that cell and check to see if you refer to the cell itself. For example, cell A3 might contain the formula =(A1+A2)/A3. Formulas like =A1+1 (in cell A1) also cause circular reference errors.

While you’re looking, check for indirect references. They happen when you put a formula in cell A1, and it uses another formula in B1 that in turn refers back to cell A1. If this confuses you, imagine what it does to Excel.

If you can’t find the error, click the Formulas tab, click the arrow next to Error Checking, point to Circular References, and then click the first cell listed in the submenu.

Review the formula in the cell. If you can’t determine whether the cell is the cause of the circular reference, click the next cell in the Circular References submenu.

Continue to review and correct the circular references in the workbook by repeating steps any or all of the steps 1 through 3 until the status bar no longer displays «Circular References.»

If you’re brand new to working with formulas, see Excel 2016 Essential Training at LinkedIn Learning.

The status bar in the lower-left corner displays Circular References and the cell address of one circular reference.

If you have circular references in other worksheets, but not in the active worksheet, the status bar displays only “Circular References” with no cell addresses.

You can move between cells in a circular reference by double-clicking the tracer arrow. The arrow indicates the cell that affects the value of the currently selected cell. You show the tracer arrow by clicking Formulas, and then click either Trace Precedents or Trace Dependents.

Learn about the circular reference warning message

The first time Excel finds a circular reference, it displays a warning message. Click OK or close the message window.

When you close the message, Excel displays either a zero or the last calculated value in the cell. And now you’re probably saying, «Hang on, a last calculated value?» Yes. In some cases, a formula can run successfully before it tries to calculate itself. For example, a formula that uses the IF function may work until a user enters an argument (a piece of data the formula needs to run properly) that causes the formula to calculate itself. When that happens, Excel retains the value from the last successful calculation.

Читать еще:  Css checkbox checked

If you suspect you have a circular reference in a cell that isn’t showing a zero, try this:

Click the formula in the formula bar, and then press Enter.

Important In many cases, if you create additional formulas that contain circular references, Excel won’t display the warning message again. The following list shows some, but not all, the scenarios in which the warning message will appear:

You create the first instance of a circular reference in any open workbook

You remove all circular references in all open workbooks, and then create a new circular reference

You close all workbooks, create a new workbook, and then enter a formula that contains a circular reference

You open a workbook that contains a circular reference

While no other workbooks are open, you open a workbook and then create a circular reference

Learn about iterative calculation

At times, you may want to use circular references because they cause your functions to iterate—repeat until a specific numeric condition is met. This can slow your computer down, so iterative calculations are usually turned off in Excel.

Unless you’re familiar with iterative calculations, you probably won’t want to keep any circular references intact. If you do, you can enable iterative calculations, but you need to determine how many times the formula should recalculate. When you turn on iterative calculations without changing the values for maximum iterations or maximum change, Excel stops calculating after 100 iterations, or after all values in the circular reference change by less than 0.001 between iterations, whichever comes first. However, you can control the maximum number of iterations and the amount of acceptable change.

If you’re using Excel 2010 or later, click File > Options > Formulas. If you’re using Excel for Mac, click the Excel menu, and then click Preferences > Calculation.

If you’re using Excel 2007, click the Microsoft Office Button , click Excel Options, and then click the Formulas category.

In the Calculation options section, select the Enable iterative calculation check box. On the Mac, click Use iterative calculation.

To set the maximum number of times that Excel will recalculate, type the number of iterations in the Maximum Iterations box. The higher the number of iterations, the more time that Excel needs to calculate a worksheet.

In the Maximum Change box, type the smallest value required for iteration to continue. This is the smallest change in any calculated value. The smaller the number, the more precise the result and the more time that Excel needs to calculate a worksheet.

An iterative calculation can have three outcomes:

The solution converges, which means a stable end result is reached. This is the desirable condition.

The solution diverges, which means that from iteration to iteration, the difference between the current and the previous result increases.

The solution switches between two values. For example, after the first iteration the result is 1, after the next iteration the result is 10, after the next iteration the result is 1, and so on.

Need more help?

You can always ask an expert in the Excel Tech Community, get support in the Answers community, or suggest a new feature or improvement on Excel User Voice.

Информация о TDataLink

Delphi , Синтаксис , Синтаксис

Автор: James Thorpe (CSA Australasia)

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

TFieldDatalink — производный класс от TDataLink, являющийся базовым классом для объекта, используемого компонентами для работы с базами данных и осуществляющий функцию связи с набором данных DataSet (TTable или TQuery). DataLink используется DataSet’ом для информирования всех БД-компонентов об изменении записи, о необходимости обновления записи перед помещением ее в базу данных, о том, что DataSet сменила свое состояние на активное или неактивное, и т.д.. И наоборот, DataLink используется БД-компонентами для обновления DataSet, например, его статуса.

DataSet может быть связан с несколькими источниками данных DataSource, каждый DataSource может быть связан с несколькими DataLink, и каждый DataLink может быть связан с единственным БД-компонентом. В большинстве случаев, отдельный компонент использует только один DataLink, тем не менее, имеются компоненты, такие как, например, DBLookupList или DBLookupCombo, использующих два DataLink. В этих элементах управления первый DataLink используется для чтения данных из lookup DataSet, второй DataLink используется для записи этих данных (при их изменении) во второй имеющийся DataSet. Каждый DataSet поддерживает связанный с ним список DataSource и, аналогично этому, каждый DataSource поддерживает список связанных с ним Datalink’ов.

В момент, когда DataSet должен уведомить БД-компоненты о наступлении какого-то события, например, при изменении пользователем какой-либо записи, он рассылает это сообщение всем DataSource, находящимся в его списке. Каждый DataSource затем повторяет этот процесс и рассылает сообщение всем Datalink’ам, находящимся в его списке. Другими словами, связь не зависит от элемента управления, при этом логика программирования должна отслеживать передачу сообщения каждому элементу управления, пользующемуся услугами DataLink и изолировать только те события, на которые элементу необходимо отреагировать. Связывая компонент с набором данных другим способом, мы не получим в свое распоряжение столько управляющих функций, гибкости и мониторинга, сколько даст нам один DataSet, соединенный с помощью DataLink.

Кроме функции обеспечения поддержания коммуникационного канала между DataSet и ДБ-компонентами, DataLink также обеспечивает управление буфером для каждого компонента. Большинство элементов управления, таких как, например, TDBEdit, отображающий только отдельно взятую запись, буферизация не требуется, тем не менее, таким компонентам, как, например, TDBGrid и TDBLookupList, отображающим множество записей, буферизация нужна. Физически DataLink данные не буферизирует, эта функция выполняется DataSet. Всесто этого DataLink поддерживает виртуальный буфер, который, в сущности, небольшое «окно» в физический буфер DataSet. Размер этого виртуального буфера может быть установлен с помощью свойства DataLinks BufferCount, а количество записей, реально в нем хранимых, с помощью свойства RecordCount.

Статья Информация о TDataLink раздела Синтаксис Синтаксис может быть полезна для разработчиков на Delphi и FreePascal.

Комментарии и вопросы

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

Читать еще:  Файлы проекта delphi

Circular datalinks are not allowed delphi

До настоящего момента мы говорили лишь о том, как получить некий абстрактный доступ к данным из приложения, опуская самую главную, с точки зрения конечного потребителя приложения БД, возможность — собственно представление данных в приложении. Для этих целей в VCL предусмотрено 2 группы компонентов — Data Access и Data Controls.

Доступ к данным

Для доступа к данным, представленным при помощи различных компонент — будь то BDE-ориентированные источники (например, Table), или ADO, IB Express, или dbExpress, используется один и тот же набор компонентов, расположенных на закладке Data Access:

  • DataSource — источник данных;
  • ClientDataSet — клиентский набор данных;
  • DataSetProvider — провайдер набора данных;
  • XMLTransform — преобразователь данных, представленных в виде XML в обычный пакет данных и обратно;
  • XMLTransformProvider — провайдер данных для XML-документов, осуществляющий так же их обновление;
  • XMLTransformClient — адаптер между XML-документом и провайдером.

Из этого списка нам интересно только первые 3 компонента, а именно DataSource, ClientDataSet и DataSetProvider. Используя набор из этих компонент, можно обеспечить доступ к данным. Причем в случае, когда речь идет о BDE и таблицах Paradox, как правило, достаточно использовать лишь один из перечисленных компонентов — DataSource. Этот компонент имеет всего 4 собственных свойства — AutoEdit, DataSet, Enabled и State. Свойство Enabled похоже на свойство Active таблицы или Connected у базы данных, т.е. делает активным или неактивным соединение. А свойство AutoEdit, будучи включенным, обеспечивает возможность правки записей без написания какого-либо дополнительного кода. Свойство State информирует о том, в каком состоянии в текущий момент находится источник данных. Ну а самое важное свойство этого компонента — это, конечно же, DataSet, которое и определяет источник данных — таблицу, запрос и т.д.

Оставшиеся ClientDataSet и DataSetProvider могут понадобиться в том случае, если требуется обеспечить кэширование записей, например, для того, чтобы представить в виде таблицы источник данных типа dbExpress.

Рассмотрим пример, когда нам требуется обеспечить доступ к данным простой таблицы Paradox. Для этого нам на форме приложения понадобятся следующие компоненты: Database и Table из BDE, а так же DataSource из Data Access.

ПРИМЕЧАНИЕ
Хотя для таблицы (компонента Table) можно указать один из определенных в BDE псевдонимов без помощи компонента Database, по сложившейся традиции, а так же в целях удобства управления приложением, все-таки предпочтительнее использовать связку из Database и Table.

Теперь для свойства AliasName компонента Database выберем название имеющегося у нас псевдонима БД (DATA1), а в качестве значения свойства DatabaseName так же напишем DATA1. Таким образом, компонент Database будет видеть «настоящий» псевдоним DATA1, а все остальные компоненты приложения — псевдоним DATA1, определенный посредством компонента Database.

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

Тем не менее, мы остановимся на начальном варианте, и перейдем к компоненту Table, для которого нам так же придется установить значения для 2 свойств — DatabaseName и TableName. Для первого укажем DATA1, для второго — customer. Чтобы убедиться, что все сделано правильно, попробуем активировать связь с БД, для чего установим в истину свойство Active. Если все было сделано верно (включая создание псевдонима DATA1 и таблицы customer, о чем речь шла в предыдущей главе), то не только свойство Active таблицы изменится на истину, но и свойство Connected компонента Database так же изменится на истину.

Последнее, что осталось сделать — это поместить на форму компонент DataSource и установить значение его свойства DataSet в Table1. Таким образом, мы получим действующую связку из 3 компонентов, обеспечивающих все этапы взаимодействия с БД — от организации локального псевдонима и управления им (Database), до выбора конкретной таблицы с возможностью управления ее параметрами (Table) и предоставления ее данных любым другим компонентам (DataSource).

Таблица DB Grid

Теперь настало время рассмотреть собственно компоненты, которым могут понадобиться данные для представления. Все они расположены на закладке Data Controls. Прежде всего, это, конечно, специальная таблица для баз данных — DBGrid. Этот компонент является дальнейшим развитием обычной таблицы (StringGrid), но предназначен исключительно для отображения и редактирования связанной с БД информации. Соответственно, у DBGrid нет таких свойств, как Cells, Cols и Rows, поскольку все, что выводит этот компонент — есть прямое отражение текущего содержимого связанной с ним таблицы БД.

В то же время, у компонента DBGrid предусмотрен целый ряд специальных свойств, предназначенных для взаимодействия с БД. Прежде всего, это свойство DataSource, в котором указывают имя компонента-источника данных. Так, если на форму, где уже имеются настроенные соответствующим образом невизуальные компоненты Database, Table и DataSource поместить таблицу, в свойстве DataSource которой указать DataSource1, то мы сразу же увидим содержимое таблицы customer (рис. 19.1).


Рис. 19.1. Форма Delphi с таблицей БД

Следует сразу же отметить, что в качестве заголовков столбцов были использованы названия полей таблицы БД. Кроме того, можно увидеть, что столбец, содержащий числовые данные, имеет выравнивание по правому краю, а строковые — по левому. Таким образом, очевидно, что компонент DBGrid имеет более широкие возможности по оформлению таблиц, чем обычная таблица StringGrid. Возможно это благодаря другому свойству DBGrid — Columns, которое определяет оформление, количество и порядок следования столбцов с данными. Это свойство представляет собой коллекцию, состоящую из отдельных колонок таблицы. По умолчанию используется автоматический режим вывода, когда выводятся все поля данных с размерами, основанными на параметрах самих полей, заданных в выводимой таблице БД. Но поскольку во многих случаях выводить все поля не требуется, или же необходимо изменить параметры их вывода, как-то порядок следования, цвет, шрифт, или ширину поля, то все эти настройки доступны именно через свойство Columns. При этом каждый элемент этого свойства представляет собой объект типа TColumn, имеющий, в свою очередь, такие свойства, как заголовок (вместо стандартного названия поля в БД) выравнивание, цвет фона, шрифт, возможность правки и т.д. Доступ ко всем этим параметрам возможен через специальный редактор коллекций, который можно вызвать, дважды щелкнув по самой таблице в режиме разработки (рис. 19.2).


Рис. 19.2. Редактирование списка столбцов

На панели инструментов редактора столбцов имеется 4 кнопки — для добавления и удаления столбцов, а так же для автоматического заполнения и для сброса к начальным установкам. Выбирая поле из списка, и изменяя его свойства в инспекторе объекта, вы тем самым изменяете параметры отображения соответствующего столбца. А меняя в редакторе строки местам (путем перетаскивания мышкой), вы меняете порядок вывода полей в самой таблице.

Таким образом, мы рассмотрели 2 наиболее важных свойства компонента DBGrid. Что касается всех собственных свойств, имеющихся у таблицы для баз данных, то они перечислены в таблице 19.1.

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector