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

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

Invalidate в design-time [D6, WinXP]


Бывший студент ©   (2005-04-22 13:20:00) 

У меня есть компонент с предком TStringGrid. Есть коллекция TCollection, количество элементов которой соответствует количеству колонок grid'а, в каждом элементе содержатся свойства (Font, Color) соответствующей колонки,
TColStyle = class(TCollectionItem)
private
  FColFont: TFont;
  FColor: TColor;
  procedure SetFont(Value: TFont);
  procedure SetColor(Value: TColor);
  function GetColor:Tcolor;
public
  constructor Create(Collection: TCollection); override;
  destructor Destroy; override;
published
  property Font: TFont read FColFont write SetFont;
  property Color: TColor read GetColor write SetColor;
end;

procedure TColStyle.SetFont(Value: TFont);
begin
FColFont.Assign(Value)
end;

procedure TColStyle.SetColor(Value: TColor);
begin
FColor:=Value;
end;

function TColStyle.GetColor: TColor;
begin
Result:=FColor;
end;


которые задействуются в перекрытом DrawCell компонента.

procedure TTestGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
begin
inherited;
if ACol=0 then //к примеру в нулевой колонке
  begin
  Canvas.Font:=ColStyles[0].Font;
  Canvas.Brush.Color:=ColStyles[0].Color;
  end;
Canvas.FillRect(ARect);
Canvas.TextOut(ARect.Left, ARect.Top, Cells[ACol, ARow]);
end;

В design-time при изменении свойства, например Color, с интерфейсом компонента
ничего не происходит. Обновляется он только при изменении свойств самого grid'а (к примеру ColCount) или в run-time.
Насколько я знаю, за обновление отвечает метод Invalidate, как можно его вызвать после изменения свойства в элементе TCollection?


Юрий Зотов   (2005-04-23 16:29:00) [1]

> Бывший студент ©   (23.04.05 16:16) [7]

От це по-нашему. Сорри, если что не так.

Читайте статью. Разберите ее "до винтика", чтобы была понятна каждая буква - зачем она и почему именно в этом месте. Особое внимание обратите на способ перерисовки - он "отложенный" и связан с работой BeginUpdate-EndUpdate (чтобы избежать многократных перерисовок). Это как раз то, на чем и произошла заминка.


Бывший студент   (2005-04-23 16:16:00) [2]

За всё спасибо, прошу сильно меня не ругать. Впервые за Delphi я сел в начале апреля, стажа программирования тоже почти нет. Понадобился компонент, просить некого - делаю сам.


Набережных С.   (2005-04-23 15:18:00) [3]


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

Не царское это дело - статьи всякие читать.


Юрий Зотов   (2005-04-23 15:02:00) [4]

> Бывший студент ©   (23.04.05 13:07) [3]

При чем тут конструктор? Не трогайте Вы его. Все, что нужно сделать - это вызвать Invalidate у Grid'а.

Я Вам код давал? Давал. Он работает? Работает. Ссылка на Grid в нем есть? Есть. Так какие могут быть проблемы?

И вызывать Invalidate надо не при изменении КАЖДОГО Item'а, а в методе Update самой КОЛЛЕКЦИИ. А Item только должен коллекцию УВЕДОМИТЬ - то есть, он должен вызывать не Invalidate, а свой метод Change.

Ссылку на я статью я Вам давал? Давал. Вы ее прочли? Разобрались в ней?

Видимо, нет. А зря. Потому что там показано как раз то, что Вам и нужно.


Набережных С.   (2005-04-23 14:53:00) [5]


> Бывший студент ©   (23.04.05 13:07) [3]

А может все-таки книжки какие-никакие почитать, а? Для "чайников" Ну че уж сразу-то за компоненты?


Бывший студент   (2005-04-23 13:07:00) [6]

Что-то не выходит ничего с конструктором в [1], посоветуйте, пожалуйста, как быть.


Бывший студент   (2005-04-22 17:11:00) [7]

Спасибо, принцип понятен. Но компилятор ругается на конструктор.


-=XP=-   (2005-04-22 16:44:00) [8]

вызвать после изменения свойства в элементе TCollection

TColStyle = class(TCollectionItem)
private
 FColFont: TFont;
  FOwnerGrid: TSomeGrid;
public
 constructor Create(Collection: TCollection; OwnerGrid: TSomeGrid);

procedure TColStyle.SetColor(Value: TColor);
begin
 FColor := Value;
  FOwnerGrid.Invalidate;
end;


Что-то в этом ключе.


Наверх

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