![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Событие "AfterOpen" в TDBGrid
AlexAA © (2010-02-24 11:38:00)Добрый день!
Как в TDBGrid'e поймать момент выполнения запроса? А еще лучше момент, когда запрос только выполнился и данные получены.
Уточню: DataSet'ом является TADOQuery.
(2010-02-25 15:48:00) [1]Удалено модератором
Примечание: п. 5 правил
Ega23 (2010-02-25 15:16:00) [2]
> 12 © (25.02.10 14:01) [28]
>
> работает
Не сомневаюсь. А если varубрать из конструктора? :)))
12 (2010-02-25 14:01:00) [3]работает
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure ADOQuery1AfterOpen(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyParse = class
// FQ:TADOQuery;
foo:procedure(ds:tdataset);
public
Constructor Create(var AQ:TadoQuery);
procedure Parse(DataSet: TDataSet);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyParse }
procedure TForm1.Button1Click(Sender: TObject);
var MP:TMyParse;
begin
MP:=TMyParse.Create(ADOQuery1);
end;
constructor TMyParse.Create(var AQ: TadoQuery);
begin
//FQ:=AQ;
foo:=addr(AQ.AfterOpen);
AQ.AfterOpen:=Parse;
end;
procedure TMyParse.Parse(DataSet: TDataSet);
begin
showmessage('TMyParse.Parse work');
if addr(foo) <> nil then foo(DataSet);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery1.Close;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ADOQuery1.open;
end;
procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
begin
showmessage('');
end;
Ega23 (2010-02-25 13:31:00) [4]
> можно с самим переданным ADOQUERY, но тогда как var его
> передавать
Уверен?
12 (2010-02-25 13:21:00) [5]получил ADOQUERY. Надо его метод афтеопен дополнить
можно FQ направить на ADOQUERY и работать с FQ
можно с самим переданным ADOQUERY, но тогда как var его передавать
Ega23 (2010-02-25 13:13:00) [6]
> дык у меня FQ.AfterOpen:=Parse;
И чо? А у меня плита газовая.
12 (2010-02-25 12:50:00) [7]
> А зачем var? Ты собираешься менячть значение указателя ADOQuery1?
дык у меня FQ.AfterOpen:=Parse;
а можно что_передали. AfterOpen:=Parse; тогда var и без FQ
но не нравится что-то мне это. Чувствую что фигня :)
Ega23 (2010-02-25 12:43:00) [8]
> всмысле Create(var ADOQuery1); ?
А зачем var? Ты собираешься менячть значение указателя ADOQuery1?
12 (2010-02-25 11:23:00) [9]
> Нафига FQ нужно?
всмысле Create(var ADOQuery1); ?
Ega23 (2010-02-25 11:12:00) [10]
> Покритикуйте. Ногами тоже можно :)
Нафига FQ нужно?
12 (2010-02-25 11:05:00) [11]Покритикуйте. Ногами тоже можно :)
TMyParse = class
FQ:TADOQuery;
foo:procedure(ds:tdataset);
public
Constructor Create(AQ:TadoQuery);
procedure Parse(DataSet: TDataSet);
end;
-----
procedure TForm1.Button1Click(Sender: TObject);
var MP:TMyParse;
begin
MP:=TMyParse.Create(ADOQuery1);
end;
constructor TMyParse.Create(AQ: TadoQuery);
begin
FQ:=AQ;
foo:=addr(FQ.AfterOpen);
FQ.AfterOpen:=Parse;
end;
procedure TMyParse.Parse(DataSet: TDataSet);
begin
showmessage('TMyParse.Parse work');
if addr(foo) <> nil then foo(DataSet);
end;
12 (2010-02-25 10:04:00) [12]
> Ловить открытие датасета нужно для построения некоева подкомпонента
> для внутренних нужд
а что если добавить в этот подкомпанент ссылку на ADOQuery и чиститься/парсится по возникновению события афтеопен привязанного к нему ADOQuery
sniknik (2010-02-25 09:36:00) [13]> такая задача передо мной ставится впервые
я тебя наверное разочарую, но задачадо сих пор не озвучена, то что ты тут преподносишь как задачу на самом деле методы решения (до сих пор не пойми чего).ф
Ega23 (2010-02-25 08:48:00) [14]А ещё у TADODataSet есть свойство Sort
AlexAA (2010-02-25 08:45:00) [15]
> Посмотри на такую конструкцию
>
> Select T1.Field1, T2.Field2
> from Table1 T1, Table2 T2
> where ....
> Order By 1;
Тоже врядли подойдет, потому что колонки могут перемещаться, а после перемещения уже не представится возможным определить точно по какой колонке была сортировка. Хотя этот способ действительно упростит жизнь, например можно хранить список TList на TColumns, по которым осуществляется сортировка + нужно донавернуть TList по поводу направления сортировки(Asc, Desc)
Ega23 (2010-02-24 15:36:00) [16]
> еще нужен алиас таблицы. как раз этим и занимается класс
> "TSQLFields"
Посмотри на такую конструкцию
Select T1.Field1, T2.Field2
from Table1 T1, Table2 T2
where ....
Order By 1;
AlexAA (2010-02-24 15:33:00) [17]еще нужен алиас таблицы. как раз этим и занимается класс "TSQLFields"
AlexAA (2010-02-24 15:31:00) [18]
> т.к. я вполне могу вместо текста "Select .... from ....
> Order By ....." вызывать какую-нибудь хранимку.
> Это раз.
> Никто не застрахован от запроса Select Фамилия + ' ' + Имя
> + ' ' + Отчество as ФИО Order By Фамилия, Имя, Отчество
> Т.е. сортировка по трём реальным полям в БД, но в финальном
> наборе данных - одно поле.
> Это два.
> Посмотри в сторону TDBGrid.Columns[Index].FieldName
> Это три.
Вот как раз от пункта 3 пытаюсь уйти, т.к. если "select t1.Name as Name1, t2.Name as Name2 from t1, t2 where... order by TDBGrid.Columns[1].FieldName" выдаст ошибку на сервере.
Пункт 1 и 2 не принципиален, т.к. grid не на отдачу(продажу), а для меня.
Ega23 (2010-02-24 14:54:00) [19]
> Ловить открытие датасета нужно для построения некоева подкомпонента
> для внутренних нужд. В этом подкомпоненте парсится весь
> текст запроса на составные части. В общем эти данные нужны
> только в двух случаях: 1) При поднятии формы выбора полей
> сортировки. 2) При клике с альтом на заголовоке.
>
Понятно. Вобщем так, ИМХО - подход в корне неверный, т.к. я вполне могу вместо текста "Select .... from .... Order By ....." вызывать какую-нибудь хранимку.
Это раз.
Никто не застрахован от запросаSelect Фамилия + ' ' + Имя + ' ' + Отчество as ФИО Order By Фамилия, Имя, Отчество
Т.е. сортировка по трём реальным полям в БД, но в финальном наборе данных - одно поле.
Это два.
Посмотри в сторонуTDBGrid.Columns[Index].FieldName
Это три.
Anatoly Podgoretsky (2010-02-24 14:52:00) [20]
> Так в том и дело, что нужно определить событие в TDBGrid'e.
>
>
> В ADOQuery не подходит.
А в TDBGrid'e нет ни данных, ни зпросов. AfterOpen датасета как раз нужное событие. Датасет уже открыт *выполнен запрос и открыта таблица.