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