Форум: "Компоненты";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
ВнизПочему не получается переопределить свойство 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c