Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 21:49   #1
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию Мерцание

Написал наследника TControl:
Код:
unit ZComp;

interface

uses Windows, Classes, Controls, Forms, Mini2DUT, Mini2DDX;

type

  TZComp = class(TControl)
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TZCom = class(TZComp)
  published
    property Align;
    property Anchors;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property Visible;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnGesture;
    property OnMouseActivate;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnStartDock;
    property OnStartDrag;
    procedure ZDraw(Image:DXImage);
  end;

implementation

constructor TZComp.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 50;
  Height := 50;
end;

procedure TZCom.ZDraw(Image:DXImage);
begin
DXDraw(Left,Top,Left+Width,Top+Height,Image);
end;

end.
При движении TZCom - мерцает
Буферизация формы не помогает, подскажите, как избавиться от мерцания?
DX по тем же координатам, что и ZCom, больше они никак не связаны.
Если сделать ZCom.Visible:=False и выводить DX по тем же координатам, то мерцания при движении нет, но тогда не обрабатываются события ZCom (OnMouseDown, OnMouseMove и т.д.).
Ниже проект, с выводом 1 текстуры на форму, которая движется с курсором мыши + исходники и нужные библиотеки.
Помогите разобраться плиз!
Сама прорисовка ZCom вообще не нужна, главное, что бы события (OnMouseDown, OnMouseMove и т.д.) работали.
Вложения
Тип файла: rar Test.rar (1.77 Мб, 9 просмотров)

Последний раз редактировалось ZBEP; 08.04.2011 в 22:14.
ZBEP вне форума Ответить с цитированием
Старый 08.04.2011, 22:12   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Начнем с того за каким лешим ZDraw объявлен в разделе published ..
mss вне форума Ответить с цитированием
Старый 08.04.2011, 22:19   #3
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

mss, хз, почему нельзя там?
В принципе можно вообще без него, если рисовать в самом проекте по полученным координатам, но дело как я понимаю не в DX, а в TControl

П.с.
Можно ли как-нибудь прикрутить события OnMouseDown, OnMouseMove, OnMouseUp, OnMouseEnter, OnMouseLeave, OnKeyDown, OnKeyUp TObject?
Сейчас делаю так:
Код:
unit ZProc;

interface
uses Controls, Classes, Mini2DDX;

type

TMMoveProc = procedure(Sender:TObject; X,Y:Extended;                    Shift: TShiftState);
TMDownProc = procedure(Sender:TObject; X,Y:Extended;Button:TMouseButton;Shift: TShiftState);
TMUpProc   = procedure(Sender:TObject; X,Y:Extended;Button:TMouseButton;Shift: TShiftState);
TKDownProc = procedure(Sender:TObject; var Key:Word;                    Shift: TShiftState);
TKUpProc   = procedure(Sender:TObject; var Key:Word;                    Shift: TShiftState);
TZC = class(TObject)
public
  W,H,L,T:Extended;
  Visible:Boolean;
  Checked:Boolean;
  Name   :String;
  procedure MMove(MMoveProc: TMMoveProc;                      Shift: TShiftState);
  procedure MDown(MDownProc: TMDownProc;Button : TMouseButton;Shift: TShiftState);
  procedure   MUp(MUpProc  : TMUpProc  ;Button : TMouseButton;Shift: TShiftState);
  procedure KDown(KDownProc: TKDownProc;var Key: Word;        Shift: TShiftState);
  procedure   KUp(KUpProc  : TKUpProc  ;var Key: Word;        Shift: TShiftState);
  procedure ZDraw(Image:DXImage);
  constructor Create();
private

end;
implementation

constructor TZC.Create();
begin
  inherited Create();
  W:= 50;
  H:= 50;
  L:=0;
  T:=0;
  Visible:=True;
  Checked:=False;
end;

procedure TZC.MMove(MMoveProc: TMMoveProc;Shift: TShiftState);
begin
if(Visible=True)and(Mouse.CursorPos.x>L)and(Mouse.CursorPos.x<L+W)
and(Mouse.CursorPos.Y>T)and(Mouse.CursorPos.Y<T+H)then
MMoveProc(Self,Mouse.CursorPos.X-L,Mouse.CursorPos.Y-T,Shift);
end;

