Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Почему не получается переопределить свойство DataSource у потомка   Найти похожие ветки 

 
Michael5   (2005-08-15 08:59) [0]

DBGrid? Пишет ошибку - неизвестный идентификатор... А вроде все делаю правильно. Подскажите пожалуйста!


unit MyGrid;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DBGrids, DB, ADODB, StdCtrls;

type
 TMyDatabaseGrid = class (TDBGrid)
 private
   FADOConnection: TADOConnection;
   FADOTable: TADOTable;
   FConnectionString: WideString;
   FDataSource: TDataSource;
   FLabel: TLabel;
   function GetConnectionString: WideString;
   procedure SetConnectionString(Value: WideString);
 public
   constructor Create(AOwner:TComponent); override;
   property DataSource;//вот что здесь неправильно???
 published
   property ConnectionString: WideString read GetConnectionString write
           SetConnectionString;
 end;
 

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("MyGrid", [TMyDatabaseGrid]);
end;

{
******************************* TMyDatabaseGrid ********************************
}
constructor TMyDatabaseGrid.Create(AOwner:TComponent);
begin
       inherited Create(AOwner);
       FLabel:=TLabel.Create(Self);
       FLabel.Caption:="MyDBGrid";
       FLabel.Top:=2;
       FLabel.Left:=20;
       FLabel.Parent:=Self;
       FLabel.Visible:=false;
       //******************************************
       
       FADOConnection:=TADOConnection.Create(Self);
       FADOTable:=TADOTable.Create(Self);
       FDataSource:=TDataSource.Create(Self);
       FADOTable.Connection:=FADOConnection;
       FDataSource.DataSet:=FADOTable;
       
      TMyDatabaseGrid.DataSource:=FDataSource;//на эту строку и ругается!
end;

function TMyDatabaseGrid.GetConnectionString: WideString;
begin
end;

procedure TMyDatabaseGrid.SetConnectionString(Value: WideString);
begin
   if ConnectionString <> Value then
   begin
 //    MyADOConnection.CheckInactive;
     FADOConnection.ConnectionString := Value;
     ConnectionString := Value;
     FConnectionString := Value;
   end;
end;

end.


 
Anatoly Podgoretsky ©   (2005-08-15 09:13) [1]

Это приватное поле.


 
Michael5   (2005-08-15 11:19) [2]

Почему приватное?
 TDBGrid = class(TCustomDBGrid)
 public
   property Canvas;
   property SelectedRows;
 published
   property Align;
   property Anchors;
   property BiDiMode;
   property BorderStyle;
   property Color;
   property Columns stored False; //StoreColumns;
   property Constraints;
   property Ctl3D;
   property DataSource;
...


 
Reindeer Moss Eater ©   (2005-08-15 14:14) [3]

TMyDatabaseGrid.DataSource:=FDataSource;//на эту строку и ругается!

Правильно делает что ругается.
Полям экземпляра надо присваивать значения, а не полям класса


 
tesseract ©   (2005-08-15 14:38) [4]

поле объявлено как published, public  лучше не объявлять, если и получится то скорей всего будет сбоить.
>>TMyDatabaseGrid.DataSource:=FDataSource;

Свойству нельзя так присваивать. Ему присвоены  методы OnDataSourceRead и OnDataSourceWrite которые непосредственно и отвечают за чтение и запись. И скорее всего в тот же FDataSource.

Moss Eater тоже прав, писать нужно так DataSource:=FDataSource - но зачем ???? Ведь FDataSource и есть поле где хранится DAtaSource.


 
Наиль ©   (2005-08-15 22:18) [5]

Где-то прочитал, что published-свойство, можно и иногда нужно делать public.
Эта возможность предусмотрена Borland"ом для скрытия свойств из Инспектора объектов.
А что касается ошибочной строчки, то всё очень просто.
Убери из декларации FDataSource. Всё равно DataSource будет использовать переменую описаную в предке.
Убери из декларации property DataSource, если хочешь оставить оставить свойсво в инспекторе.
А строчки
FDataSource.DataSet:=FADOTable;
TMyDatabaseGrid.DataSource:=FDataSource

замени на
DataSource.DataSet:=FADOTable
И тогда будет тебе Счастье.


 
Юрий Зотов ©   (2005-08-16 00:05) [6]

> Наиль ©   (15.08.05 22:18) [5]

> Где-то прочитал, что published-свойство, можно и иногда нужно
> делать public.

Можно. Но не нужно. Потому что это все равно ничего не даст.

> Эта возможность предусмотрена Borland"ом для скрытия свойств
> из Инспектора объектов.

Не верьте. Лучше проверьте. Не предусмотрено такое Borland"ом.

> Michael5   (15.08.05 08:59)

Если хотите спрятать DataSource, то наследуйтесь от TDCustomBGrid и публикуйте только те свойства, которые нужны (по образцу TDBGrid).


 
Наиль ©   (2005-08-16 16:30) [7]

Спасибо Юрий, что разъяснили про published->public. Этим методом для скрытия не пользовался, поэтому не был уверен, что прав.


 
Юрий Зотов ©   (2005-08-16 18:22) [8]

> Наиль ©   (16.08.05 16:30) [7]

Свойство можно убрать из ИО, если зарегистрировать для него "пустой" редактор (то есть, при вызове RegisterPropertyEditor указать nil вместо класса редактора).

Но спрячется оно только для ИО, а для кода все равно останется доступным. В Delphi нет способа понизить видимость членов класса в классе-потомке.

P.S.
Если в книжке написано обратное, то возникают очень серьезные сомнения в компетентности ее автора.


 
Наиль ©   (2005-08-16 22:57) [9]

> [8]

> Свойство можно убрать из ИО, если зарегистрировать для него
> "пустой" редактор (то есть, при вызове RegisterPropertyEditor
> указать nil вместо класса редактора).


Не смотря на то, что этот совет Вы не однократно дайте в течении многих лет. Я им так и не воспользовался. Мне проще было переопределить свойство как ReadOnly.


 
Наиль ©   (2005-08-17 00:11) [10]

Я поискал тот совет, на который опирался сам.
http://lib.profi.net.ua/doc/info_sites/visprog/books/delphi5books/2/DT/HIDEPROP.HTM
Там не совсем то, что я посоветовал. Поэтому проверил, соответсвует ли этот совет действительности. Вывод был не утешительный: не соответсвует.


 
Юрий Зотов ©   (2005-08-17 07:06) [11]

> Наиль ©   (17.08.05 00:11) [10]

Заглянул по ссылке. Потрясающе. Я буквально в шоке.

Ведь об этом писал еще Конопка, еще про Delphi 1, еще лет 7 тому назад (а Конопке стоит верить, он зря не говорит, вот чесс-слово). И это - азбука Дельфишной модели ООП. Более того, это же элементарно проверяется. И, тем не менее, даются вот такие "советы".

Потрясающе. Я буквально в шоке.

Млин, как же много "компонент райтеров" и как же мало разработчиков компонентов.



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
3-1133847253
ShiFT
2005-12-06 08:34
2006.02.05
программа построения cхемы связей


15-1137157638
psa247
2006-01-13 16:07
2006.02.05
Матрицы LCD - мониторов !


10-1112874471
Jackers
2005-04-07 15:47
2006.02.05
ActiveX библиотека


6-1129028584
DelphiN!
2005-10-11 15:03
2006.02.05
Проверка доступности интернета(через прокси)


15-1137106561
LordOfRock
2006-01-13 01:56
2006.02.05
Всколыхнём забытое?