Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2009, 18:01   #1
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Вопрос Обращение к динамически созданным компонентам.

Доброго времени суток !

Хочу спросить у Вас совета.
Мне нужно динамически создавать TTabSheet и TSynMemo во время работы программы.
как-то так :
Код:
procedure TForm1.N2Click(Sender: TObject);
var
nS:TTabSheet;
Syn:Tsynmemo;
begin
nS:=TTabsheet.Create(pagecontrol1);
ns.PageControl := pagecontrol1;
ns.ImageIndex := 0;
ns.Caption:='Unnamed'+inttostr(pagecontrol1.ControlCount)+'.afs';
ns.Name := 'tabsheet'+ inttostr(pagecontrol1.ControlCount);
syn:=Tsynmemo.Create(ns);
syn.Parent := ns;
syn.Align := alclient;
syn.Name := 'syn'+ inttostr(pagecontrol1.ControlCount);
syn.Gutter.Gradient:=true;
syn.Gutter.GradientStartColor := $0082BFBF;
syn.Gutter.GradientEndColor := clwhite;
syn.Gutter.LeftOffset := 2;
syn.Gutter.RightOffset := 2;
syn.Gutter.ShowLineNumbers := true;
syn.Gutter.ZeroStart :=true;
syn.Gutter.DigitCount := 5;
syn.Gutter.Font.Size := 10;
syn.Lines.Clear;
syn.BorderStyle:=bsnone;
end;
Далее разрушать ( при закрытии документа )
Если создать допустим tabsheet1 tabsheet2 tabsheet3
потом tabsheet2 разрушить , останутся tabsheet1 tabsheet3 , и при "открытии" нового документа ( будет создаватся tabsheet3 . ошибка).

Каким образом лучше давать имена ? как лучше решить эту проблему?
Так - же мне нужно будет по Caption TTabsheet обращатся к TSynMemo.

Смотрел http://programmersforum.ru/showthread.php?p=279991 .

Спасибо за советы !
Lime вне форума Ответить с цитированием
Старый 13.07.2009, 18:23   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Имхо для этого нужно использовать массив записей. Аля
Код:
type
  TMyTab=record
    Edit:SynMemo;
    Tab:TTabsheet;
  end;
var
  Tabs:array[1..100] of TMyTab;
  TabsCount:integer=0;
Cоздавая табу увеличивай Count. Удаляя сделуй тако инструкции:
Код:
for n:=deltab to TabsCount-1 do begin
  Tabs[n]:=Tabs[n+1];
end;
Dec(TabsCount);
// ошибок быть не должно
Тем более в запись можно внести доп. свойства, если нужно. и тд...
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 13.07.2009, 18:28   #3
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Тогда уж динамический массив. И не недо:
Код:
 
...
TabsCount:integer=0;
...
Или TStringList использовать, xратить там объект и имя на него...

Последний раз редактировалось Evgeniy26; 13.07.2009 в 18:43.
Evgeniy26 вне форума Ответить с цитированием
Старый 13.07.2009, 18:32   #4
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Цитата:
Тогда уж динамический массив. И не недо:
Практика показывает, что если постоянно увеличивать динамический массив то вылезем на ошибку, скачки памяти это не очень приятная вещь, посему нада принять в это во внимание.
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 13.07.2009, 18:50   #5
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Цитата:
Сообщение от Dj_smart Посмотреть сообщение
Удаляя сделуй тако инструкции:
Код:
for n:=deltab to TabsCount-1 do begin
  Tabs[n]:=Tabs[n+1];
end;
Dec(TabsCount);
// ошибок быть не должно
Тем более в запись можно внести доп. свойства, если нужно. и тд...
Я тоже склонялся к Вашему варианту , Спасибо .
Но очень не хотелось использовать нечто подобное "удалению" в Вашем варианте.
Мне кажется что это будет "влиять" на производительность .
На счёт доп свойств - это хорошо , даже полезно в конкретном случае ...
Сделал с TabsCount;

Добавил свойство Caption:string; Такое-же как и у TTabSheet (имя файла);
Теперь чтобы обратится к TSynMemo я предполагаю нужно организовать поиск по этому свойсту cреди массива?
И получим # TMyTab ?

Последний раз редактировалось Lime; 13.07.2009 в 18:56.
Lime вне форума Ответить с цитированием
Старый 13.07.2009, 18:52   #6
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Если удалять, используй TStringList удобней будет.

Последний раз редактировалось Evgeniy26; 13.07.2009 в 18:54.
Evgeniy26 вне форума Ответить с цитированием
Старый 13.07.2009, 18:52   #7
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Цитата:
Мне кажется что это будет "влиять" на производительность .
Делал подобный редактор, проблем небыло, производительность была в порядке.
Кстати даже данные должны идти по порядку а не кашей, посему утечек быть не должно по определению обычного массива
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 13.07.2009, 20:13   #8
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Чем не устраивает стандартный TObjectList?
Цитата:
Практика показывает, что если постоянно увеличивать динамический массив то вылезем на ошибку, скачки памяти это не очень приятная вещь, посему нада принять в это во внимание.
По сути TObjectList - это тот же динамический массив, только указателей.
Это же насколько интенсивно нужно изменять его размер, чтобы появились проблемы с памятью?
Сколько использовал, проблем никогда не возникало.
К тому же, в данном случае, компонент будет максимум несколько десятков, и проблем точно не возникнет.
+ TObjectList уже содержит реализацию, вставок, удалений и прочих функций, что, само собой, удобно.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 13.07.2009, 20:32   #9
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Радость

Цитата:
Сообщение от Daramant Посмотреть сообщение
Чем не устраивает стандартный TObjectList?

По сути TObjectList - это тот же динамический массив, только указателей.
Это же насколько интенсивно нужно изменять его размер, чтобы появились проблемы с памятью?
Сколько использовал, проблем никогда не возникало.
К тому же, в данном случае, компонент будет максимум несколько десятков, и проблем точно не возникнет.
+ TObjectList уже содержит реализацию, вставок, удалений и прочих функций, что, само собой, удобно.
А можно небольшой пример ?
С остальным что было написано выше я уже имел опыт , а с этим нет.
Осталось ещё несколько штрихов

Вот с "закрытием" документа не получается ...
Код:
for n:=deltab to TabsCount-1 do begin
  Tabs[n]:=Tabs[n+1];
end;
Dec(TabsCount);
Наверно нужно просто разрушать ... потому что после данного "удаления" все действия производимые с присвоенными обьектами выдают ошибку.
Хранить отдельный int не уменьшая его , тк при "удалении" TTabSheet & TSynMemo уменьшается TabsCount , и заново создаётся обьект с таким-же номером , хоть и относится к другому элементу Tabs[] .

Последний раз редактировалось Lime; 13.07.2009 в 20:49.
Lime вне форума Ответить с цитированием
Старый 13.07.2009, 21:02   #10
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Цитата:
А можно небольшой пример ?
Здесь нет ничего сложного.
Весь функционал можно посмотреть в исходниках (TObjectList в модули Contnrs и его предок TList в модуле Classes)
Вот пример:
Код:
var
  MyList: TObjectList;
  btn: TButton;
begin
  MyList := TObjectList.Create;

  btn := TButton.Create(nil);
  btn.Caption := 'btn 1';
  btn.Parent := Form1;
  MyList.Add(btn);

  btn := TButton.Create(nil);
  btn.Caption := 'btn 2';
  btn.Parent := Form1;
  MyList.Add(btn);

  ShowMessage(IntToStr(MyList.Count));

  TButton(MyList.Items[0]).Enabled := False;

  MyList.Free;

end;
TObjectList представляет собой список объектов типа TObject.
Т.к. обычно требуется использовать некоторый свой тип, то каждый раз делать приведение типов неудобно.
Код:
TButton(MyList.Items[0]).Enabled := False;
Поэтому, можно перекрыть несколько методов в потомке или агрегировать объект типа TObjectList в свой класс.

P.S.
А перед удалением записи объекты уничтожаешь?

Код:
Tabs[deltab].Edit.Free;<--
Tabs[deltab].Tab.Free; <--

for n:=deltab to TabsCount-1 do begin
  Tabs[n]:=Tabs[n+1];
end;
Dec(TabsCount);
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 13.07.2009 в 21:13.
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
доступ к виз компонентам созданным в рантайме amandra Общие вопросы Delphi 1 09.05.2009 22:17
Подробная литература по всем компонентам dimonbest Свободное общение 10 21.11.2008 16:51
Присвоение процедур компонентам N!ckeL Компоненты Delphi 4 26.04.2008 18:22
Обращение к компонентам из цикла satana Общие вопросы Delphi 4 16.07.2007 12:16