Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Вниз

Component   Найти похожие ветки 

 
San1   (2008-03-11 18:22) [0]

Уважаемые Мастера, подскажите.

Как научить компонент потомок от класса TGraphicControl не обрабатывать события мыши, а предоставлять это своему родителю?


 
{RASkov} ©   (2008-03-11 18:25) [1]

> [0] San1   (11.03.08 18:22)

Ты лучше задачу свою опиши...


 
San1   (2008-03-11 18:38) [2]

Наследовал компонент от класса TGraphicControl (поле игры морской бой).

Хотелось бы сделать поле игры большим, т. е. больше экрана, следовательно нужны полосы прокрутки и прокручивать колесиком мыши.

Т. о., я сделал новый компонент, наследник TScrollBox, и в его перекрытом конструкторе помещаю туда свой компонент.

Но теперь помещенный в ScrollBox компонент, мешает ему самому обрабатывать события мыши.


 
DiamondShark ©   (2008-03-11 19:31) [3]


> Но теперь помещенный в ScrollBox компонент, мешает ему самому
> обрабатывать события мыши.

А ему-то зачем события мыши?


 
{RASkov} ©   (2008-03-11 19:31) [4]

> [2] San1   (11.03.08 18:38)
> Но теперь помещенный в ScrollBox компонент, мешает ему самому
> обрабатывать события мыши.

Все равно мало, что понятно.... :(
А тебе какие события нужно, прокрутку "колесом мыши" или "клики", что?
Если клики то просто обрабатывай их у своего внутреннего компонента, если прокрутку "колесом" то нужно чтоб твой MyScrollBox имел фокус.
Например, если у тебя на нем(Скролбокс) нет ни одного винконтрола, то он не получит фокус и прокрутка работать не будет...
Фокус установить можно так: MyScrollBox.SetFocus;


 
San1   (2008-03-11 20:08) [5]

В моем случае я хотел сделать перемещение поля игры в скролбоксе с помощью зажатой средней клавишой мышки (и перемещением мыши в зажатом состоянии средней клавиши мыши, т.е., какбы перетаскивать под собой игровое поле).
Не знаю как это реализовать наиболее грамотно.

Может быть перекрывать MouseMove и в этой процедуре, если зажата ср. клав. мыши прокручивать скролы у родителя...

Нужен совет как лучше можно это сделать и как это сделать вообще.
Может есть какие-то примеры, но я их пока не нашел.


 
{RASkov} ©   (2008-03-11 21:11) [6]

> [5] San1   (11.03.08 20:08)

Вот глянь, от очередного безделия накидал тебе примерчик. Это не конечный результат, но в качестве примера.
unit Unit1;
interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TMyPole = class(TGraphicControl)
 private
   FOnPaint: TNotifyEvent;
 protected
   procedure Paint; override;
   property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
 end;

 TMyGamePole = class (TScrollBox)
 private
   FPole: TMyPole;
   OldX, OldY: Integer;
   procedure SetHeightPole(const Value: Integer);
   procedure SetWidthPole(const Value: Integer);
   function GetHeightPole: Integer;
   function GetWidthPole: Integer;
   procedure MouseDownInPole(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
   procedure MouseMoveInPole(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 protected
   procedure PaintPole(Sender: TObject); virtual;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   property WidthPole: Integer read GetWidthPole write SetWidthPole;
   property HeightPole: Integer read GetHeightPole write SetHeightPole;
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TMyPole }

procedure TMyPole.Paint;
begin
 inherited;
 if Assigned(FOnPaint) then FOnPaint(Self);
end;

{ TMyGamePole }

constructor TMyGamePole.Create(AOwner: TComponent);
begin
 inherited;
 FPole:=TMyPole.Create(self);
 WidthPole:=1000;
 HeightPole:=1000;
 FPole.Parent:=Self;
 FPole.OnMouseDown:=MouseDownInPole;
 FPole.OnMouseMove:=MouseMoveInPole;
 FPole.OnPaint:=PaintPole;
 Width:=200;
 Height:=200;
end;

destructor TMyGamePole.Destroy;
begin
 FPole.Free;
 inherited;
end;

procedure TMyGamePole.SetHeightPole(const Value: Integer);
begin
 if Value<>FPole.Height then FPole.Height:=Value;
end;

procedure TMyGamePole.SetWidthPole(const Value: Integer);
begin
 if Value<>FPole.Width then FPole.Width:=Value;
end;

function TMyGamePole.GetHeightPole: Integer;
begin
 Result:=FPole.Height;
end;

function TMyGamePole.GetWidthPole: Integer;
begin
 Result:=FPole.Width;
end;

procedure TMyGamePole.MouseDownInPole(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if Button<>mbMiddle then Exit;
 OldX:=X; OldY:=Y;
end;

procedure TMyGamePole.MouseMoveInPole(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if not (ssMiddle in Shift) then Exit;
 HorzScrollBar.Position:=HorzScrollBar.Position+(OldX-X); OldX:=X;
 VertScrollBar.Position:=VertScrollBar.Position+(OldY-Y); OldY:=Y;
end;

procedure TMyGamePole.PaintPole(Sender: TObject);
var X, Y: Integer; R: TRect;
begin
 R:=FPole.ClientRect;
 InflateRect(R, -4, -4);
 FPole.Canvas.Rectangle(R);
 for X:=1 to WidthPole-1 do
  for Y:=1 to HeightPole-1 do
   if (X mod 8 = 0) and (Y mod 8 = 0) then FPole.Canvas.Pixels[X,Y]:=clRed;
end;
//------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
 with TMyGamePole.Create(Self) do begin
  Parent:=Self;
 end;
end;

end.


 
San1   (2008-03-11 23:04) [7]

Классный пример!
То что мне нужно.
Если не секрет, как избавиться от мерцания. Даже DoubleBuffered:=true не помогает.


 
Amoeba ©   (2008-03-12 00:57) [8]


> с помощью зажатой средней клавишой мышки

А как быть юзеру, если мышь не экзотическая, а обычная, т.е. без средней клавиши?


 
San1   (2008-03-12 20:02) [9]

Подскажите пожалуйста какже всетаки в таких случаях грамотно избавляются от мерцания компонента при его периресовке.
DoubleBuffered
и
ControlStyle := ControlStyle + [csOpaque]
не помогают...


 
San1   (2008-03-12 20:04) [10]

помещение изображения в временный TPicture и copyrect в канву помпонента, тоже не помогло


 
VirEx ©   (2008-03-12 20:22) [11]

как-то перекрыть erasebackground...



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

Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
15-1203539159
Petr V. Abramov
2008-02-20 23:25
2008.04.06
так рождаются легенды...


15-1203859434
452
2008-02-24 16:23
2008.04.06
Кто знает где взять исходные тексты прогамм(примеров работи сADO)


15-1203098841
Igor23
2008-02-15 21:07
2008.04.06
Много кода


2-1205254732
NaRuTo
2008-03-11 19:58
2008.04.06
Проиграть видео без MediaPlayer и DirectX


3-1194961356
andreoman
2007-11-13 16:42
2008.04.06
обрабатывать код ошибки сервера FB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский