Форум: "Компоненты";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
ВнизInvalidate в design-time Найти похожие ветки
← →
Бывший студент © (2005-04-22 13:20) [0]У меня есть компонент с предком 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?
← →
-=XP=- © (2005-04-22 16:44) [1]вызвать после изменения свойства в элементе 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;
Что-то в этом ключе.
← →
Бывший студент © (2005-04-22 17:11) [2]Спасибо, принцип понятен. Но компилятор ругается на конструктор.
← →
Бывший студент © (2005-04-23 13:07) [3]Что-то не выходит ничего с конструктором в [1], посоветуйте, пожалуйста, как быть.
← →
Набережных С. © (2005-04-23 14:53) [4]
> Бывший студент © (23.04.05 13:07) [3]
А может все-таки книжки какие-никакие почитать, а? Для "чайников" Ну че уж сразу-то за компоненты?
← →
Юрий Зотов © (2005-04-23 15:02) [5]> Бывший студент © (23.04.05 13:07) [3]
При чем тут конструктор? Не трогайте Вы его. Все, что нужно сделать - это вызвать Invalidate у Grid"а.
Я Вам код давал? Давал. Он работает? Работает. Ссылка на Grid в нем есть? Есть. Так какие могут быть проблемы?
И вызывать Invalidate надо не при изменении КАЖДОГО Item"а, а в методе Update самой КОЛЛЕКЦИИ. А Item только должен коллекцию УВЕДОМИТЬ - то есть, он должен вызывать не Invalidate, а свой метод Change.
Ссылку на я статью я Вам давал? Давал. Вы ее прочли? Разобрались в ней?
Видимо, нет. А зря. Потому что там показано как раз то, что Вам и нужно.
← →
Набережных С. © (2005-04-23 15:18) [6]
> Юрий Зотов © (23.04.05 15:02) [5]
Не царское это дело - статьи всякие читать.
← →
Бывший студент © (2005-04-23 16:16) [7]За всё спасибо, прошу сильно меня не ругать. Впервые за Delphi я сел в начале апреля, стажа программирования тоже почти нет. Понадобился компонент, просить некого - делаю сам.
← →
Юрий Зотов © (2005-04-23 16:29) [8]> Бывший студент © (23.04.05 16:16) [7]
От це по-нашему. Сорри, если что не так.
Читайте статью. Разберите ее "до винтика", чтобы была понятна каждая буква - зачем она и почему именно в этом месте. Особое внимание обратите на способ перерисовки - он "отложенный" и связан с работой BeginUpdate-EndUpdate (чтобы избежать многократных перерисовок). Это как раз то, на чем и произошла заминка.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.133 c