![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TopRow в DBGrid
PZ © (2006-11-08 18:44:00)Здравствуйте.
У меня простейшая база данных из одной таблицы, объемом порядка 2500 записей. Набор данных создается компонентом TClientDataSet и отображается компонентом DBRxGrid.
Мне хотелось бы, чтобы некая запись моей базы по заданному условию отображалась в верхней строчке DBRxGrid (какбы аналог свойства StringGrid.TopRow). Прошу дать практический совет, как реализовать эту задачу, желательно с примером. (Delphi 7)
С уважением, PZ
PZ (2006-11-09 16:56:00) [1]Наконец я сообразил, в чем дело.
Надо не ClientDataSet1 задействовать, а DBGrid, т. е. должно быть
ClientDataSet1.DataSource.DataSet.Locate('Nachalo', MyCode, []); // Здесь ошибка
DBGrid.DataSource.DataSet.Locate('Nachalo', MyCode, []); // Здесь и далее нет ошибки
Спасибо Anatoly Podgoretsky
Еще раз спасибо ЮЮ
Спасибо всем, принимавшим участникам обсуждения моего вопроса
С уважением, PZ
Anatoly Podgoretsky (2006-11-09 16:44:00) [2]> PZ (09.11.2006 16:34:31) [31]
Скриншот в студию, что бы был виден номер строки.
PZ (2006-11-09 16:34:00) [3]Вот именно в отладчике это сообщение и возникает
Anatoly Podgoretsky (2006-11-09 16:31:00) [4]> PZ (09.11.2006 16:20:29) [29]
А кто его знает, тут есть неизвестные переменные.
Но сообщение точно говорит, что, что-то не создано.
У тебя отладчик есть? Воспользуйся. Укажи строку где возникает ошибка.
PZ (2006-11-09 16:20:00) [5]> [28] Anatoly Podgoretsky © (09.11.06 16:05)
Что может быть не создано? Все же остальное работает, если не нажимать эту кнопку.
Anatoly Podgoretsky (2006-11-09 16:05:00) [6]> cds сокращение от ClientDataSet.
По ошибке, что то не создано.
PZ (2006-11-09 15:51:00) [7]Моя база данных содержится в файле типа .cds. Компонент Query ее не понимает.
Я записал обработчик с использованием ClientDataSet.
После запуска моей программы при нажатии на Button1 возникает ошибка со следующим сообщением:
Project TV_Viewer.exe raised exception class EAccessViolation with message 'Access Violation at address 00407816 in module 'TV_Viewer.exe'. Read address 00000030'. Process stoped....
Не могу понять в чем причина. Что делать?
type TDBGridAccess = class(TDBGrid); // для доступа к protected св-вам
procedure TTV_ViewerFrm.Button1Click(Sender: TObject);
var
MyCode : String[5];
code : integer;
delta : integer;
locateRow : integer;
totalRow : integer;
begin
MyCode := '15:45';
ClientDataSet1.DataSource.DataSet.Locate('Nachalo', MyCode, []); // Здесь ошибка
// Поле "Nachalo" типа String, Size = 5
locateRow := TDBGridAccess(DBGrid).DataLink.ActiveRecord;
totalRow := TDBGridAccess(DBGrid).DataLink.RecordCount;
delta := totalRow - 1;
ClientDataSet1.DataSource.DataSet.MoveBy(Delta);
if not ClientDataSet1.EOF then
ClientDataSet1.DataSource.DataSet.MoveBy(-Delta) // делаем её текущей
else
ClientDataSet1.DataSource.DataSet.MoveBy(-totalRow + locateRow + 1); // делаем её текущей
{
type TDBGridAccess = class(TDBGrid); // для доступа к protected св-вам
procedure TForm1.Button1Click(Sender: TObject);
var
code: integer;
delta: integer;
locateRow: integer;
totalRow: integer;
begin
code := StrToIntDef(Edit1.Text, -1);
Query1.Locate('Code', code, []);
locateRow := TDBGridAccess(DBGrid1).DataLink.ActiveRecord;
totalRow := TDBGridAccess(DBGrid1).DataLink.RecordCount;
delta := totalRow - 1;
Query1.MoveBy(delta); // "текущая" запись станет первой в гриде
if not Query1.EOF then
Query1.MoveBy(-delta) // делаем её текущей
else
Query1.MoveBy(-totalRow + locateRow + 1); // делаем её текущей
end;
}
end;
evvcom (2006-11-09 14:35:00) [8]> [11] ЮЮ © (09.11.06 03:36)
Телепат?
> [12] PZ (09.11.06 10:24)
> Вы действительно правильно поняли меня.
Телепат!
:-))))))))
PZ (2006-11-09 12:29:00) [9]Тип поля Nachalo? - String
ЮЮ, спасибо за помощь. Буду разбираться с Вашим кодом. Сожалею, что Вам пришлось потратить столько времени на меня.
С уважением PZ
ЮЮ (2006-11-09 12:27:00) [10]Побочный эффект: если запись не найдена, то текущая запись становится верхней в гриде.
Для избежания надо
if Query1.Locate('Code', code, []) then begin
...
end;
ЮЮ (2006-11-09 12:16:00) [11]// Сюда вставлял
Для начала напиши как обработчик на нажатие кнопки. После отладки вставляй этот метод куда хочешь.
Тип поля Nachalo?
Вот код, который делает то, что надо:
type TDBGridAccess = class(TDBGrid); // для доступа к protected св-вам
procedure TForm1.Button1Click(Sender: TObject);
var
code: integer;
delta: integer;
locateRow: integer;
totalRow: integer;
begin
code := StrToIntDef(Edit1.Text, -1);
Query1.Locate('Code', code, []);
locateRow := TDBGridAccess(DBGrid1).DataLink.ActiveRecord;
totalRow := TDBGridAccess(DBGrid1).DataLink.RecordCount;
delta := totalRow - 1;
Query1.MoveBy(delta); // "текущая" запись станет первой в гриде
if not Query1.EOF then
Query1.MoveBy(-delta) // делаем её текущей
else
Query1.MoveBy(-totalRow + locateRow + 1); // делаем её текущей
end;
PZ (2006-11-09 11:51:00) [12]Delphi 7, Win XP.
На форме DBRxGrid, DataSource, ClientDataSet
PZ (2006-11-09 11:41:00) [13]Код очень большой. Даю две характерные, на мой взгляд, процедуры:
procedure TTV_ViewerFrm.FormCreate(Sender: TObject);
begin
Try
ReadIniFile(); // Здесь получаю имя файла FileName
ClientDataSet1.LoadFromFile(ClientDataSet1.FileName);
ClientDataSet1.Open;
// DBGrid.DataSource.DataSet.Locate(Nachalo, '12:00', []); // Сюда вставлял
Except
MessageDlg(...);
End;
Init; // Здесь некоторые начальные условия
end; { TTV_ViewerFrm.FormCreate }
procedure TTV_ViewerFrm.PnButClick(Sender: TObject);
Var
S : String;
begin
If (Sender is TLbSpeedButton) then
begin
S := GetPoDate; // Здесь выборка по дате
ClientDataSet1.Filter := S;
ClientDataSet1.Filtered := True;
// Сортировать по номеру и началу
ClientDataSet1.IndexFieldNames := 'Nomer; Nachalo';
DBGrid.DataSource.DataSet.Locate(Nachalo, '12:00', []); // Сюда вставил
DBGrid.Refresh;
end;
end; { TTV_ViewerFrm.PnButClick }
ЮЮ (2006-11-09 11:32:00) [14]Ушел за кодом и не вернулся :)
ЮЮ (2006-11-09 11:19:00) [15]Тогда код приведи и в каком обработчике написано
PZ (2006-11-09 11:16:00) [16]Нет. Я же сказал, остаются первые 15 строчек вверху, а искомая запись где-то далеко внизу.
ЮЮ (2006-11-09 11:10:00) [17]
> Нет. Остаются первые 15 строчек вверху.
А никто этого на Шаг 1. и не обещал.
Вопрос был: Появилась в гриде?
PZ (2006-11-09 11:08:00) [18]Нет. Остаются первые 15 строчек вверху.
ЮЮ (2006-11-09 10:49:00) [19]НД - набор данных. DBGrid.DataSource. DataSet
> Та запись, которая должна быть первой находится где-нибудь
> на сотом или 321-м месте.
Шаг 1.
Сделать так, чтобы нужная запись оказалась на экране:
DBGrid.DataSource.DataSet.Locate(<ключевое поле>, <значение>, []);
Появилась в гриде?
PZ (2006-11-09 10:41:00) [20][13] ЮЮ © (09.11.06 10:28)
Я вывожу всю свою талицу в DBGrid. Высвечиваются первые 15 записей. Текущая - первая.
Та запись, которая должна быть первой находится где-нибудь на сотом или 321-м месте.
(Что такое НД - я не понимаю).