Как узнать количество строк в DBGrid?
Для удобства пользователя при сортировке по заданной колонке хочу, чтобы строчка бывшая активной до сортировки осавалась такой-же после сортировки, при этом в той же позиции относительно видимых строк в DBGrid'е (допустим 5-ая сверху или посередине). Поскольку для сортировки использую динамически меняющийся запрос, то необходимо ещё и искать бывшую активной запись и устанавливать её в активное состояние, что и делаю методом Locate. Но в таком случае (поскольку Locate ищет последовательно), активная запись становится последней в DBGrid'е (среди видимых записей).
Теперь не понятное. Возможности стандартными средствами выставить нужную строку в середину путём смещения "окна DBGrid'а" относительно всего списка я не нашел (использую IBDataSet). Выход вижу в принудительном "дополнительном" пролистываниии вниз (чтобы поднять строчку вверх) и смещении курсора на столько-же строчек вверх (для восстановления активности искомой строчки). Но как узнать сколько записей видны в DBGrid'е? В существующей иерархии:
TCustomGrid->TCustomDBGrid->TDBGrid у TCustomGrid есть свойство RowCount - количество строк, но оно по легенде - protected ( это privat? ). До него можно достучаться или к нему доступ совсем закрыт?
Может есть другие варианты?
Спасибо.
PS: Использовать EhLib не очень хочется - дополнительно изучать и много переделывать. Да и они ведь как-то это всё сделали на основе стандартных средств?
...Но как узнать сколько записей видны в DBGrid'е? В существующей иерархии:
TCustomGrid->TCustomDBGrid->TDBGrid у TCustomGrid есть свойство RowCount - количество строк, но оно по легенде - protected ( это privat? ). До него можно достучаться (прочитать) или к нему доступ совсем закрыт?...
Народ, может хоть с этим поможите? Проект уже почти сделан, а сортировка при этом получается не очень удобной. Всё переделывать ой как не хочется, и пока на этом застопорился.
значится создаешь класс, в котором делаешь 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));
}
//---------------------------------------------------------------------------
значится создаешь класс, в котором делаешь RowCount в public.
потом свой DBGrid приводиш к этому классу, и вуа ля =)...
Ммм... можно еще вопросик? А что значит свой DBGrid привести к новому классу? DBGrid уже является наследником оригинального класса со своими новыми свойствами и методами. Это что, он меняет родителя и становится наследником измененного класса??? Опиши, пожалуйста, в кратце, чтобы знать куда копать, а то я этого не знаю.
Спасибо.
PS: Я тоже хочу "вуа ля" ... 8)
вот я перед этим объявил класс, в котором св-во RowCount кинул в public, а теперь я просто обращаюсь к своему dbg (он же TDBGrid), а точнее к его свойству RowCount..... то есть ты как бы объекту открываешь свойство для "общего пользования"....
public:
__property RowCount;
};
не надо менять сорцов и тд ) так проще и работает )
PS: спрашивал про RowCount, вот тебе про RowCount =))))))
Гм... классно. Читать такие свойства теперь получается. Спасибо!
Это что, хакерский способ? Или это нормальный способ? А нарушений памяти здесь нет? Вроде нет.
PS: Возможно ли изменять такие свойства? Я подозреваю что нет.
способ как способ, пользовал когда-то просто, откопал... а потом вспомнил , что находил его в инете.... ну и щаз по ключевому слову THackGrid найдешь в гугле сразу дофига таких примеров )))))
и изменять должно получится ) ты ж просто свойство открываешь, и ничего больше не меняешь, соотвессна метод на чтение и запись остаются, если они вообще были...
Зависит от наличия метода write при описании оригинального свойства, в данном случае - у TCustomGrid. В зависимости от реализации перекрытого метода write (если вообще допускается перекрытие) в наследниках изменение "хакнутых" свойств может происходить как штатно, так и быть саботажем.