Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Вниз

Не получаеться совсем. 


UserL   (2002-04-12 13:39) [0]

Здраствуйте...
Создал фрейм, который потом динамически создаю на главной форме. (И таких фреймов может быть сколько угодно). А на этом фрейме создаю, тоже динамически попарно одинаковые объекты. И у одного объекта есть событие Удалит, которое появляется при нажатии на нем правой кнопки мыши и удаляет объект.
Как оповестить фрейм, чтоб можно было удалить второй (парный) объект их фрейма,
И как оповестить главную форму, чтоб из нее запретить обращение к удаленным объектам?
Пробовал Notification и FreeNotification.
Не работает...



Игорь Шевченко   (2002-04-12 14:54) [1]

День добрый,

Когда вы удаляете объект, то он вызывает Notification своего хозяина с Operation=opRemove. Хозяин при этом может выполнять любые действия, в том числе и удалять "парный" объект.

Может быть, приведете свой код, в которым не получается ?

С уважением,



UserL   (2002-04-15 06:28) [2]

Вот создаю фрэйм:

GrafikFrame := TGrafikFrame.Create(Self);
GrafikFrame.Parent:=Self;
GrafikFrame.Name:="Grafik"+IntToStr(List.Count);
GrafikFrame.D_D.DragDropControl:=GrafikFrame.Chart1;
List.Add(GrafikFrame);
FormResize(Self);

где:
GrafikFrame - потомок от TFrame + на нем расположены
кое какие компаненты

А в этом фрейме создаю уже компаненты попарно, и если удалив один нужно удалить и второй тоже

NamesColor:=TNameColor.Create(ScrollBox1);
ListColor.Add(NamesColor);
GrafNew:=TLineSeries.Create(Chart1);
ListSeries.Add(GrafNew);
ColorNew:=SetColor(ListColor.Count); //Выбор цвета
With GrafNew Do
Begin
Title:="График";
LinePen.Width:=2;
Stairs:=True;
InvertedStairs:=True;
ShowInLegend := False;
SeriesColor := ColorNew;
ColorEachPoint:=False;
Chart1.AddSeries(GrafNew);
XValues.DateTime := False; //*************
AddXY(0,0);
End;
With NamesColor Do
Begin
Name:="NamesColor"+FloatToStr(ListColor.Count*Random(2000));
Parent:=ScrollBox1;
Height:=19;
Left:=0;
Top:=Height*(ListColor.Count-1);
ColorSet:=SetColor(ListColor.Count);;
NameSet:=NameTi;
//NameSet:=" "+IntToStr(NumTi)+NameTi;



А вот сама процедура Notification

procedure Notification(AComponent: TComponent; Operation: TOperation); override;

А вот ее тело (пока просто для визуального наблюдения)

procedure TGrafikFrame.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited;
If (AComponent Is TNameColor)And(Operation=opRemove) Then
ShowErrors(Handle, 5);
end;


А в собственном компоненте TNameColor в конструкторе дописал:
FreeNotification(AOwner.Owner);
А то без этой строчки TGrafikFrame.Notification не обрабатывался.



UserL   (2002-04-15 06:32) [3]

А щас еще лжна проблемка возникла.
Если Notification родителя оставлять, то при закрытии программы вылетает постоянно ошибка в модуле rtl60.bpl (кажеться) и программа не закрываеться совсем.



Игорь Шевченко   (2002-04-15 09:55) [4]

День добрый,

В вашем коде, TNameColor имеет Owner"ом ScrollBox1. Кто является
Owner"м ScrollBox1 из кода не видно.

Может, стоит попробовать так:

NamesColor:=TNameColor.Create(Self);
NamesColor.FreeNotification (Self);

С уважением,



UserL   (2002-04-15 10:13) [5]

Да, эту ошибку я заметил и уже исправил как и у Вас в коде.
Но всеравно ошибка появляется сноваи снова.
Но если обработчик FreeNotofication написать в главной форме, а
NamesColor.FreeNotification (Self.Owner), то все работает как надо.
Вот почему так? Разобраться никак не могу.
Большое спасибо



Игорь Шевченко   (2002-04-15 10:37) [6]

День добрый,
Вот сделан простой пример:

type
TFrame2 = class(TFrame)
Edit1: TEdit;
Edit2: TEdit;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
procedure Notification(AComponent : TComponent; Operation : TOperation); override;
constructor Create(AOwner : TComponent); override;
{ Public declarations }
end;

implementation

{$R *.DFM}

constructor TFrame2.Create(AOwner: TComponent);
begin
inherited;
Edit1.FreeNotification (Self);
end;

procedure TFrame2.N1Click(Sender: TObject);
begin
Edit1.Free();
end;

procedure TFrame2.Notification(AComponent: TComponent;
Operation: TOperation);
begin
if (AComponent = Edit1) AND (Operation = opRemove) then
Edit2.Free();
inherited;
end;

На форму положены два Frame. В меню один пункт "Удалить". При вызове этого пункта меню удаляются оба Edita. Без ошибок :-)

С уважением,




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.039 c
1-80962           pls                   2002-04-12 10:50  2002.04.25  
TControl.Hint???


3-80748           B_A_V                 2002-04-04 08:06  2002.04.25  
тип datetime


3-80774           kol                   2002-04-04 14:45  2002.04.25  
простой вопрос по SQL


1-81009           Demon Ltd             2002-04-13 00:05  2002.04.25  
Работа повторно с меню


1-80903           VJar                  2002-04-14 23:33  2002.04.25  
Самокопирование