procedure TZC.MDown(MDownProc:TMDownProc;Button:TMouseButton;Shift: TShiftState);
begin
if(Visible=True)and(Mouse.CursorPos.x>L)and(Mouse.CursorPos.x<L+W)
and(Mouse.CursorPos.Y>T)and(Mouse.CursorPos.Y<T+H)then
MDownProc(Self,Mouse.CursorPos.X-L,Mouse.CursorPos.Y-T,Button,Shift);
end;

procedure TZC.MUp(MUpProc:TMUpProc;Button:TMouseButton;Shift: TShiftState);
begin
if(Visible=True)and(Mouse.CursorPos.x>L)and(Mouse.CursorPos.x<L+W)
and(Mouse.CursorPos.Y>T)and(Mouse.CursorPos.Y<T+H)then
MUpProc(Self,Mouse.CursorPos.X-L,Mouse.CursorPos.Y-T,Button,Shift);
end;

procedure TZC.KDown(KDownProc: TKDownProc;var Key: Word;Shift: TShiftState);
begin
if(Visible=True)and(Checked=True)then
KDownProc(Self,Key,Shift);
end;

procedure TZC.KUp(KUpProc: TKUpProc;var Key: Word;Shift: TShiftState);
begin
if(Visible=True)and(Checked=True)then
KUpProc(Self,Key,Shift);
end;

procedure TZC.ZDraw(Image:DXImage);
begin
DXDraw(L,T,L+W,T+H,Image);
end;

end.

Последний раз редактировалось ZBEP; 09.04.2011 в 15:14.
ZBEP вне форума Ответить с цитированием
Старый 09.04.2011, 15:14   #4
ZBEP
Форумчанин
 
Аватар для ZBEP
 
Регистрация: 23.03.2009
Сообщений: 334
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, bass,
  Dialogs, ExtCtrls,ZProc;

type
  TForm1 = class(TForm)
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1 : TForm1;
  ZC    : TZC;

implementation

{$R *.dfm}

...

procedure OnMMove(Sender: TObject;X,Y:Extended;Shift: TShiftState);
begin
form1.caption:=(Sender as TZC).Name+': '+format('%f %f',[x,y]);
end;

procedure OnMDown(Sender: TObject;X,Y:Extended;Button:TMouseButton;Shift: TShiftState);
begin
//
end;

procedure OnMUp(Sender: TObject;X,Y:Extended;Button:TMouseButton;Shift: TShiftState);
begin
//
end;

procedure OnKDown(Sender: TObject; var Key: Word;Shift: TShiftState);
begin
//
end;

procedure OnKUp(Sender: TObject; var Key: Word;Shift: TShiftState);
begin
if Key=13 then (Sender as TZC).Checked:=False;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
begin
ZC.KDown(OnKDown,Key,Shift);
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
ZC.KUp(OnKUp,Key,Shift);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
zc.MDown(OnMDown,Button,Shift);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
zc.MUp(OnMUp,Button,Shift);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
begin
  if Shift = [ssLeft] then
  begin
    ZC:=TZC.Create();
    ZC.Name:='ZC';
    ZC.L:=X-25;
    ZC.T:=Y-25;
  end;
end;

...

end.

Но получается, что я просто проверяю координаты мыши на форме в событиях формы, и если они совпадают с координатами объекта, то передаю нужные параметры в процедуру и там уже работаю с OnMouseMove подходящего объекта.
Можно сделать так, что бы обработка этих событий была, как в TControl, что бы я не проверял координаты для каждого объекта по очереди при движении мыши по форме?
ZBEP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
мерцание в paintbox Олександр17 Мультимедиа в Delphi 4 02.12.2010 20:36
Мерцание Image Жека-старший Компоненты Delphi 4 23.05.2010 19:36
Мерцание vladi Microsoft Office Excel 0 03.06.2009 17:42
Мерцание на Канве SERG1980 Мультимедиа в Delphi 3 30.04.2008 08:14
мерцание shad0w Общие вопросы C/C++ 3 11.12.2007 12:31