Форум: "Компоненты";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизКак применить общее свойство к N обьектам? Найти похожие ветки
← →
Brack (2005-07-13 02:37) [0]Можно ли присвоить определенному количеству компонентов определенные переменные либо процедуру, которая будет одинаковой для всех в главном модуле программы?
К примеру есть несколько преобразованных компонентов Tlabel, и нужно чтобы при наведении на какой-либо из них мышью, в окне TEdit1 показывалось его имя, т.е. выполнялась процедура в главном модуле программы вызывающаяся при наведении на любой компонент Tlabel.
← →
Юрий Зотов © (2005-07-13 02:46) [1]> Можно ли присвоить определенному количеству компонентов
> определенные переменные
Присвоить компоненту переменную? Это как так?
> либо процедуру, которая будет одинаковой для всех в главном
> модуле программы?
Обработчик события? Можно.
> выполнялась процедура в главном модуле программы вызывающаяся
> при наведении на любой компонент Tlabel.
CM_MOUSEENTER или OnMouseMove.
← →
Brack (2005-07-13 03:07) [2]Присвоить компоненту переменную:
к примеру:
uses Tlabel;
...
any:integer;
...
только чтобы этот any становился равен anу1 в главном модуле программы при обработке события label(n).MouseMove
вот как такое "как так" можно сделать?
← →
Юрий Зотов © (2005-07-13 03:24) [3]> uses Tlabel;
Это как так?
> чтобы этот any становился равен anу1
Что такое any1?
← →
Brack (2005-07-13 03:47) [4]точнее:
uses label
применятся пока как модуль, но он есть преобразованный Tlabel.
any - это переменная находящаяся в модуле label
any1 - это переменная находящаяся в главном модуле.
ЗЫ: Я понимаю, что не настолько разбираюсь в терминах ООП, и в его принципах. Поэтому разъясняюсь как могу, и считаю что - более-менее понятно. А если нету желания помочь то попрошу не писать подобных замечаний.
← →
Просто Джо © (2005-07-13 04:18) [5]
> и считаю что - более-менее понятно.
Вы ошибочно так считаете. Я, например, тоже не понял. Думаю, того, что вы хотели сказать, не поймет и 0.1% форумцев.
← →
Юрий Зотов © (2005-07-13 04:19) [6]> uses label
Зачем писать придумки вместо реального кода? Чтобы Вас было еще труднее понять? Модуля с таким именем быть не может, в Паскале Label - зарезервированное слово.
> считаю что - более-менее понятно.
Совершенно непонятно. Вы используете термины настолько произвольно, что они просто теряют смысл. Поэтому давайте без терминов, без переменных и без модулей - просто опишите, что Вы хотите получить, обычными русскими словами.
> попрошу не писать подобных замечаний.
Вам не нужны подсказки, где сделаны ошибки?
← →
Brack (2005-07-13 14:24) [7]Вот такая вот задача:
Все операции проводятся на форме Form1.
Существует N преобразованных компонентов TLabel, называются они TMetka. Также они создаются в ходе работы программы.
Нужно чтобы при наведении на них мышью, в окне Edit1 появлялось имя N-ого компонента, на который и был наведен курсор.
Как осуществить эту задачу с помощью FindComponent и Timer`a я разобрался. Но с конструктивной точки зрения это не эффективно.
Проще можно было бы сделать если бы эти компоненты создавались заранее на форме. И тогда бы в каждом свойстве Metka(N)MouseMove прописать Edit1.text:=Metka(N).Caption
Но как поступить с нашей задачей, когда компоненты не создаются заранее?
← →
Digitman © (2005-07-13 15:49) [8]
> TMetka
Metka := TMetka.Create(..); //создаем объект в ран-тайм
Metka.OnMouseMove := DoOnMouseMove; //назначаем единый обработчик события
← →
Юрий Зотов © (2005-07-13 16:11) [9]
unit MyLabel;
interface
uses
Messages, Classes, Controls, StdCtrls;
type
TNotifyLabel = class(TLabel)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
procedure MouseEnter; dynamic;
procedure MouseLeave; dynamic;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;
TMyLabel = class(TNotifyLabel)
FEdit: TCustomEdit;
procedure SetEdit(const Value: TCustomEdit);
protected
procedure MouseEnter; override;
procedure MouseLeave; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetEditText(const AText: string);
published
property Edit: TCustomEdit read FEdit write SetEdit;
end;
implementation
{ TNotifyLabel }
procedure TNotifyLabel.CMMouseEnter(var Message: TMessage);
begin
inherited;
MouseEnter
end;
procedure TNotifyLabel.CMMouseLeave(var Message: TMessage);
begin
inherited;
MouseLeave
end;
procedure TNotifyLabel.MouseEnter;
begin
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self)
end;
procedure TNotifyLabel.MouseLeave;
begin
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self)
end;
{ TMyLabel }
procedure TMyLabel.MouseEnter;
begin
SetEditText(Caption);
inherited
end;
procedure TMyLabel.MouseLeave;
begin
SetEditText("");
inherited
end;
procedure TMyLabel.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (Operation = opRemove) and (AComponent = FEdit) then
FEdit := nil
end;
procedure TMyLabel.SetEdit(const Value: TCustomEdit);
begin
if FEdit <> Value then
begin
if FEdit <> nil then
RemoveFreeNotification(FEdit);
FEdit := Value;
if FEdit <> nil then
FreeNotification(FEdit)
end
end;
procedure TMyLabel.SetEditText(const AText: string);
begin
if (FEdit <> nil) and not (csDesigning in ComponentState) then
FEdit.Text := AText
end;
end.
Вашу задачу решает компонент TMyLabel. Просто назначаете ему свойство Edit, а все остальное он сделает сам.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.014 c