Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как узнать количество строк в DBGrid?

12K
13 декабря 2006 года
Шмель
20 / / 20.04.2006
Зравствуйте!
Для удобства пользователя при сортировке по заданной колонке хочу, чтобы строчка бывшая активной до сортировки осавалась такой-же после сортировки, при этом в той же позиции относительно видимых строк в DBGrid'е (допустим 5-ая сверху или посередине). Поскольку для сортировки использую динамически меняющийся запрос, то необходимо ещё и искать бывшую активной запись и устанавливать её в активное состояние, что и делаю методом Locate. Но в таком случае (поскольку Locate ищет последовательно), активная запись становится последней в DBGrid'е (среди видимых записей).
Теперь не понятное. Возможности стандартными средствами выставить нужную строку в середину путём смещения "окна DBGrid'а" относительно всего списка я не нашел (использую IBDataSet). Выход вижу в принудительном "дополнительном" пролистываниии вниз (чтобы поднять строчку вверх) и смещении курсора на столько-же строчек вверх (для восстановления активности искомой строчки). Но как узнать сколько записей видны в DBGrid'е? В существующей иерархии:
TCustomGrid->TCustomDBGrid->TDBGrid у TCustomGrid есть свойство RowCount - количество строк, но оно по легенде - protected ( это privat? ). До него можно достучаться или к нему доступ совсем закрыт?
Может есть другие варианты?
Спасибо.

PS: Использовать EhLib не очень хочется - дополнительно изучать и много переделывать. Да и они ведь как-то это всё сделали на основе стандартных средств?
92
13 декабря 2006 года
Тень Пса
2.2K / / 19.10.2006
не то не то не то..... извините :(
12K
14 декабря 2006 года
Шмель
20 / / 20.04.2006
Цитата: Шмель

...Но как узнать сколько записей видны в DBGrid'е? В существующей иерархии:
TCustomGrid->TCustomDBGrid->TDBGrid у TCustomGrid есть свойство RowCount - количество строк, но оно по легенде - protected ( это privat? ). До него можно достучаться (прочитать) или к нему доступ совсем закрыт?...



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

92
14 декабря 2006 года
Тень Пса
2.2K / / 19.10.2006
вот, втупую копирую тебе свой цпп-файл.
значится создаешь класс, в котором делаешь RowCount в public.
потом свой DBGrid приводиш к этому классу, и вуа ля =)

показывает 2, ибо в пустом DBGrid'е 2 строки и 2 колонки =)

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

class THackGrid : public TCustomGrid {
      public:
      __property RowCount;
};

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage(IntToStr(((THackGrid*)dbg)->RowCount));
}
//---------------------------------------------------------------------------
12K
15 декабря 2006 года
Шмель
20 / / 20.04.2006
Цитата: Тень Пса
вот, втупую копирую тебе свой цпп-файл.
значится создаешь класс, в котором делаешь RowCount в public.
потом свой DBGrid приводиш к этому классу, и вуа ля =)...


Ммм... можно еще вопросик? А что значит свой DBGrid привести к новому классу? DBGrid уже является наследником оригинального класса со своими новыми свойствами и методами. Это что, он меняет родителя и становится наследником измененного класса??? Опиши, пожалуйста, в кратце, чтобы знать куда копать, а то я этого не знаю.
Спасибо.

PS: Я тоже хочу "вуа ля" ... 8)

92
15 декабря 2006 года
Тень Пса
2.2K / / 19.10.2006
в коде же все написано....

 
Код:
((THackGrid*)dbg)->RowCount;


вот я перед этим объявил класс, в котором св-во RowCount кинул в public, а теперь я просто обращаюсь к своему dbg (он же TDBGrid), а точнее к его свойству RowCount..... то есть ты как бы объекту открываешь свойство для "общего пользования"....

 
Код:
class THackGrid : public TCustomGrid {
      public:
      __property RowCount;
};


не надо менять сорцов и тд ) так проще и работает )

PS: спрашивал про RowCount, вот тебе про RowCount =))))))
12K
15 декабря 2006 года
Шмель
20 / / 20.04.2006
[QUOTE=Тень Пса;160598]
Гм... классно. Читать такие свойства теперь получается. Спасибо!
Это что, хакерский способ? Или это нормальный способ? А нарушений памяти здесь нет? Вроде нет.

PS: Возможно ли изменять такие свойства? Я подозреваю что нет.
92
15 декабря 2006 года
Тень Пса
2.2K / / 19.10.2006
вот чесслово не пробовал изменять ))) попробуй в пустом проекте ))

способ как способ, пользовал когда-то просто, откопал... а потом вспомнил , что находил его в инете.... ну и щаз по ключевому слову THackGrid найдешь в гугле сразу дофига таких примеров )))))

и изменять должно получится ) ты ж просто свойство открываешь, и ничего больше не меняешь, соотвессна метод на чтение и запись остаются, если они вообще были...
10
15 декабря 2006 года
Freeman
3.2K / / 06.03.2004
Цитата: Шмель
PS: Возможно ли изменять такие свойства? Я подозреваю что нет.


Зависит от наличия метода write при описании оригинального свойства, в данном случае - у TCustomGrid. В зависимости от реализации перекрытого метода write (если вообще допускается перекрытие) в наследниках изменение "хакнутых" свойств может происходить как штатно, так и быть саботажем.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог