Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

создание класса


Александр123123 ©   (2006-04-19 12:55:00) 

Подскажите пожалуста как задать обработчик для события onClick при создании класса
мой класс:
unit ClassTehUnit;
interface

uses ADOdb,ExtCtrls,Controls,Windows,SysUtils, Variants, Classes, Graphics, Forms, ResourcesUnit,
 DBCtrls, DB;

type
 TTehnics = class (TWinControl)
 private
   FConnection: TAdoConnection;
   FIcon: TImage;
   FImage: TPicture;
   FIDTeh_Session: integer;
   procedure pcLoadIcon(ID: integer; var IPicture: TImage; IImage: TPicture);
 public
   // IDTeh_Session ID Єхїэшъш т ёючфрээющ шуЁх (ЄрсышЎр TTeh_Session)
   constructor Create(AOwner: TComponent; Connection: TAdoConnection; IDTeh_Session: integer);
   property Image: TPicture read FImage;
 published
   property OnClick;
   property OnMouseDown;
   property OnMouseMove;
   property OnMouseUp;
   property OnMouseWheel;
   property OnMouseWheelDown;
   property OnMouseWheelUp;
 end;

implementation

{ TTehnics }

constructor TTehnics.Create(AOwner: TComponent;
 Connection: TAdoConnection; IDTeh_Session: integer);
begin
 inherited Create(AOwner);
 FConnection := Connection;
 FIDTeh_Session := IDTeh_Session;

 FIcon := TImage.Create(AOwner);
 FImage := TPicture.Create;

 Left := 0;
 Top := 0;
 Width := FIcon.Width;
 Height := FIcon.Height;

 Self.Parent := AOwner as TWinControl;

 Hint := 'sadfa';
 ShowHint := true;

 pcLoadIcon(IDTeh_Session, FIcon, FImage);

 FIcon.Parent := Self;
end;

procedure TTehnics.pcLoadIcon(ID: integer; var IPicture: TImage;
 IImage: TPicture);
var
 DS: TADODataSet;
 MS: TMemoryStream;
begin
 MS := TMemoryStream.Create;
 try
   DS := TADODataSet.Create(TComponent(nil));
   DS.Connection := FConnection;
   DS.CommandText := Format(sql_sel_Icon,[ID]);
   DS.Open;

   TBlobField(ds.FieldByName('picture')).SaveToStream(MS);
   MS.Position := 0;
   IPicture.Picture.Bitmap.LoadFromStream(MS);

   Ms.Clear;

   TBlobField(ds.FieldByName('image')).SaveToStream(MS);
   MS.Position := 0;
   IImage.Bitmap.LoadFromStream(MS);

 finally
   MS.Free;
 end;
end;

В основной программе создаю объект типа этого классса.

FTeh := TTehnics.Create(self, ADOConnection1, 2);
назначаю процедуру обработки
FTeh.OnMouseDown := Image1MouseDown;
после клика ни чего не происходит


Александр123123   (2006-04-21 18:21:00) [1]

Понял, по умолчанию у Image ParentShowHint = True, поэтому показывался
Все теперь работает. Огромное СПАСИБО!


SuperBug   (2006-04-21 18:14:00) [2]

А ты возьми и присвой объекту FIcon другой Hint и посмотри что покажет :))


Александр123123   (2006-04-21 17:17:00) [3]

А почему тогда когда я навожу мышь на мой объект TTeh показывается Hint?


SuperBug   (2006-04-21 16:23:00) [4]

Кстати совет в догонку, возможно я ошибаюсь,НО!!! мне кажется,что размеры


Width := FIcon.Width;
Height := FIcon.Height;


следует присваиват после загрузки изображения...


SuperBug   (2006-04-21 16:18:00) [5]

В краце, фишка в следующем:в данном конкретном случае всю область контрола закрывает объект FIcon ,который собсвенно получает фокус,как и рассчитывеат автор,НО событие OnMouseDown назначено объекту FTeh, который фокуса не получает и отработать его никак не может!!!! Следовательно надо написать некий код,который присваивал бы обработчик OnMouseDown объекта FTeh обработчику события OnMouseDown бъекта FIcon

