![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
создание класса
Александр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]
> после клика ни чего не происходит
А что должно по-твоему произойти ?