Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Двойной грид. [D5, D7, Win2k]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо