Форум: "Начинающим";
Текущий архив: 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