ТО ЕСТЬ написать что-то типа:
 для класса TTehnics

  private
   function GetMouseEvent: TMouseEvent;
   procedure SetMouseEvent(const Value: TMouseEvent);
  published
   property OnMouseDown2:TMouseEvent read GetMouseEvent write SetMouseEvent;

  ..................

implementation

function TTehnics.GetMouseEvent: TMouseEvent;
begin
Result:=OnMouseDown;
end;

procedure TTehnics.SetMouseEvent(const Value: TMouseEvent);
begin
OnMouseDown:=Value;
FIcon.OnMouseDown:=OnMouseDown;
end;



и при создании объекта FTeh назначить обработчик

FTeh.OnMouseDown2 := Image1MouseDown;


собственно это полностью решает данную проблему :)


vl_chel   (2006-04-21 15:16:00) [6]

Либо утверждение неправильно либо не произошла ситуация MouseDown
похожие веши работали всегда


Сергей М.   (2006-04-21 14:47:00) [7]


> vl_chel ©   (21.04.06 14:41) [13]
>
> Вопрос - что написанно в Image1MouseDown


Да без разницы что там написано.
Автор утверждает, что не ловит брейкпойнт на первой же строчке тела назначенного им обработчика.


vl_chel   (2006-04-21 14:41:00) [8]

Вопрос - что написанно в Image1MouseDown
если были разные типы компилятор бы не пропустил
к сожалению других проблем не видно
так прописано в модуле Controls

 TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer) of object;

 TControl = class(TComponent)
...
 protected
...
 property OnMouseDown: TMouseEvent read FOnMouseDown write  FOnMouseDown;
...


Сергей М.   (2006-04-21 14:38:00) [9]

Значит окно твоего контрола не имеет фокуса.


Александр123123   (2006-04-21 14:32:00) [10]

я пишу FTeh.OnMouseDown := Image1MouseDown;
объявление у этих процедур одинаково, более того один и другой наследуються от одного класса TControl


vl_chel   (2006-04-21 14:32:00) [11]

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
простите прогнал но смысл тотже


vl_chel   (2006-04-21 14:30:00) [12]

да а на имадже1 обработчик вызываеться?


vl_chel   (2006-04-21 14:26:00) [13]

СоРРи не дочитал
Мне не нравится
as WinControl
хотя в принципе все правильно

>>Сергей М.
при чем здесь OnClick
procedure TForm1.FormClick(Sender: TObject);
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
присвоить обработчик события один к другому просто не получиться разные типы

скорее всего проблема в этой строке
FTeh.OnMouseDown := Image1MouseDown;

не известно что это есть


Александр123123   (2006-04-21 14:23:00) [14]

ставил


Александр123123   (2006-04-21 14:22:00) [15]

да не важно какое событие.
На форме мой объект виден, я с него могу читать свойства


Сергей М.   (2006-04-21 14:05:00) [16]


> vl_chel ©   (21.04.06 14:02) [3]


назначение Parent присутствует в конструкторе TTehnics


Сергей М.   (2006-04-21 14:03:00) [17]

А причем здесь OnClick, если речь на самом деле идет об OnMouseDown ?
И как ты определил, что управление туда не передается ? Брейкпойнт ставил ?


vl_chel   (2006-04-21 14:02:00) [18]

Во первых Ваш компонент не виден на форме и поэтому события мыши до него не доходят
надо:
   FTech.parent := Form1;
или имя формы на которой он создается
и после этого можно о чемто думать


Александр123123   (2006-04-21 13:49:00) [19]

В проседуре Image1MouseDown написан обработчик события, но в это процедура после нажатия мыши управление не передается


Сергей М.   (2006-04-19 13:05:00) [20]


> после клика ни чего не происходит


А что должно по-твоему произойти ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо