Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Связка TabControl и других элементов


Автор: Dende-Soft 4.1.2008, 11:54
Такая трабла. Есть табКонтрол. На нем лежит SynEdit. Нужно чтобы при создании новой вкладки на ней создавался новый СинЕдит. Понятно? А то я сонный еще...

Автор: MetalFan 4.1.2008, 14:05
нет у табконтрола вкладок... по сути это одна панель с табсетом

Добавлено через 17 секунд
используй pagecontrol

Автор: Sunvas 4.1.2008, 17:42
Возможно лучше просто подгружать в synedit текст при переходе по вкладкам?

Автор: mr.Anderson 4.1.2008, 18:06
Dende-Soft, не воровать мою http://forum.vingrad.ru/forum/topic-188372.html smile Для задачи действительно надо пользовать PageControl, он куда удобнее.
Код

procedure ...
var
 syn : TSynEdit;
begin
 //предположим, в Tab - указатель на только что созданную вкладку

 syn := TSynEdit.Create( Application );
 syn.Parent := Tab;
end;

И усе.

Автор: MetalFan 5.1.2008, 11:28
Цитата(mr.Anderson @  4.1.2008,  18:06 Найти цитируемый пост)
syn := TSynEdit.Create( Application );

зачем так жестоко? почему Application?

Автор: aktuba 5.1.2008, 16:06
Цитата(MetalFan @  5.1.2008,  12:28 Найти цитируемый пост)
Цитата(mr.Anderson @  4.1.2008,  18:06 Найти цитируемый пост)
syn := TSynEdit.Create( Application );

зачем так жестоко? почему Application? 

Видимо у людей дурные привычки...

Цитата(mr.Anderson @  4.1.2008,  19:06 Найти цитируемый пост)
Для задачи действительно надо пользовать PageControl, он куда удобнее.


Цитата(Sunvas @  4.1.2008,  18:42 Найти цитируемый пост)
Возможно лучше просто подгружать в synedit текст при переходе по вкладкам? 


Sunvas прав. Правильнее и удобнее, в данном случае, использовать TTabSet + подгружать необходимый текст при переключении закладок. PageControl предназначен, в основном, для закладок с разными контролами на них...

Автор: mr.Anderson 5.1.2008, 16:18
MetalFan, а какая разница? Я привык Application писать. А что нужно?

Автор: MetalFan 5.1.2008, 16:44
mr.Anderson, ты понимаешь, для чего предназначен параметр у TComponent.Create?
и что получается, когда ты Application туда отдаешь?

Автор: mr.Anderson 5.1.2008, 21:46
MetalFan, нет, не знаю и не понимаю. Объясните, пожалуйста.

Автор: dumb 6.1.2008, 01:27
аргумент конструктора указывает на компонент-владелец(Owner), при уничтожении которого будет уничтожен и создаваемый компонент.
если в качестве владельца указывается nil, то забота об уничтожении создаваемого компонента ложится на плечи программера. указание же в качестве владельца Application таки имеет определенный смысл - при завершении программы будет вызван деструктор создаваемого компонента.

Автор: MetalFan 6.1.2008, 10:13
Цитата(dumb @  6.1.2008,  01:27 Найти цитируемый пост)
указание же в качестве владельца Application таки имеет определенный смысл

конечно имеет, если понимать, зачем это делаешь.
в вышеупомянутом случае можем получить утечку памяти... когда TTabSheet "закрывается", то "лежащие" на нем контролы, у которых владелец Application, продолжут себе жить...

Автор: Sunvas 6.1.2008, 12:55
Цитата(MetalFan @  6.1.2008,  10:13 Найти цитируемый пост)
можем получить утечку памяти.

Ну.. Мы не видели всего когда.
mr.Anderson, ты делаешь free?

Автор: mr.Anderson 6.1.2008, 18:17
Sunvas, у чего? У меня все динамические контролы живут во все время работы с программой. Все, что создается, не уничтожается никогда,а если уничтожается, то, разумеется, через Free. То есть, как я понял, передавать nil?

Автор: VICTAR 6.1.2008, 18:45
Логичней всего было бы передавать таб, на котором будет располагаться создаваемый контрол.

Автор: Koji 20.2.2008, 13:20
 smile 

Автор: Rennigth 20.2.2008, 13:32
Цитата(MetalFan @  6.1.2008,  10:13 Найти цитируемый пост)
конечно имеет, если понимать, зачем это делаешь.
в вышеупомянутом случае можем получить утечку памяти... когда TTabSheet "закрывается", то "лежащие" на нем контролы, у которых владелец Application, продолжут себе жить...

так-так-так, подождите... если парент уничтожается то и все его дети тоже вроде уничтожаются...  smile  ща глянем полутше, может я ошибаюсь.

