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

Вниз

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

 
Александр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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
6-1137772300
Kolya
2006-01-20 18:51
2006.05.14
Дата и время из интернета.


9-1129845311
Ricks
2005-10-21 01:55
2006.05.14
Алгоритм вычисления карты освещения


1-1144306856
Zhekson
2006-04-06 11:00
2006.05.14
TeeChart7Pro(Color Range)


6-1137589378
Аленка
2006-01-18 16:02
2006.05.14
Устройство proxy


2-1145689613
Khim
2006-04-22 11:06
2006.05.14
Indy, soket error # 100060 Connection time out





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский