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

Вниз

Override процедуры Paint   Найти похожие ветки 

 
Creative   (2006-02-07 17:29) [0]

Есть компонента TSquare(TCustomControl);
Хочется:
1. Чтобы на форме в момент работы приложения она выглядела как TShape, то есть закрашенным квадратом без рамки.
2. Чтобы в момент создания или рисования компоненты (не знаю как правильно) программа смотрела на значения некоторых полей компоненты и сообразно им рисовала на форме линии.
Например так
if Face = fcTop then
  begin
    moveto(left, top);
    lineto(left+width, top-height);
  end;


Как правильно должна в таком случае выглядеть процедура Paint? На данный момент она выглядит так:

procedure TSquare.Paint;
var
 Save: Boolean;
begin
 if csDesigning in ComponentState then
with inherited Canvas do
begin
  Pen.Style := psDash;
  Brush.Style := bsClear;
  Rectangle(0, 0, Width, Height);
end;
 Save := FDrawing;
 FDrawing := True;
 try
with inherited Canvas do
  StretchDraw(DestRect, Picture.Graphic);
 finally
FDrawing := Save;
 end;
end;

Максимум чего мне удалось добиться - чтобы на форме рисовался белый квадрат, но он все равно рисуется с черной рамкой вокруг.
Я ЗНАЮ, что неправильно, но хочу понять как правильно.


 
MBo ©   (2006-02-07 18:06) [1]

>рисуется с черной рамкой вокруг.
хм... хочешь закрасит - а кисть прозрачной делаешь...
Pen psNone сделай, а кисти цвет придай, или вообще используй FillRect

Кстати, зачем у Canvas - inherited?


 
XProger ©   (2006-02-07 18:43) [2]

Если на форме, то что-то вроде: with (Parent as TForm) do Canvas.рисуем

Pen.Color := цвет_рамки
Brush.Color := цвет_заливки


 
Creative   (2006-02-08 10:51) [3]

MBo: inherited Canvas это списанная из описания TCustomControl процедура Paint. Я слишком мало знаю, чтобе переделывать готовый процедуры готовых компонентов.

XProger: в том то все и дело, что просто поменять цвет заливки и рамки я могу, а вот заставить его при прорисовке рисовать еще что то, да еще и смотреть в условия, которые я ему ставлю - не получается.


 
ЮЮ ©   (2006-02-08 11:27) [4]


> программа смотрела на значения некоторых полей компоненты
> и сообразно им рисовала на форме линии.


А посмотреть, как это сделано в том же TShape, религия не позвроляет?
Не поля, а свойства, а в методе установки свойства вызвать обновление отрисовки:

procedure TShape.SetShape(Value: TShapeType);
begin
 if FShape <> Value then
 begin
   FShape := Value;
  Invalidate;
 end;
end;


 
Creative   (2006-02-08 12:14) [5]

ЮЮ:
Не сочтите за нахальство, а можно попонятней?
На всякий случай: мне нужно чтобы программа читала вот это свойство:
property RightSide: TSide read FRightSide write FRightSide;
оно может принимать значения:
TSide = (sdWall, sdBrWall, sdDoor, sdNone);

Действие должно быть приблизительно такое:
if RightSide = sdWall then
  begin
   moveto(left, top);
   lineto(left+width, top-height);
  end;


 
Creative   (2006-02-08 12:25) [6]

Я написала аналогичную процедуру для моего свойства, но компилятор ее почему то пропускает


 
Creative   (2006-02-08 13:55) [7]

Следующий симптом - после написания SetMyProperty, Дельфи при наличии в проекте этой компоненты стал виснуть почем зря и выдавать access violation в модуле с расширением .bpl. Кто нибудь сталкивался с таким уже?


 
Creative   (2006-02-08 17:09) [8]

Спасибо всем за советы, все получилось



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

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

Наверх




Память: 0.48 MB
Время: 0.074 c
15-1156046543
PSPF2003
2006-08-20 08:02
2006.09.17
Альтернатива Adobe Reader


15-1156794095
Pazitron_Brain
2006-08-28 23:41
2006.09.17
Как распечатать 3х4 фотографию?


2-1156676413
KidMan
2006-08-27 15:00
2006.09.17
Как сделать, чтобы в определенное время появлялось новое окно


2-1156408396
Начинающий_1
2006-08-24 12:33
2006.09.17
Сравнение двумерных динамических массивов


1-1154929687
KygECHuK
2006-08-07 09:48
2006.09.17
Эмуляция событий мыши