Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TopRow в DBGrid


Страницы:   1 2

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-м месте.
(Что такое НД - я не понимаю).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо