Текущий архив: 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.5 MB
Время: 0.029 c