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

Вниз

создание класса   Найти похожие ветки 

 
Александр123123   (2006-04-19 12:55) [0]

Подскажите пожалуста как задать обработчик для события 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;
после клика ни чего не происходит


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


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


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


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

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


 
vl_chel ©   (2006-04-21 14:02) [3]

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


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

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


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


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


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


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

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


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

ставил


 
vl_chel ©   (2006-04-21 14:26) [8]

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

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

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

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


 
vl_chel ©   (2006-04-21 14:30) [9]

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


 
vl_chel ©   (2006-04-21 14:32) [10]

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


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

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


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

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


 
vl_chel ©   (2006-04-21 14:41) [13]

Вопрос - что написанно в 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:47) [14]


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


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


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

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


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

В краце, фишка в следующем:в данном конкретном случае всю область контрола закрывает объект 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;


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


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

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


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


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


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

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


 
SuperBug ©   (2006-04-21 18:14) [19]

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


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

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



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

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

Наверх




Память: 0.52 MB
Время: 0.027 c
1-1144268190
MBBIII
2006-04-06 00:16
2006.05.14
Создание и отладка Dll


3-1142966856
olevacho_
2006-03-21 21:47
2006.05.14
ошибка декларации udf


3-1142856484
GL00m
2006-03-20 15:08
2006.05.14
Не работает INSERT при работе с БД Access...


2-1145769671
Akudza
2006-04-23 09:21
2006.05.14
Функция bintoint


2-1146106507
Юрик
2006-04-27 06:55
2006.05.14
как отличить заглавную букву от прописной???