![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Двойной грид. [D5, D7, Win2k]
NiGGa © (2006-08-15 14:31:00)Доброго времени суток.
Собственно задумал я заиметь компонент, который сосотоит из двух гридов и сплиттера между ними. Технология как бы простая, беру панельку и накидываю на нее то, чего хочеться, а именно указанные три контрола. Вопрос в том, как заставить получившийся компонент вести себя как грид, т.е. что бы он был наследником от TCustomGrid и у него были доступны все свойства грида изморфно одному из гридов размещенных на панели.
Спасибо.
NiGGa (2006-09-01 11:45:00) [1]приведение типов
Наиль (2006-08-28 13:42:00) [2]Что такое кастился?
NiGGa (2006-08-28 13:33:00) [3]А возможно ли сделать так что-бы этот 2-грид, кастился как TCustomGrid?
DimaBr (2006-08-23 08:28:00) [4]
> Юрий Зотов © (22.08.06 16:48) [21]
Убили наповал. Спасибо.
Юрий Зотов (2006-08-22 16:48:00) [5]> DimaBr (22.08.06 15:30) [20]
Дим, зачем зря спорить? Вот очень распространенный пользовательский прием, используемый, когда в разных ситуациях требуется создавать компоненты разного класса, но имеющие общего предка.
type
TMyGrid1 = class(TStringGrid);
...
end;
TMyGrid2 = class(TStringGrid);
...
end;
TMyGrid3 = class(TStringGrid);
...
end;
TMyGridClass = class of TStringGrid;
function CreateRequiredGrid(GridClass: TMyGridClass): TStringGrid;
begin
Result := GridClass.Create(...)
end;
И все - приплыл компонент. А обязан работать.
DimaBr (2006-08-22 15:30:00) [6]
> Юрий Зотов © (22.08.06 15:02) [19]
Согласен, тогда и объявлять нужно компонент того типа которого хотим. (var Grid: TMyGrid). Всё таки Delphi типизированный язык. "Назвался груздем - полезай в кузов."
Юрий Зотов (2006-08-22 15:02:00) [7]> DimaBr (22.08.06 14:39) [18]
А между тем, любой компонент обязан работать без всякого приведения типов юзером.
DimaBr (2006-08-22 14:39:00) [8]Так естественно не работает, поэтому
> DimaBr (18.08.06 08:48) [11]
>
> var Grid: TMyGrid; // !!!
> или
> TMyGrid(Grid).ColCount := 1;
Юрий Зотов (2006-08-22 13:54:00) [9]var
Grid: TStringGrid;
procedure TMyGrid.SetColCount(const Value: longint);
begin
Inherited ColCount := Value * 2;
ShowMessage('OK')
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
...
Grid.ColCount := 1
end;
DimaBr (2006-08-22 11:06:00) [10]
> Поэтому при назначении ColCount реально назначается TStringGrid.
> ColCount
А у меня реально назначается НЕ StringGrid.ColCount. В итоге, на форме грид с двумя колонками. Может я чего то не догоняю, но никак не могу добится ваших условий.
type
TMyGrid = class(TStringGrid)
private
function GetColCount: longint;
procedure SetColCount(const Value: longint);
published
property ColCount:longint read GetColCount write SetColCount;
end;
var
Grid: TCustomGrid; //!!!
Form1: TForm1;
implementation
{$R *.dfm}
function TMyGrid.GetColCount: longint;
begin
Result := Inherited ColCount div 2;
end;
procedure TMyGrid.SetColCount(const Value: longint);
begin
Inherited ColCount := Value * 2;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Grid := TMyGrid.Create(self);
Grid.Parent := form1;
TMyGrid(Grid).ColCount := 1;
end;
Ketmar (2006-08-21 22:18:00) [11]> [14] Юрий Зотов © (21.08.06 16:44)
да. "читалки" и "писалки" -- могут. с соответствующим поведением.
Юрий Зотов (2006-08-21 16:44:00) [12]Да какой там секрет...
Grid создается, как TMyGrid, но объявлен, как TStringGrid. Поэтому при назначении ColCount реально назначается TStringGrid.ColCount, а не TMyGrid.ColCount. Это и есть иллюстрация того, что свойства невиртуальны.
Не уверен, но насколько помню, методы доступа к свойству (Get/Set) могут быть виртуальными - вот тогда и свойство станет как бы виртуальным. Но если в предке оно статическое, то в потомке уже никуда не денешься, в потомке можно будет только ЗАкрыть свойство, но не ПЕРЕкрыть его - и тогда возникает опасность, которая была проиллюстрирована. Мы же не знаем заранее, какого типа переменную объевит юзер - а он запросто может объявить ее с типом предка и тогда наш компонент будет работать неверно.
DimaBr (2006-08-21 12:01:00) [13]Заменил, фокуса не видно. Юрий, раскройте пожалуйста секрет.
Юрий Зотов (2006-08-18 16:03:00) [14]> DimaBr (18.08.06 08:48) [11]
Замените предка на TStringGrid - увидите, в чем тут фокус.
PS
Можно было б и догадаться.
:о)
DimaBr (2006-08-18 08:48:00) [15]
> Юрий Зотов © (17.08.06 23:33) [10]
var Grid: TMyGrid; // !!!
или
TMyGrid(Grid).ColCount := 10;
Иначе ColCount вне досягаемости.
Юрий Зотов (2006-08-17 23:33:00) [16]> DimaBr (16.08.06 10:11) [8]
type
TMyGrid = class(TCustomGrid)
...
published
property ColCount... read ... write SetColCount...;
end;
procedure TMyGrid.SetColCount(...);
begin
...
ShowMessage(...)
end;
var
Grid: TCustomGrid; //!!!
...
Grid := TMyGrid.Create(...); //!!!
Grid.ColCount := 10; //!!!
NiGGa (2006-08-17 15:45:00) [17]Спасибо всем. Собственно многое вы прояснили, так что на данный момент вопросов нет.
DimaBr (2006-08-16 10:11:00) [18]
> Юрий Зотов ©
То есть вы считаете, что при добавления свойства как я написал не позволит выполнить некоторые действия при обращении к свойству. (на ГРИД кидаем два грида и сплитер)
TMyGrid = class(TCustomGrid)
published
property ColCount: Longint read GetColCount write SetColCount default 5;
end;
procedure TMyGrid.SetColCount( const Value: LongInt);
begin
inherited ColCount := Value;
Grid1.ColCount := Value;
Grid2.ColCount := Value;
end;
Юрий Зотов (2006-08-16 09:24:00) [19]Свойства невиртуальны. Со всеми вытекающими.
DimaBr (2006-08-16 09:12:00) [20]
> 2. Вот меня собственно интересовало как это переопределение
> происходит.
Переопределить можно методы DINAMIC и VIRTUAL, а свойства пишем так
TMyGrid = class(TCustomGrid)
published
property ColCount: Longint read GetColCount write SetColCount default 5;
end;
function TMyGrid.GetColCount: LongInt;
begin
Result := inherited ColCount;
end;
procedure TMyGrid.SetColCount( const Value: LongInt);
begin
inherited ColCount := Value;
end;