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

Вниз

Фрэймы с одинаковым Owner   Найти похожие ветки 

 
Кто б сомневался ©   (2015-03-31 19:39) [0]

Есть фрэймы, которые создаются в runtime от одного класса.
Этот класс наследован от TFrame  - TMyFrame(TFrame).

Так вот если у этих фрэймов указывать одного владельца - чтобы он их освободил, то создать второй фрэйм не получиться. Будет писать что компонент с таким именем уже есть, даже если менять имя заранее в своем конструкторе TMyFrame до вызова inherited конструктора фрэйма.

А все дело в этом коде :
if (ClassType <> TFrame). ClassType в моем случае TMyFrame.

Forms.pas:
constructor TCustomFrame.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
   csSetCaption, csDoubleClicks, csParentBackground, csPannable, csGestures];
 if (ClassType <> TFrame) and not (csDesignInstance in ComponentState) then
 begin
   if not InitInheritedComponent(Self, TFrame) then  // << здесь пишет что имя уже есть, там он присваивает имя фрэйму TMyFrame
     raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
 end
 else
 begin
   Width := 320;
   Height := 240;
 end;
end;


Что тут можно сделать?


 
Кто б сомневался ©   (2015-03-31 19:40) [1]

Т.е. в том методе InitInheritedComponent, присваивается новое имя "TMyFrame" .


 
Кто б сомневался ©   (2015-03-31 19:43) [2]

Даже если до вызова будет уникальное имя "Frame1" - все равно присвоит "TMyFrame"


 
Кто б сомневался ©   (2015-03-31 19:47) [3]

Можно ставить уникальное имя после выхода из конструктора.
Хм.. Чет не подумал.. :)


 
Юрий Зотов ©   (2015-03-31 20:56) [4]

ЕМНИП, в классе TMyFrame надо перекрыть метод SetComponentName (или SetName, точно не помню), а в нем можно назначить любое уникальное имя.


 
SergP ©   (2015-04-01 12:35) [5]

Хм... Была когда-то такая проблема... Не стал заморачиваться и просто тупо присвоил уникальное имя после создания очередного фрейма и до создания следующего фрейма

 //
 //  Создание отображаловки статов
 //
 for pers:=0 to PersCount-1 do
   begin
     y:=pers mod PersPerY;
     x:=pers div PersPerY;

     FrameX[pers]:=TFrstats.Create(self);
     FrameX[pers].Parent:=self;
     FrameX[pers].Left:=x*DxFrameStat;
     Framex[pers].Top:=y*DyFrameStat;
    Framex[pers].Name:="PersStats"+inttostr(pers);
   end;


 
Юрий Зотов ©   (2015-04-01 15:21) [6]

Эх, соскучился я по Delphi...

procedure TMyFrame.SetComponentName(NewName: string);
var
 i, n: Integer;
 C: TComponent;
begin
 n := 1;
 for i := 0 to Owner.ComponentCount - 1 do
 begin
   C := Owner.Components(i);
   if (C is TMyFrame) and (C <> Self) then
     inc(n)
 end;
 inherited SetComponentName("MyFrame" + IntToStr(n))
end;


 
Дмитрий С ©   (2015-04-01 18:48) [7]

Я пустое имя присваивал после создания в рантайме - работало.


 
Кто б сомневался ©   (2015-04-01 23:58) [8]


> Юрий Зотов ©   (01.04.15 15:21) [6]


Сколько кода и переменных.
>>const<< NewName: string

Я бы так сделал:

procedure TMyFrame.SetComponentName(const NewName: string);
var
 i: Integer;
begin
 i := Owner.ComponentCount;  
 while AOwner.FindComponent(sComponentName + IntToStr(i) ) <> nil do
   inc(i);

 Name := "Frame" + IntToStr(i);
end;


Owner.ComponentCount
 inherited SetComponentName("MyFrame" + IntToStr(n))
end;


 
Кто б сомневался ©   (2015-04-02 00:04) [9]

* inherited SetComponentName вместо Name конечно


 
Германн ©   (2015-04-02 02:51) [10]


> Юрий Зотов ©   (01.04.15 15:21) [6]
>
> Эх, соскучился я по Delphi...

И проблему с удалением в рантайме не продумал. :)


 
Юрий Зотов ©   (2015-04-02 09:00) [11]

> Кто б сомневался ©   (01.04.15 23:58) [8]

1. Разве const есть в прототипе?

2. На форме 20 компонентов и пока еще ни одного фрейма. Создаем на этой форме новый фрейм. Вопрос: какое имя он получит? Ответ: странное.

3. Кто такие AOwner и sComponentName?

4. Вложенность циклов не способствует скорости. Особенно, когда она не нужна.

5. Зачем вообще здесь нужен цикл while?

6. Итог: погрешностей больше, чем исполняемых операторов.

7. Целью должен быть нормальный код, а не экономия строчек.


 
Юрий Зотов ©   (2015-04-02 09:05) [12]

> Германн ©   (02.04.15 02:51) [10]

> И проблему с удалением в рантайме не продумал. :)


С этим должен согласиться.


 
Кто б сомневался ©   (2015-04-02 15:09) [13]


> Юрий Зотов ©   (02.04.15 09:00) [11]


>>1. Разве const есть в прототипе?

Там не SetComponentName, а SetName. Через константу.

Нда, тут разные задачи. У меня фрэйм бар - который держит и отрисовывает фрэймы и заголовки к ним. Он владелец и родитель (TScrollingWinControl).
И вот если создаем и добавляем новый фрэйм, меняется число - т.е. в моем случае FindComponent отработает один раз.


 
KSergey ©   (2015-04-02 15:46) [14]

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

Это касается вообще любого создаваемого в run-time компонента VCL


 
Юрий Зотов ©   (2015-04-02 23:13) [15]

> KSergey ©   (02.04.15 15:46) [14]
> Это касается вообще любого создаваемого в run-time компонента VCL


Создаваемым в run-time компонентам имена вообще не нужны. Ведь при создании в design-time  имя компонента - это на самом деле идентификатор поля формы, которое ссылается на этот компонент, поэтому имя нужно (для DFM).  А при создании в run-time все это лишнее (исключая возможные специальные случаи).


 
KSergey ©   (2015-04-03 08:59) [16]

> Юрий Зотов ©   (02.04.15 23:13) [15]

Всё так, что что делать? Вы не написали )


 
Юрий Зотов ©   (2015-04-03 12:06) [17]

>  что делать

1. Зайти дебаггером внутрь IninInheritedComponent и далее - чтобы точно определить, какой именно метод генерирует ошибку.

2. Проанализировать код этого метода и принимать решение, исходя из анализа. Возможно, надо что-то просто перекрыть (тот же SetName, например).

3. Поставить брейк в родном SetName и по приходу на эток брейк просмотреть стек вызовов.  Надо понять, почему в родной SetName приходит неуникальное имя - откуда оно берется и почему оно неуникальное?



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2015.11.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.002 c
15-1428484727
han_malign
2015-04-08 12:18
2015.11.29
то ли не знал, то ли забыл...


15-1428569892
Ghost del vonte
2015-04-09 11:58
2015.11.29
Толи лыжи не едут, толи я...


15-1427465159
Polevi
2015-03-27 17:05
2015.11.29
java jsp


15-1427203124
KilkennyCat
2015-03-24 16:18
2015.11.29
Рассада 116 видов культур огородных


15-1427905090
Rouse_
2015-04-01 19:18
2015.11.29
Ну что, делимся, как кого развели на 1 апреля





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