Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TreeView


Автор: Гость_qwerty 1.7.2004, 08:40
Есть написанный мной компонент типа treeview, но есть маленькая проблема...
связи отрисовываются по таймеру и моргают иногда....
как избежать этого ???

Автор: <Spawn> 1.7.2004, 11:22
Зачем рисовать по таймеру? Нужно рисовать по WM_PAINT

Автор: Гость_qwerty 1.7.2004, 13:15
мона по подробнее, плиз

Автор: <Spawn> 1.7.2004, 13:58
Сначала скажи как ты создал дерево? Унаследовал от TTreeView? Тогда тебе нужно искать метод класса который вызывается при перерисовке контрола и перекрывать его. Либо написать что то типа этого:

Код
TMyTreeView=class(TTreeView)
 private
   procedrue WMPaint(var Msg: TMessage); message WM_PAINT;
 <остальное определение твоего класса>
end;

procedure TMyTreeView.WMPaint(var Msg: TMessage);
begin
 inherited WMPaint;
 <рисуешь чего то тут>
end;

Автор: Гость_qwerty 1.7.2004, 14:06
дерево наследовано от scrollbox'a остальное с нуля, treeview принципиально не подходит
Этот код я уже понял как писать, н овсе равно пасиб...
вопрос другой.....

inherited WMPaint;

пишет неопределена переменная?????

Автор: <Spawn> 1.7.2004, 14:07
оЧепЯтался я smile.gif Напиши, либо
Код
inherited;

либо
Код
inherited WMPaint(Msg);


Это одно и то же.
Добавлено @ 14:13
Я глянул исходники - метод который вызвается при перерисовке называется PaintHandler и он помещен защищенной секции, так что тебе лучше его перекрывать.

Код
procedure TMyTreeView.PaintHandler(...);
begin
 inherited;
end;

Автор: Гость_qwerty 1.7.2004, 14:29
он статический, как его перекрыть?

Автор: <Spawn> 1.7.2004, 14:30
Так же как и виртуальныйsmile.gif)

Код
TMyTreeView = class(TScrollBox)
protected
 procedure PaintHandler();
...
end;

procedure TMyTreeView.PaintHandler(...);
begin
inherited;
 <твое рисование>
end;

Автор: Гость_qwerty 1.7.2004, 14:36
вообще не срабатывает...
а по WM_Paint только в момент изменения размера компонента на форме

Автор: <Spawn> 1.7.2004, 14:37
Ты для PaintHandler параметры то прописал?
Добавлено @ 14:38
Код
procedure TMyTreeView.PaintHandler(var Message: TWMPaint);

Автор: Гость_qwerty 1.7.2004, 14:43
само собой

Автор: <Spawn> 1.7.2004, 15:01
Должно рисоваться. Покажи как рисуешь, если твой код не секретныйsmile.gif

Автор: Гость_qwerty 1.7.2004, 15:09
TmyTree = class(TScrollBox)
procedure PaintHandler(var Message: TWMPaint); // объявление

procedure TmyTree.PaintHandler(var Message: TWMPaint);
begin
inherited;
Lines(Self); - рисую на прицепленной канве
end;

procedure TmyTree.Lines(Sender: TObject);
begin
//очищаю от старого

//рисую новые связи
end;

в дереве помимо рисование на канве еще отображаются компоненты

Автор: Гость_qwerty 1.7.2004, 15:12
procedure PaintHandler(var Message: TWMPaint); override - так не прокатит ругается

Автор: <Spawn> 1.7.2004, 15:37
PaintHandler не совсем то что нужноsmile.gif
Вот я примерчик набросал с WM_PAINT

Код
 TMyScrollBox = class(TScrollBox)
 private
   FCanvas: TCanvas;
   procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
 protected
   procedure CreateWnd; override;
 public
   destructor Destroy; override;
 end;

procedure TMyScrollBox.CreateWnd;
begin
 inherited;
 FCanvas := TCanvas.Create;
 FCanvas.Handle := GetDC(Handle);
end;

destructor TMyScrollBox.Destroy;
begin
 FreeAndNil(FCanvas);
 inherited;
end;

procedure TMyScrollBox.WMPaint(var Message: TWMPaint);
begin
 inherited;
 with FCanvas do
 begin
   Pen.Color := clRed;
   MoveTo(10, 10);
   LineTo(40, 60);
   Ellipse(Rect(10, 10, 100, 100));
 end;
end;

Автор: Гость_qwerty 1.7.2004, 15:48
я так уже делал....
потаймеру все рисуется, а без него нет

Автор: <Spawn> 1.7.2004, 15:55
У меня это код все нормально рисует. Может у тебя где то ошибка?

Автор: Гость_qwerty 1.7.2004, 16:00
1) есть разница что я создаю канву в перехваченном OnCreate, а не в CreateWnd?
2) я ставлю showmessage и функция работает только при изменении размера компонента
дерево. ??????

Автор: Гость_qwerty 1.7.2004, 16:05
Да и компонент дерево на другом компоненте панель

Автор: <Spawn> 1.7.2004, 16:08
Цитата
) есть разница что я создаю канву в перехваченном OnCreate, а не в CreateWnd?
Разница есть - у меня без этого все с ошибкой вылетало, так как не стадии Create еще нельзя получить HDC

Автор: Гость_qwerty 1.7.2004, 16:13
а я так делал например

FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;

хотя пробовал с CreateWnd все равно никак

Автор: Гость_qwerty 1.7.2004, 16:32
вообще моргает потому что перерисовка осуществляется так

закрашивается сначала фоном а потом рисуется

я попроовал это сделать не через таймер а через tapplicationevents ловил onmessage


можно как нидь перерисовку изменить, чтобы быстрее очищать???

Автор: <Spawn> 1.7.2004, 19:56
Я уже написал, что перерисовку нужно делать только на WM_PAINT. Не для красоты же придумали это сообщение. Ищи ошибку в коде - у меня работает все

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)