Добавлено через 8 минут и 17 секунд
Цитата(Rennigth @  20.2.2008,  13:32 Найти цитируемый пост)
может я ошибаюсь

Не, не ошибаюсь smile 
Код

destructor TWinControl.Destroy;
var
  I: Integer;
  Instance: TControl;
begin
  Destroying;
  if FDockSite then
  begin
    FDockSite := False;
    RegisterDockSite(Self, False);
  end;
  FDockManager := nil;
  FDockClients.Free;
  if Parent <> nil then RemoveFocus(True);
  if FHandle <> 0 then DestroyWindowHandle;
  I := ControlCount;
  while I <> 0 do
  begin
    Instance := Controls[I - 1];
    Remove(Instance);
    Instance.Destroy;
    I := ControlCount;
  end;
  FBrush.Free;
{$IFDEF LINUX}
  if FObjectInstance <> nil then WinUtils.FreeObjectInstance(FObjectInstance);
{$ENDIF}
{$IFDEF MSWINDOWS}
  if FObjectInstance <> nil then Classes.FreeObjectInstance(FObjectInstance);
{$ENDIF}
  FPadding.Free;
  inherited Destroy;
end;


Ну это конечно только если есть парент.

Автор: MetalFan 20.2.2008, 15:31
Цитата(Rennigth @  20.2.2008,  13:32 Найти цитируемый пост)
если парент уничтожается то и все его дети тоже вроде уничтожаются...  

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

Автор: Rennigth 20.2.2008, 15:35
Цитата(MetalFan @  20.2.2008,  15:31 Найти цитируемый пост)
не путай парента и овнера.

А я и не путаю smile
Цитата(MetalFan @  20.2.2008,  15:31 Найти цитируемый пост)
при уничтожении овнера все принадлежащие ему компоненты будут автоматически уничтожены.

Тоже можно сказать и про парента. Я имею ввиду что Owner имеет список Components, Parent список Controls, и эти списки косвенно взаимосвязаны.

Автор: MetalFan 20.2.2008, 15:40
хм... хотя я не прав. посмотрел ДНК.
Код

...
procedure TControl.SetParent(AParent: TWinControl);
begin
  if FParent <> AParent then
  begin
    if AParent = Self then
      raise EInvalidOperation.CreateRes(@SControlParentSetToSelf);
    if FParent <> nil then
      FParent.RemoveControl(Self);
    if AParent <> nil then
    begin
      AParent.InsertControl(Self); ///// <--------------------------
      UpdateAnchorRules;
    end;
  end;
end;
....
procedure TWinControl.InsertControl(AControl: TControl);
var
  Item: TControlListItem;
begin
...
  Insert(AControl);
...
end;
...
procedure TWinControl.Insert(AControl: TControl);
begin
  if AControl <> nil then
  begin
    if AControl is TWinControl then
    begin
      ListAdd(FWinControls, AControl);
      ListAdd(FTabList, AControl);
    end else
      ListAdd(FControls, AControl);
    AControl.FParent := Self;
  end;
end;


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

Добавлено через 1 минуту и 59 секунд
Цитата(Rennigth @  20.2.2008,  15:35 Найти цитируемый пост)
А я и не путаю smile

ага, это я путал) сорь)

Автор: Esperito 20.2.2008, 17:04
MetalFan, а где в этом коде виден Owner?

Автор: Rennigth 20.2.2008, 17:56
Цитата(Esperito @  20.2.2008,  17:04 Найти цитируемый пост)
MetalFan, а где в этом коде виден Owner? 

В этом коде Owner и не виден. С ним и так все понятно. В этом коде видно что и Parent тоже контролирует свих детей.

Автор: Esperito 20.2.2008, 20:20
Цитата(Rennigth @ 20.2.2008,  17:56)
В этом коде Owner и не виден. С ним и так все понятно. В этом коде видно что и Parent тоже контролирует свих детей.

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

Автор: Rennigth 20.2.2008, 21:06
Цитата(Esperito @  20.2.2008,  20:20 Найти цитируемый пост)
Ну да, содержит ссылки в своём массиве. Но освобождением памяти ведь не занимается. 

Освобождение происходит в дестрое. Я уже приводил код в http://forum.vingrad.ru/index.php?showtopic=189964&view=findpost&p=1419210 топике.

Автор: Esperito 21.2.2008, 22:14
Цитата(Rennigth @ 20.2.2008,  21:06)
Освобождение происходит в дестрое. Я уже приводил код в http://forum.vingrad.ru/index.php?showtopic=189964&view=findpost&p=1419210 топике.

Ааа, прошу прощения. Пропустил smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)