0 / 0 / 0 Регистрация: 18.04.2012 Сообщений: 4 |
|
1 |
|
18.04.2012, 19:41. Показов 17670. Ответов 6
Ситуация вот какая, хочу осуществить позиционирование на искомую строку в dbgrid (по одному столбцу) при помощи компонентов edit,button! На форме так же находиться AdoQuery,Data Source,AdoConnection.То есть данные уже введены, просто осуществить поиск что бы выделил эту строку!
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
18.04.2012, 19:41 |
Ответы с готовыми решениями: Поиск в DBGrid
Поиск по DbGrid Поиск по DBGrid 6 |
bobr-21 6 / 6 / 0 Регистрация: 12.04.2012 Сообщений: 124 Записей в блоге: 1 |
||||
19.04.2012, 00:25 |
2 |
|||
Поиск в необходимом поле(name)/ Условия поиска указываются в edite.
0 |
drweb18 0 / 0 / 0 Регистрация: 18.04.2012 Сообщений: 4 |
||||
19.04.2012, 09:52 [ТС] |
3 |
|||
Поиск в необходимом поле(name)/ Условия поиска указываются в edite.
Не работает, вводил в keypress, при диапазоне 0 выбивала ошибку, поставил больше всё равно нет!
0 |
Супер-модератор 8783 / 2536 / 144 Регистрация: 07.03.2007 Сообщений: 11,873 |
|
19.04.2012, 09:59 |
4 |
drweb18, какую ошибку пишет? и вам не кажется слишком уж смелым решением на каждое нажатие изменять фильтрацию? может хоть на Enter ее повесите? а то вам поиск при достаточно большом кол-ве записей будет мучением, а не подспорьем в работе
0 |
bobr-21 6 / 6 / 0 Регистрация: 12.04.2012 Сообщений: 124 Записей в блоге: 1 |
||||
19.04.2012, 10:15 |
5 |
|||
Я связывал не с ADOQuery, а с ADOTable и все работает.
Вместо фамилия введите свое название поля(и не забудьте и про свой edit).
2 |
28 / 28 / 4 Регистрация: 28.04.2011 Сообщений: 79 |
|
19.04.2012, 14:57 |
6 |
Так мы фильтруем или позиционируем?
0 |
0 / 0 / 0 Регистрация: 18.04.2012 Сообщений: 4 |
|
19.04.2012, 23:30 [ТС] |
7 |
Так мы фильтруем или позиционируем? мы фильтруем!!!
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
19.04.2012, 23:30 |
Помогаю со студенческими работами здесь
Поиск DBGrid DBGrid1: Nom_klienta, Organiz, Kontact, Tel, Kolvo, Tarif, Summa, Data…. Поиск в dbgrid Поиск в DBGRID Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 7 |
I did not understand your question very well, I ask you to identify your problem and explain precisely to make it easier on us to help you.
-To search for a customer name in the table is as follows :
If Not ADOTable1.Locate('Name',Edit1.Text,[]) then
MessageDlg('The customer does not exist !',mtInformation,[mbOK],0);
Locate Options : loCaseInsensitive,loPartialKey .
You can also search by ADOQuery Here’s an example:
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Select * From YourTable Where Name ='+QuotedStr(Edit1.Text);
ADOQuery1.Open;
Or you can use ADOQuery Parameters Like this:
ADOQuery1.Close;
ADOQuery1.Parameters.ParamByName('Term').Value:=Edit1.Text;
ADOQuery1.SQL.Text := 'Select * From YourTable Where Name=:Term';
ADOQuery1.Open;
Good Luck.
Компоненты доступа и представления данных
До настоящего момента мы говорили лишь о том, как получить некий абстрактный доступ к данным из приложения, опуская самую главную, с точки зрения конечного потребителя приложения БД, возможность — собственно представление данных в приложении. Для этих целей в 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.
Свойство | Тип | Описание |
---|---|---|
Columns | TDBGridColumns | Задает параметры вывода столбцов с данными |
DataSource | TDataSource | Определяет источник данных для отображения в таблице |
FieldCount | Integer | Указывает на число столбцов с данными, выводимых в таблице |
Fields | array of TField | Предоставляет доступ к информации ячейки, находящейся в указанном столбце |
Options | TDBGridOption | Определяет различные параметры отображения и поведения таблицы |
ReadOnly | Boolean | Определяет, будет ли у пользователя возможность править данные в таблице |
SelectedField | TField | Предоставляет доступ к информации в выделенной ячейке |
SelectedIndex | Integer | Определяет номер текущего столбца |
TitleFont | TFont | Определяет шрифт, используемый для вывода заголовков столбцов таблицы |
Здесь следует отдельно выделить свойство Options, позволяющее настроить целый ряд различных параметров. Оно имеет следующие флаги:
- dgEditing — Делает возможной правку данных прямо в таблице. Этот флаг игнорируется, если включен флаг dgRowSelect;
- dgAlwaysShowEditor — Таблица будет постоянно находиться в режиме редактирования. В противном случае пользователь должен будет нажимать F2, Enter, или щелкать мышкой по полю, чтобы ввести новое значение;
- dgTitles — Делает видимыми заголовки столбцов;
- dgIndicator — Добавляет колонку, в которой будет отображаться индикатор выбранной записи;
- dgColumnResize — Делает возможным изменение размеров столбцов пользователем;
- dgColLines — Столбцы будут отделены разделительными линиями;
- dgRowLines — Записи будут отделены разделительными линиями;
- dgTabs — Делает возможной навигацию по ячейкам при помощи клавиш Tab и Shift+Tab;
- dgRowSelect — Записи будут выделяться целиком. При этом правка данных в таблице становится невозможной (т.е. флаги dgEditing и dgAlwaysShowEditor будут проигнорированы);
- dgAlwaysShowSelection — Выбранная ячейка будет выделена цветом даже если фокус вводе не находится на таблице;
- dgConfirmDelete — Будет выдаваться предупреждение, если пользователь захочет удалить запись в таблице (при помощи Ctrl+Delete);
- dgCancelOnExit — Предотвращает запись пустых записей;
- dgMultiSelect — Делает возможным выбирать несколько записей одновременно (с использованием клавиши Ctrl).
Например, если таблица должна будет использоваться лишь для навигации по БД и просмотра значений, то будет рациональным установить флаг dgRowSelect. С одной стороны, это автоматически отключит возможность правки и ввода данных непосредственно в самой таблице пользователем, а с другой — будет визуально выделять текущую запись, при этом достаточно наглядно показывая пользователю, что правка невозможна.
В типичном случае все производимые при разработке приложения настройки компонента DBGrid сводятся к тому, что, поместив его на форму, указывают связанный источник данных, после чего при помощи редактора определяют состав и вид столбцов данных. В случае при необходимости так же выставляют нужные значения для флагов в свойстве Options.
Навигация по таблице данных
Хотя в ряде случаев для обеспечения возможности навигации по таблице достаточно использовать лишь стандартные средства, которыми располагает компонент DBGrid, в ряде случаев бывает полезным предоставить пользователю более наглядный элемент управления для навигации по данным и для их правки. Более того, подобный компонент будет просто необходим, если для предоставления данных используется не таблица, а набор отдельных элементов, отображающих данные из одного конкретного поля.
Для этих целей предусмотрен специальный компонент — DBNavigator. С его помощью можно перемещаться по записям таблицы а так же выполнять операции типа вставки новой записи или подтверждения изменений. Внешне он представляет собой панель со следующими 10 кнопками:
- First — переход на первую запись в таблице;
- Prior — переход на предыдущую запись;
- Next — переход на следующую запись;
- Last — переход на последнюю запись;
- Insert — вставка новой записи перед текущей;
- Delete — удаление текущей записи с переходом на следующую;
- Edit — переводит источник данных в режим редактирования записи;
- Post — запись измененных данных из текущей записи в БД;
- Cancel — отмена изменений данных в текущей записи;
- Refresh — обновление данных в буфере источника.
Часть этих кнопок можно отключить, воспользовавшись свойством VisibleButtons. Еще одно свойство, влияющее на внешний вид компонента DBNavigator — это Flat. Установив его в истину, можно придать панели «плоский» вид. А при помощи свойства Hints можно задать пояснительный текст всплывающей подсказки для каждой кнопки.
Еще одно свойство — ConfirmDelete определяет поведение этого компонента: если для него установлено значение истины, то при попытке удаления записи (т.е. при нажатии на кнопку Delete) будет выдаваться соответствующее предупреждение.
Наконец, свойство DataSource, как и у всех других компонент представления данных БД, указывает на источник данных, связанных с данным компонентом.
Для примера добавим компонент навигации на форму с таблицей, подобной той, что изображена на рис. 19.1. Достаточно установить свойство DataSource компонента DBNavigator в то же значение, что и у одноименного свойства компонента DBGrid, чтобы получить связанно работающие компоненты. Например, при редактировании записей в таблице, состояние кнопок в навигационной панели будет изменяться в соответствии с возможными действиями (рис. 19.3).
Рис. 19.3. Таблица DBGrid и панель навигации
Пример можно найти в каталоге DemoPart4SimpleTable.
Представление отдельных полей данных
Как мы уже знаем, для отображения таблиц БД в целом, используется табличный же компонент — DBGrid. В том же случае, когда надо отобразить содержимое лишь отдельных полей данных, используют соответствующие компоненты — DBEdit, DBImage, DBCheckBox и т.д., в зависимости от типа данных, которые требуется отобразить в том или ином случае.
Все эти компоненты являются специализированными вариантами обычных компонент, не связанных с БД:
- DBText — аналог текстовой подписи Label;
- DBEdit — аналог однострочного редактора Edit;
- DBMemo — аналог многострочного редактора (блокнота) Memo;
- DBImage — аналог компонента для вывода изображений Image;
- DBListBox — аналог списка ListBox;
- DBComboBox — аналог раскрывающегося списка ComboBox;
- DBCheckBox — аналог переключателя CheckBox;
- DBRadioGroup — аналог группы исключающих переключателей RadioGroup;
- DBRichEdit — аналог редактора форматированного текста RichEdit.
Основным отличием ориентированных на применение совместно с базами данных компонент является наличие у них свойства DataSource, при помощи которого они связываются с источником данных. Еще одно свойство — DataField, как раз и указывает на то поле, которое должно отображаться в данном компоненте. В остальном по своим функциональным способностям они повторяют свои не ориентированные на БД аналоги.
Что касается вариантов использования, то, например, мы можем заменить таблицу в предыдущем примере на пару компонент — DBText для отображения номера и DBEdit для вывода и редактирования названия. Соответственно, мы можем заменить табличное представление данных представлением типа «форма».
Для этого, удалив таблицу и разместив на форме компоненты DBText и DBEdit, установим для них обоих свойство DataSource в значение DataSource1, после чего для свойства DataField у метки выберем значение CUST_ID, а для этого же свойства у редактора — CUST_NAME. Не помешает также разместить на форме еще и 2 обычные метки (Label), при помощи которых можно вывести текст, поясняющий, что за информация выводится в том или ином поле (рис. 19.4).
Рис. 19.4. Использование отличного от таблицы формата отображения данных
ПРИМЕЧАНИЕ
Здесь следует отметить тот факт, что данные могут автоматически преобразовываться в тот формат, который доступен компоненту. Например, целочисленное значение номера клиента было автоматически преобразовано в строку для вывода в DBText. Вместе с тем, возможности преобразований небезграничны, поэтому следует внимательно подбирать подходящие компоненты для отображения информации в каждом конкретном случае.
Компонент DBCtrlGrid
Особняком от других компонентов для отображения информации баз данных стоит компонент DBCtrlGrid, не имеющий прямых аналогов среди «обычных» компонентов VCL. Он состоит из набора однотипных панелей и позволяет отображать данные в произвольной форме. При этом каждая панель является платформой, на которой размещены простые БД-компоненты — такие, как DBText, DBEdit, DBCheckBox и т.п. У всех этих компонентов будет общий источник данных, который задается централизованно в свойствах самого DBCtrlGrid. Соответственно, останется лишь выбрать поля, которые помещенные на DBCtrlGrid компоненты будут отображать.
Во время разработки определяют единственную панель, по образу которой будут созданы ее точные копии. Например, можно взять за основу форму вывода таблицы клиентов в виде DBText и DBEdit, поместив на нее DBCtrlGrid, на котором, в свою очередь, расположить метку с редактором. В результате после запуска приложения эти 2 компонента будут продублированы на всех видимых панелях сетки (рис. 19.5).
Рис. 19.5. Компонент DBCtrlGrid во время разработки (слева) и во время выполнения (справа)
Данные в таких панелях-ячейках могут располагаться как вертикально, так и горизонтально, либо вообще в качестве таблицы — в несколько рядов и колонок. Формат вывода панелей, как и их размеры, а так же ряд иных параметров этого компонента, определяется при помощи ряда свойств, перечисленных в таблице 19.2.
Свойство | Тип | Описание |
---|---|---|
AllowDelete | Boolean | Определяет, может ли пользователь удалить текущую запись, нажав Ctrl+Delete. |
AllowInsert | Boolean | Определяет, может ли пользователь вставить новую запись, нажав клавишу Insert или добавить запись в конец, нажав Ctrl+Insert |
ColCount | Integer | Определяет число столбцов с панелями |
DataSource | TDataSource | Определяет источник данных для отображения |
Orientation | TDBCtrlGridOrientation | Определяет порядок следования записей. Допустимые значения: goVertical (с вертикальной прокруткой) и goHorizontal (с горизонтальной прокруткой) |
PanelBorder | TDBCtrlGridBorder | Определяет, должна ли быть рамка вокруг каждой панели. Допустимые значения: gbNone, gbRaised |
PanelCount | Integer | Указывает на число видимых панелей |
PanelHeight | Integer | Определяет высоту каждой панели в пикселях |
PanelIndex | Integer | Определяет порядковый номе выбранной панели |
PanelWidth | Integer | Определяет ширину каждой панели в пикселях |
RowCount | Integer | Определяет число строк с панелями |
SelectedColor | TColor | Определяет цвет фона активной панели |
ShowFocus | Boolean | Определяет, должна ли отображаться дополнительная рамка вокруг панели при получении фокуса ввода |
Размеры панелей определяются при помощи свойств PanelHeight и PanelWidth, а размеры компонента в целом определяются так же количеством панелей по горизонтали и по вертикали, определяемые через свойства ColCount и RowRount.
ПРИМЕЧАНИЕ
Не рекомендуется помещать на панели ресурсоемкие компоненты вроде блокнота или изображения, особенно если панелей много. Так же следует учитывать, что все компоненты будут иметь один и тот же источник данных, определенный для самого DBCtrlGrid.
Пример с использованием данного компонента совместно с панелью навигации можно найти в каталоге DemoPart4CtrlGrid.
Связывание данных в таблицах
Важной особенностью работы с БД является связывание данных в таблицах. И хотя такое связывание осуществляется невизуальным компонентом Table, наглядно продемонстрировать связывание можно лишь с использованием компонентов, отображающих данные таблиц, т.е. с использованием, например, рассмотренного в этой главе компонента DBGrid.
Очевидно, что для связывания данных между таблицами нам нужно иметь более одной таблицы. Поэтому для начала откроем Database Desktop и создадим новую таблицу, предназначенную для связывания с уже имеющейся у нас таблицей клиентов.
Пусть это будет таблица счетов (Bill) для этих самых клиентов. Таким образом, в новой таблице нам понадобится, как минимум, 3 поля: номер счета (BILL_ID), идентификатор клиента (BILL_CUST) и сумма (BILL_SUMM). При этом поле номера счета будет иметь автоинкрементный тип, и являться индексом, а поле с номером клиента — целочисленный тип и так же быть индексированным. Наконец, поле суммы будет денежного типа.
После создания структуры таблицы останется заполнить ее произвольными значениями — достаточно будет ввести по 1-2-3 записи для каждого из клиентов (рис. 19.6). Достаточно лишь помнить, что число, вводимое в поле идентификатора клиента должно соответствовать одному из значений в поле CUST_ID таблицы клиентов, т.к. если за этим не следить, то получатся «потерянные» данные, не связанные с другими, что является нарушением целостности БД.
Рис. 19.6. Структура и содержимое таблицы счетов Bill
После подготовки исходных данных, перейдем к разработке приложения. Нам потребуется 1 компонент Database и по 2 компонента Table, DataSource и DBGrid. Для компонента Database установим те же значения, что и в предыдущем примере, т.е. AliasName и DatabaseName установим в DATA1, после чего свойство Connected можно установить в истину. Затем для первого «комплекта» из Table, DataSource и DBGrid так же устанавливаем значения, аналогичные предыдущему примеру, т.е. для Table1 установим свойство DatabaseName — в DATA1, а TableName — в customer.DB. Для DataSource1 установим свойство DataSet в Table1, и, наконец, для DBGrid1 установим свойство DataSource в DataSource1.
Затем подобную операцию следует провести для 2-го набора компонент, установив свойства подобным образом, за исключением того, что свойство TableName у компонента Table2 будет bill.DB, а во всех остальных случаях, разумеется, будут использованы имена этого набора (т.е. Table2, DataSource2, и т.д.). Если теперь для компонентов Table1 и Table2 установить значение свойства Active в истину, то в DBGrid1 и DBGrid2 мы увидим содержимое таблиц Customer и Bill.
Теперь займемся собственно связыванием данных. Для этого нам надо в подчиненной таблице, которую здесь представляет компонент Table2, указать на главную таблицу и сослаться на связанное поле, по которому и будет производиться отбор. Поскольку главная таблица предоставлена своим источником данных (DataSource1), то его и следует указать в свойстве MasterSource компонента Table2. Затем для свойства MasterFields установим значение CUST_ID. Наконец, в свойстве INDEX_NAME укажем вторичный индекс таблицы Bill, т.е. тот, который индексирует поле BILL_CUST. В нашем случае он называется CUST_IDX.
Таким образом, остается запустить приложение, чтобы убедиться, что связи работают. Если все сделано правильно, то при выборе записи в таблице с клиентами, в таблице счетов будут отображаться только те данные, которые относятся к этому клиенту. Пример можно найти в каталоге DemoPart4OneToAny, а с внешним видом этого приложения мы уже знакомы (см. рис. 17.2).
Компоненты синхронного просмотра
Специально для отображения связанной информации в БД, имеются 2 компонента, предназначенных именно для этих целей. Это компоненты DBLookupComboBox и DBLookupListBox. Оба они, хотя визуально и похожи на комбинированный и обычный списки, на самом деле, не являются потомками ни стандартных, ни БД-ориентированных компонентов, а происходят от общего для них класса TDBLookupControl, инкапсулирующего как список значений для просмотра, так и его механизм.
Соответственно, свойства этого класса наследуются обоими компонентами синхронного просмотра — как DBLookupComboBox, так и DBLookupListBox. Все они приведены в таблице 19.3.
Свойство | Тип | Описание |
---|---|---|
DataField | String | Определяет поле, которое будет отображаться данным компонентом |
DataSource | TDataSource | Определяет источник данных для отображения в списке |
Field | TField | Указывает на объект типа TField, который представляет собой данный компонент |
KeyField | String | Определяет ключевое поле таблицы синхронного просмотра (ListSource), которое должно совпадать со значением поля, указанного в DataField |
KeyValue | Variant | Представляет собой текущее значение ключевого поля |
ListField | String | Определяет поле или список полей синхронного просмотра в таблице синхронного просмотра |
ListFieldIndex | Integer | Определяет номер основного поля синхронного просмотра для случая, если в ListField указан список полей |
ListSource | TDataSource | Определяет компонент источника данных (DataSource), связанный с таблицей синхронного просмотра |
NullValueKey | TShortCut | Определяет сочетание горячих клавиш для сброса значения на неопределенное |
ReadOnly | Boolean | Определяет, может ли пользователь изменять значения |
Фактически, здесь следует запомнить лишь следующее: то, что отображается в самом компоненте синхронного просмотра (в обычном или в ниспадающем списке), задается парой значений для ListSource и ListField, а то, на основании чего происходит выборка текущего значения — в DataSource и DataField. При этом для связывания значений используется KeyField. Рассмотрим это на примере наших таблиц счетов и клиентов.
В предыдущем случае мы уже связывали таблицы средствами компонента Table. При этом первичным источником данных («мастером») являлась таблица клиентов, выбирая запись в которой, мы могли видеть соответствующие ей значения в подчиненной таблице счетов. Но теперь рассмотрим такой вариант, когда первичной информацией являются сами счета. В таком случае, в общем-то, достаточно одной таблицы со счетами. Единственная проблема состоит в том, что в ней виден лишь номер клиента, что удобно машине, но не годится для человека. Соответственно, название клиента можно отображать, воспользовавшись как раз компонентом DBLookupComboBox.
Прежде всего, нам понадобится привычный уже набор из 5 компонент данных, а именно Database и 2 пары Table и DataSource. Первую пару (Table1 и DataSource1) в данном случае мы настроим на таблицу счетов, а вторую — на клиентов. При этом никаких значений для MasterSource и MasterFields нам в данном случае устанавливать не потребуется. После этого пометим на форму таблицу DBGrid и свяжем ее с таблицей счетов, установив свойство DataSource в значение DataSource1. Если база данных подключена, а таблицы активны, то в таблице сразу же будет отображена вся информация о счетах.
Теперь перейдем к собственно синхронному просмотру. Для этого поместим на форму компонент DBLookupComboBox и установим для его свойств следующие значения: DataSource — DataSource1, DataField — BILL_CUST, ListSource — DataSource2, ListField — CUST_NAME, и, наконец, свойство KeyFiled установим в CUST_ID.
Остается лишь запустить приложение и убедиться, что при выборе той или иной записи в таблице счетов, в комбинированном списке синхронного просмотра отображается название соответствующего клиента (рис. 19.7).
Рис. 19.7. Синхронный просмотр таблиц БД
Если же раскрыть сам список, то в нем можно будет увидеть весь список клиентов, а если выбрать из него другое значение, то цифра в колонке BILL_CUST так же поменяется. Таким образом, связь получается полноценная, в обе стороны.
Помимо рассмотренных свойств, отвечающих за организацию связи между данными, у компонента DBLookupComboBox имеются и собственные свойства, относящиеся к его визуальной части. Это DropDownAlign, DropDownRows и DropDownWidth, которые отвечают, соответственно, за выравнивание элементов в раскрывающемся списке, за их количество в нем и за ширину окна списка. Кроме них, для чтения во время выполнения программы доступны еще 2 свойства — ListVisible, указывающее на то, раскрыт ли список в данный момент, и Text, содержащее текущее значение списка в виде текстовой строки.
Что касается компонента DBLookupListBox, то с точки зрения организации синхронного просмотра он полностью аналогичен компоненту DBLookupComboBox. Различия касаются лишь визуальной формы представления, а так же собственных свойств, коих у синхронного списка всего 3 — BorderStyle, RowCount и SelecteItem. Первое отвечает за наличие обрамляющей рамки у списка, второе — указывает на количество видимых в списке рядов, а третье аналогично свойству Text у комбинированного списка, т.е. содержит выбранное значение в виде строки.
Модуль хранения компонентов данных
До настоящего момента мы рассматривали лишь простейшие случаи, с использованием 1-2 таблиц и такого же небольшого числа источников данных. Если же говорить о реальных приложениях БД, то число невизуальных компонентов, используемых в программе для доступа к данным, нередко исчисляется десятками. Такое их изобилие грозит превратить форму главного окна в одно сплошное нагромождение компонент, изрядно мешая работе. Кроме того, одни и те же компоненты могут понадобиться в разных окнах приложения, в то время, как включать в список используемых модулей главное (или любое другое) окно только лишь для ссылки на данные не представляется идеальным вариантом. Поэтому в Delphi предусмотрено специальная оконная форма — DataModule, предназначенная исключительно для размещения на ней невизуальных компонент для доступа к данным.
Отличие окна DataModule от обычной формы состоит в том, что на нем можно размещать только невизуальные компоненты. Это могут быть не только компоненты для доступа к данным, но, в принципе, и любые другие, необходимые в разных частях приложения.
На таком окне можно совершенно свободно, без лишней скученности и без оглядок на пользовательский интерфейс, расположить весьма внушительное число необходимых компонентов (рис. 19.8).
Рис. 19.8. DataModule может вместить в себя множество компонентов доступа к данным
Для создания окна DataModule следует из меню File > New выбрать пункт Data Module. После чего достаточно будет назначить имя этому модулю (например, DM) и сохранить файл, назвав его, скажем, data.pas. После этого, как и в случае с обычными формами, можно будет его включать в конструкцию uses. После этого становится возможным ссылаться на источники данных через стандартную точечную нотацию, используя имя модуля данных:
DBGrid1.DataSource:=DM.DataSource;
Пример, использующий вынесенные в отдельный модуль невизуальные компоненты, находится в каталоге DemoPart4AppDM.
« Delphi и базы данных
|
Работа с данными »
Техподдержка / Связаться с нами
Copyright © 1999-2020 SNK. Все права защищены.
При использовании материалов с сайта ссылка на источник обязательна.
Компонент TDBGrid
TDBGrid — таблица, в которой строки представляют собой записи, а столбцы — поля набора данных. Свойство DataSource содержит ссылку на выбранный набор данных.
Столбцы DBGrid
Столбцы – поля подключенного набора данных. Этими значениями можно манипулировать, показывая или скрывая поля НД, меняя их местами или добавляя новые столбцы. Требуемый набор полей можно составить при помощи специального Редактора столбцов (рис. 1), который открывается при двойном щелчке на компоненте, перенесенном на форму.
В верхней части окна вы видите четыре кнопки, слева — направо:
- Add New (Добавить новый столбец).
- Delete Selected (Удалить выделенный столбец).
- Add All Fields (Добавить все столбцы из набора данных).
- Restore Defaults (Восстановить значения по умолчанию для выделенного столбца).
Рис. 1. Редактор колонок компонента TDBGrid
Для выбранного в списке столбца доступные для редактирования свойства появляются в Инспекторе объектов. Столбцы в списке можно редактировать, удалять, менять местами.
Изменить параметры заголовка столбца можно в раскрывающемся свойстве Title, которое имеет ряд собственных свойств:
Alignment — свойство устанавливает выравнивание заголовка и может быть taCenter (по центру), taLeftJustify (по левому краю) и taRightJustify (по правому краю).
Caption — свойство содержит текст, который отображается в заголовке столбца.
Color — цвет заголовка.
Font — шрифт заголовка.
Свойства Font, Alignment и Color внутри свойства Title меняют шрифт, выравнивание и цвет фона только заголовка столбца, а не его содержимого. Но у столбца имеются эти же свойства, они меняют шрифт, выравнивание и цвет фона выводимых в столбце данных.
Свойство Visible разрешает или запрещает отображение столбца, а свойство Width позволяет изменить его ширину.
Задание 1. Работа с редактором полей компонента DBGrid
1. Установите на форму компонент ADOTable, свяжите его с таблицей Pers базы Сотрудники (свойства ConnectionString – связать с базой Сотрудники, TableName=Pers, Active=True).
2. Установите DataSource, свяжите его с ADOTable1. .
3. На форму добавьте и компонент DBGrid, который свяжите с DataSource1..
4. Нам нужны не все поля таблицы, а только некоторые из них. Дважды щелкните по компоненту DBGrid1 и в открывшемся редакторе столбцов нажмите кнопку Add New. Появится один пустой столбец. Для того, чтобы он показал данные нужного поля, выделите его и в инспекторе объектов в свойстве FieldName выберите поле Fam. .
5. Найдите свойство Title, раскройте его нажатием на кнопку «+». Настройте подсвойство Alignment=taCenter, Caption=”Фамилия”, Font установите полужирным. Найдите свойство Width, установите его равным 150. .
6.Аналогично добавьте и настройте свойства полей Nam, Par, Sex, Dep.
.
Рисунок 2. Форма к заданию 1.
Пустые столбцы
Если добавить в редактор столбцов сетки DBGrid новый столбец, но в свойстве FieldName не выбирать поле БД, а оставить его пустым, мы получим пустой столбец. Для чего нужны пустые столбцы в сетке? В них можно выводить обработанные данные из других столбцов.
Задание 2. К примеру, пользователю неудобно просматривать три столбца «Фамилия», «Имя» и «Отчество» из таблицы Pers базы данных Сотрудники. Ему было бы удобней просмотреть один сборный столбец в формате «Фамилия И.О.».
.
1. Это и все последующие задания выполнять в программе из задания 1..
2. Создайте новый столбец, но не назначайте ему поле из НД. Выделите этот столбец, и в его свойстве Title.Caption впишите «Фамилия И.О.», а в свойстве Width укажите ширину в 200 пикселей. .
3. Столбцы «Фамилия», «Имя» и «Отчество» нам уже не нужны, скройте их, установив их свойство Visible в False. А новый столбец перетащите мышью наверх, его индекс будет равен 0..
4. Для компонента DBGrid1 создайте обработчик события OnDrawColumnCell. Это событие наступает при прорисовке каждой ячейки столбца. В него внесите код:.
var s: String;
begin
if Column.Index = 0 then //если это пустой столбец
begin
if ADOTable1[‘Fam’]<>Null then s:=ADOTable1[‘Fam’] + ‘ ‘;
if ADOTable1[‘Nam’]<>Null then s:=s + Copy(ADOTable1[‘Nam’], 1, 1)+ ‘.’;
if ADOTable1[‘Par’] <>Null then s:=s + Copy(ADOTable1[‘Par’], 1, 1) + ‘.’;
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
end;
end;
Здесь мы вначале проверяем — наш ли это столбец (равен ли индекс нулю)? Если наш, то в переменную s начинаем собирать нужный текст. При этом имеем в виду, что пользователь мог и не заполнить некоторые поля. Чтобы у нас не произошло ошибки, вначале убеждаемся, что поле не равно Null (то есть, текст есть). Если текст есть, добавляем его в переменную s. Причем если это имя или отчество, с помощью функции Copy() получаем только первую букву и добавляем к ней точку. Когда s сформирована, добавляем этот текст в наш столбец с помощью метода TextOut() свойства Canvas сетки. В метод передаются три параметра: координаты левой позиции, верхней позиции и сам текст. Эти координаты мы берем из параметра события OnDrawColumnCell — Rect, который имеет такие свойства, как Left и Top, показывающие, соответственно, левую и верхнюю позиции текущей ячейки.
В результате программа будет иметь вид:
Рисунок 3. Заполнение пустого столбца
Задание 3. Использовать пустой столбец для вывода информации по требованию пользователя. В DBGrid нам нужна кнопка, нажатие на которую привело бы к выводу сообщения об отделе, в котором работает сотрудник.
1. Откройте редактор столбцов и удалите столбец Dep.
2. Создайте новый пустой столбец. Перетаскивать его не нужно, пусть будет последним. Свойство Width (ширина) установите в 20 пикселей. Название столбца (Title.Caption) пусть будет пустым. В свойстве ButtonStyle выберите значение cbsEllipsis. Это приведет к тому, что при попытке редактировать этот столбец образуется кнопка с тремя точками:
Рисунок 4. Кнопка в пустом столбце
3. Создайте обработчик события OnEditButtonClick() компонента DBGrid. Это событие происходит всякий раз, когда пользователь нажимает на кнопку «…».
ShowMessage(‘Отдел: ‘+ADOTable1[‘Dep’]);
4. Теперь, когда пользователь нажмет на эту кнопку, ему будет выведено сообщение с текстом об отделе, в котором работает сотрудник.
Список выбора в столбце — PickList
DBGrid позволяет устроить список, аналогичный ComboBox в одном из своих столбцов без использования каких-либо других компонентов.
Задание 4. Создать для поля «Sex» список выбора значений (муж, жен).
1. Откройте редактор столбцов сетки и выделите столбец «Sex». Обратите внимание на свойство PickList в Инспекторе объектов. Это свойство имеет тип TStrings, то есть представляет собой набор строк. Щелкните дважды по PickList, чтобы открыть редактор, и впишите туда
муж
жен
именно так, каждое значение на своей строке.
2. Запустите программу и попробуйте редактировать этот столбец. При попытке редактирования в ячейке покажется похожий на ComboBox список, в котором можно будет выбрать одно из указанных значений:
Рисунок 5. Список выбора в сетке
Наличие такого списка не препятствует пользователю ввести какое-то иное значение. Этот список нужен не для контроля, а только для облегчения пользователю ввода данных. Если же вы не желаете, чтобы пользователь имел возможность вводить другие данные, контроль следует организовать иным способом.
В практике программирования список чаще формируется во время работы программы, а строки списка берутся, как правило, из другой связанной таблицы. Добавить в список новую строку очень просто: DBGrid1.Columns.Items[4].PickList.Add(‘абв’);
Список свойства PickList автоматически заполняется для поля синхронного просмотра (lookup-поле).
Выделение отдельных строк
Очень часто в практике приходится выделять какие-то строки, изменяя их фон или цвет шрифта. Например, в бухгалтерии обычно выделяют строки, в которых значение меньше нуля. Допустим, ваша программа показывает клиентов, а какой-то столбец содержит их баланс на счету вашей компании. Если этот баланс меньше 0, значит, клиент имеет задолженность перед вашей фирмой. Бухгалтеру будет очень удобно, если дебиторы (должники) будут выделяться в общем списке красным цветом.
Способ прорисовки данных в DBGrid зависит от значения его свойства DefaultDrawing. По умолчанию свойство равно True, то есть данные прорисовываются автоматически. Если свойство содержит False, то прорисовку придется кодировать самостоятельно в свойстве OnDrawColumnCell.
Если мы написали алгоритм прорисовки, но свойство DefaultDrawing содержит True, то вначале сетка заполнится данными автоматически, а затем будет выполнен наш алгоритм. Другими словами, прорисовка некоторых частей сетки будет выполнена дважды. Это не очень хорошо для быстродействия программы, однако нам придется поступать именно так: ведь мы не все строки и столбцы собираемся выводить другим способом, а только некоторые. Остальные будут заполнены данными по умолчанию.
Разберем этот метод подробней. Если найти его в справке Delphi, то увидим:
property OnDrawColumnCell: TDrawColumnCellEvent;
То есть, этот метод имеет тип TDrawColumnCellEvent. Описание типа такое:
type TDrawColumnCellEvent = procedure (Sender:TObject; const Rect:TRect;
DataCol:Integer; Column:TColumn; State:TGridDrawState) of object;
Разберемся с параметрами.
Rect — координаты прорисовки.
DataCol — порядковый номер текущего столбца (начиная с 0).
Column — данные текущего столбца.
State — состояние ячейки. Может быть:
- gdSelected — ячейка выделена
- gdFocused — фокус ввода в ячейке
- gdFixed — ячейка — заголовок столбца.
Задание 5. Изменение цвета шрифта записей сотрудников, относящихся к отделу Бухгалтерия, на красный.
Рисунок 6. Выделение строк
Заметим сразу, что наличие пустых столбцов создает дополнительные, но решаемые проблемы. Код события OnDrawColumnCell придется переделать, он будет таким:var s: String;
begin<
with DBGrid1.Canvas do begin //поле «Dep» содержит Бухгалтерия?
if (ADOTable1[‘Dep’]= ‘Бухгалтерия’) and not (gdSelected in State)
then begin //выводим все ячейки строки красным по белому:
Font.Color:= clRed;
FillRect(Rect);
end; //if
//если это пустой сборный столбец
if Column.Index = 0 then begin
if ADOTable1[‘fam’] <> Null then s:= ADOTable1[‘fam’] + ‘ ‘;
if ADOTable1[‘nam’] <> Null then s:= s + Copy(ADOTable1[‘nam’], 1, 1) + ‘.’;
if ADOTable1[‘par’] <> Null then s:= s + Copy(ADOTable1[‘par’], 1, 1)+ ‘.’;
DBGrid1.Canvas.TextOut(Rect.Left, Rect.Top, s);
end
else
if Column.Index = 5 then //если это пустой столбец с кнопкой «…»
begin
DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
Exit;
end
else TextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text); //все остальные столбцы
end;
end;Разберемся с кодом. Вначале с помощью with мы указываем, что будем работать непосредственно со свойством DBGrid1.Canvas, которое отвечает за стиль прорисовки ячейки. Далее мы смотрим поле «Dep» текущей записи равно ли Бухгалтерия. Если да, то указываем, что цвет шрифта должен быть красным, а затем функцией FillRect(Rect) мы стираем стандартный вывод.
Далее мы определяем, прорисовывается ли в данный момент пустой сборный столбец с «Фамилия И.О.». Если это он, то мы формируем переменную s с нужными данными и выводим их, как в прошлый раз.
Если же это пустой столбец с кнопкой «…», то мы делаем стандартный вывод и выходим из процедуры. Если мы этого не сделаем, то получим ошибку программы.
Все остальные столбцы мы выводим строкойTextOut(Rect.Left+2, Rect.Top+2, Column.Field.Text);
Обратите внимание, что мы добавили по два пикселя к крайней левой и крайней верхней координате ячейки. Если этого не сделать, то новая прорисовка не будет целиком закрашивать старую (рис.7):
Рисунок 7. Некорректная прорисовка
Количество добавляемых 2пикселей зависит от формата данных и размера шрифта. Обычно это определяется путем проб. Например, ячейка может содержать цифры, которые обычно прижимаются к правому краю, и тут двумя пикселями не обойтись.
Сделать проверку на тип данных можно, например, так://если текст, сдвинем только на 2 пикселя
if Column.Field.DataType = ftString then TextOut(Rect.Left, Rect.Top+2, Column.Field.Text)
//если цифры, сдвинем их вправо на 28 пикселей
else TextOut(Rect.Left+28, Rect.Top+2, Column.Field.Text);Выделение строки красным текстом может оказаться недостаточным для заказчика. Что, если он потребует, чтобы эти строки выделялись красной строкой с белым шрифтом? Тогда вместо
Font.Color:= clRed;
FillRect(Rect);вам придется написать
//выводим все ячейки строки белым текстом по красному фону:
Brush.Color:= clRed;
Font.Color:= clWhite;
FillRect(Rect);Как видите, подсвойство DBGrid1.Canvas.Brush.Color отвечает за цвет заливки ячейки, а DBGrid1.Canvas.Font.Color за цвет выводимого в ней шрифта.
Компонент TDBCtrlGrid
Компонент TDBCtrlGrid (стр.DataControls) внешне напоминает компонент TDBGrid, но никак не связан с классом TCustomDBGrid, а наследуется напрямую от класса TWinControl.
Этот компонент позволяет отображать данные в строках в произвольной форме. Компонент представляет собой набор панелей, каждая из которых служит платформой для размещения данных отдельной записи набора данных. На панели могут размещаться любые компоненты отображения данных, предназначенные для работы с отдельным полем. С каждым таким компонентом можно связать нужное поле набора данных. При открытии набора данных в компоненте TDBCtrlGrid на каждой новой панели создается набор компонентов отображения данных, аналогичный тому, который был создан на одной панели во время разработки.
На панель можно переносить только те компоненты отображения данных, которые показывают значение одного поля для единственной записи набора данных. Нельзя использовать компоненты TDBGrid, TDBCtrlGrid, TDBRichEdit, TDBListBox, TDBRadioGroup, TDBLookupListBox.
Компонент может отображать панели в одну или несколько колонок. Для задания числа колонок панелей используется свойство ColCount. Число видимых строк панелей определяется свойством RowCount. Вертикальное или горизонтальное размещение колонок панелей зависит от значения свойства Orientation.
Размеры одной панели определяются свойствами panelHeight и Panelwidth. Они взаимосвязаны с размерами самого компонента. При изменении значений свойств PanelHeight и Panelwidth размеры компонента изменяются таким образом, чтобы в нем помещалось указанное в свойствах colcount и RowCount число панелей и наоборот.
Не рекомендуется размещать на панели компоненты TDBMemo и TDBimage, т. к. это может привести к значительному снижению производительности.Задание 6. Работа с компонентом DBCtrlGrid.
Установите на форму компонент DBCtrlGrid.
Укажите в его свойстве DataSource ссылку на компонент DataSource1.
Установите на DBCtrlGrid следующие компоненты (рис.8):
DBText1 (DataField=fam), DBText2 (DataField=Nam), DBText3 (DataField=Par),
DBEdit1 (DataField=Dep),
DBComboBox1 (DataField=Sex, в свойстве Items задайте две строки «муж» и «жен»),
для слов «Отдел» и «Пол» установите компоненты Label1 и Label2.
Запустите программу и посмотрите как выглядит компонент DBCtrlGrid (рис.9).
Рисунок 8. Форма в процессе разработки
Рисунок 9. DBCtrlGrid после запуска программыСоставитель: Салий Н.А.
dzhserv
-
#1
Доброго времени суток!
Подскажите пожалуйста. Я выбрал данные из базы в DBGrid, как мне в поле найти нужное значение к
примеру по названию. (примерно как в 1С поиск по значению введенных букв в поле).
Заранее благодарю!
acorn
-
#2
Locate (Lookup) юзай и кури мануал.
LAW
-
#3
На сколько я помню этот самый Locate (Lookup) не использует индексы.
Если дорого время выполнения, то стоит использовать GotoKey()
Query1->IndexName=»индекс по полю поиска»;
Query1->SetKey();
Query1->FieldByName(«поле поиска»)->AsString=»что ищем»;
if (Query1->GotoKey())
// Нашли
else
// не нашли
Есть ещё GotoNearest() — поиск ближайшего.
!Синтаксис с билдера
SNike
-
#4
GoToKey, GoToNearest, FindNearest, FindKey — производят поиск по полям входящим в состав текущего индекса
Locate, Lookup — если поле поиска входит в состав индекса, этот индекс используется для поиска
Guest
-
#5
Попробуй так:
For i:=0 to Table1.RecordCount-1 do
begin
Table1.First;
Table1.Fields.Fields[гомер столбца].Text:=’что ищем’;
end;
если не получится поставь Table1.First перед циклом
SNike
-
#6
<!—QuoteBegin-Дрон+29:06:2007, 16:08 —>
<span class=»vbquote»>(Дрон @ 29:06:2007, 16:08 )</span><!—QuoteEBegin—>For i:=0 to Table1.RecordCount-1 do
begin
Table1.First;
Table1.Fields.Fields[гомер столбца].Text:=’что ищем’;
end;
[snapback]70904″ rel=»nofollow» target=»_blank[/snapback]
[/quote]
Ага, хороший вариант.
Предположим, RecordCount = 10000
Значит 10000 раз будем возвращаться к первой записи :blink:
1. Нужно First поставить до цикла
2. После Table1.Fields.Fields[гомер столбца].Text:=’что ищем’ осуществлять переход на следующую запись, иначе будет 10000 раз сравнивать одну и ту же запись
3. Fields[гомер столбца].Text — не существует. Есть Fields[гомер столбца].AsString;
4. Вместо Fields[гомер столбца] лучше использовать FieldByName, иначе если изменим структуру БД и это поле станет не третьим а четвертым, то придется сами знаете что делать
5. Если запись найдена — прервать цикл, например командой Break, иначе будет шерстить дальше
6. У Table нет ни First, ни RecordCount, нужно использовать Table.DataSource.DataSet
7. Лучше использовать такое
Код:
With Table.DataSource.DataSet do
begin
First; // перейдем к первой записи
While not EOF do begin // пока не достигнут конец базы
if FieldByName(ИмяПоля) = ИскомоеЗначение
then begin
ShowMessage('Ура, нашли !'); // выведем сообщение о том что нашли нужное
Break; // прервем цикл чтоб не гоняться по базе зря
end else Next; // а не нашли - так перейдем к следующей
end;
end;
8. А еще лучше — использовать выше упомянутые Locate (Lookup), или запрос SQL
SNike
-
#7
<!—QuoteBegin-dzhserv+26:06:2007, 16:47 —>
<span class=»vbquote»>(dzhserv @ 26:06:2007, 16:47 )</span><!—QuoteEBegin—>примерно как в 1С поиск по
значению введенных букв
в поле
[snapback]70651″ rel=»nofollow» target=»_blank[/snapback]
[/quote]
Тут нужно использовать Locate, т.к. есть опции полного или частичного совпадения, с учетом регистра или без него. Или опять же запрос SQL c использованием LIKE, а при использовании цикла будет большая задержка между каждой набранной буквы. Если нужно — могу дать пример
LAW
-
#8
GoToKey, GoToNearest, FindNearest, FindKey — производят поиск по полям входящим в состав текущего индекса
Locate, Lookup — если поле поиска входит в состав индекса, этот индекс используется для поиска
Я использую в своей работе для доступа к БД сторонние компоненты Advantage Database System. В них Locate, Lookup работает по скорости как Filter в Dataset, то есть не используя индексы. Если в других компонентах индексы задействованы, то я только рад.
А SELECT LIKE вообще идеальный вариант.