Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.041 c
15-1181554954
Andy BitOff
2007-06-11 13:42
2007.07.08
Маленький чатик


15-1181192055
@!!ex_
2007-06-07 08:54
2007.07.08
Валидность указателя.


4-1169652134
Humorist
2007-01-24 18:22
2007.07.08
как получить изображение окна, которое скрыто другими


2-1180131936
Dmitry_177
2007-05-26 02:25
2007.07.08
FillChar для строки


15-1181308778
VICTOR_
2007-06-08 17:19
2007.07.08
чтение данных из COM-порта





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский