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

Вниз

Двойной грид.   Найти похожие ветки 

 
NiGGa ©   (2006-08-15 14:31) [0]

Доброго времени суток.

Собственно задумал я заиметь компонент, который сосотоит из двух гридов и сплиттера между ними. Технология как бы простая, беру панельку и накидываю на нее то, чего хочеться, а именно указанные три контрола. Вопрос в том, как заставить получившийся компонент вести себя как грид, т.е. что бы он был наследником от TCustomGrid и у него были доступны все свойства грида изморфно одному из гридов размещенных на панели.

Спасибо.


 
DimaBr   (2006-08-15 15:08) [1]

1. вывести на поверхность гриды и сплиттер в качестве свойств
2. породить компонент от TCustomGrid, переопределив свойства и методы.


 
NiGGa ©   (2006-08-15 16:19) [2]

Т.е. компонент одновременно наследник TPanel  и TCustomGrid, или только TCustomGrid? Как тогда остальных увязать?

2. Вот меня собственно интересовало как это переопределение происходит.


 
clickmaker ©   (2006-08-15 17:14) [3]


> изморфно одному из гридов размещенных на панели.

TDualGrid = class (TWinControl)
...
property Grid: TCustomGrid read GetGrid;

...

function TDualGrid.Grid: TCustomGrid;
begin
  if FGrid1.Focused then
    Result := FGrid1
  else
    Result := FGrid2;
end;


так, что ли?


 
StriderMan ©   (2006-08-15 17:36) [4]


> .е. компонент одновременно наследник TPanel  и TCustomGrid

множественное наследование в делфях к сожалению не реализовано. (а может к счастью...)


 
Юрий Зотов ©   (2006-08-15 22:32) [5]

Сделайте фрейм, зарегистрируйте его в палитре.


 
DimaBr   (2006-08-16 09:12) [6]


> 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;


 
Юрий Зотов ©   (2006-08-16 09:24) [7]

Свойства невиртуальны. Со всеми вытекающими.


 
DimaBr   (2006-08-16 10:11) [8]


> Юрий Зотов ©

То есть вы считаете, что при добавления свойства как я написал не позволит выполнить некоторые действия при обращении к свойству. (на ГРИД кидаем два грида и сплитер)


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;


 
NiGGa ©   (2006-08-17 15:45) [9]

Спасибо всем. Собственно многое вы прояснили, так что на данный момент вопросов нет.


 
Юрий Зотов ©   (2006-08-17 23:33) [10]

> 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; //!!!


 
DimaBr   (2006-08-18 08:48) [11]


> Юрий Зотов ©   (17.08.06 23:33) [10]

var Grid: TMyGrid; // !!!
или
TMyGrid(Grid).ColCount := 10;


Иначе ColCount вне досягаемости.


 
Юрий Зотов ©   (2006-08-18 16:03) [12]

> DimaBr   (18.08.06 08:48) [11]

Замените предка на TStringGrid - увидите, в чем тут фокус.

PS
Можно было б и догадаться.
:о)


 
DimaBr   (2006-08-21 12:01) [13]

Заменил, фокуса не видно. Юрий, раскройте пожалуйста секрет.


 
Юрий Зотов ©   (2006-08-21 16:44) [14]

Да какой там секрет...

Grid создается, как TMyGrid, но объявлен, как TStringGrid. Поэтому при назначении ColCount реально назначается TStringGrid.ColCount, а не TMyGrid.ColCount. Это и есть иллюстрация того, что свойства невиртуальны.

Не уверен, но насколько помню, методы доступа к свойству (Get/Set) могут быть виртуальными - вот тогда и свойство станет как бы виртуальным. Но если в предке оно статическое, то в потомке уже никуда не денешься, в потомке можно будет только ЗАкрыть свойство, но не ПЕРЕкрыть его - и тогда возникает опасность, которая была проиллюстрирована. Мы же не знаем заранее, какого типа переменную объевит юзер - а он запросто может объявить ее с типом предка и тогда наш компонент будет работать неверно.


 
Ketmar ©   (2006-08-21 22:18) [15]

> [14] Юрий Зотов ©   (21.08.06 16:44)
да. "читалки" и "писалки" -- могут. с соответствующим поведением.


 
DimaBr   (2006-08-22 11:06) [16]


>  Поэтому при назначении 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;


 
Юрий Зотов ©   (2006-08-22 13:54) [17]

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 14:39) [18]

Так естественно не работает, поэтому
> DimaBr   (18.08.06 08:48) [11]
>
> var Grid: TMyGrid; // !!!
> или
> TMyGrid(Grid).ColCount := 1;


 
Юрий Зотов ©   (2006-08-22 15:02) [19]

> DimaBr   (22.08.06 14:39) [18]

А между тем, любой компонент обязан работать без всякого приведения типов юзером.


 
DimaBr   (2006-08-22 15:30) [20]


> Юрий Зотов ©   (22.08.06 15:02) [19]

Согласен, тогда и объявлять нужно компонент того типа которого хотим. (var Grid: TMyGrid). Всё таки Delphi типизированный язык. "Назвался груздем - полезай в кузов."


 
Юрий Зотов ©   (2006-08-22 16:48) [21]

> 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-23 08:28) [22]


> Юрий Зотов ©   (22.08.06 16:48) [21]

Убили наповал. Спасибо.


 
NiGGa ©   (2006-08-28 13:33) [23]

А возможно ли сделать так что-бы этот 2-грид, кастился как TCustomGrid?


 
Наиль ©   (2006-08-28 13:42) [24]

Что такое кастился?


 
NiGGa ©   (2006-09-01 11:45) [25]

приведение типов



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

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

Наверх




Память: 0.53 MB
Время: 0.018 c
15-1180987047
Курдль
2007-06-04 23:57
2007.07.08
Поиск работников.


11-1161871469
MTsv DN
2006-10-26 18:04
2007.07.08
Перевод проекта на UNICODE...


2-1181973389
Kolan
2007-06-16 09:56
2007.07.08
Сообщение TStringGrid что закончили редактировать ячейку, есть?


3-1176198348
rexti
2007-04-10 13:45
2007.07.08
как создать таблицу dbase


15-1181096515
Slider007
2007-06-06 06:21
2007.07.08
С днем рождения ! 6 июня 2007 среда