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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2011, 17:40   #1
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию Сместить значения массива

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

У меня есть массив и TabControl с вкладками, которые создаются динамически. Суть задачи - привязать вкладку к массиву.
Код:
type TTabArray:array[1..1000] of record
   Name:String;
   ImageIndex:Integer;
end;
...
var TabArray:TTabArray;
Привязываю значение массива при создании вкладки:
Код:
TabArray[TabControl.TabIndex].Name:=TabControl.Tabs.Caption;
TabArray[TabControl.TabIndex].ImageIndex:=TabControl.Tabs.ImageIndex;
(выше приведен пример процедуры создания, который не скомпилируется)

Все это работает отлично. Но у меня есть вопрос: когда мы удаляем вкладку, все позиции (Index) после удаленной смещаются на 1. Т.е., если мы удаляем вкладку у которой был индекс 8, то последующая вкладка (которая до удаления была девятой) становится восьмой. И так далее со следующими, которые стояли после удаленной.

Как по такому же принципу сместить массив?
Я привязываю адреса файлов к вкладкам через тип, описанный в начале. Когда происходит удаление не последней вкладки, то тип сбивается, т.к. в значении array[значение] индекс остается прежним.

Еще один пример:
К вкладке под номером 3 закреплено имя файла C:\example.txt, к вкладке под номером 4 - F:\boots.xml. Удаляем третью вкладку, на ее место (индекс) становится четвертая (но уже под индексом 3). И тебе по клику на третью мы имеем путь C:\example.txt, а не F:\boots.xml. Это логично, т.к. именно под таким индексом записан путь в массиве.

Всячески пытался объяснить проблему.
Буду признателен за помощь.
kettanaito вне форума Ответить с цитированием
Старый 24.09.2011, 17:45   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

вмесо массива используй TObjectList облегчишь себе жизнь и гемороя меньше.
Человек_Борща вне форума Ответить с цитированием
Старый 24.09.2011, 17:51   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

TabIndex нумеруется с 0. Массив тоже с 0 сделать лучше будет
При удалении вкладки с индексом i все элементы массива от i+1 и до конца перемещаем на одну позицию к началу массива
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.09.2011, 18:11   #4
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
TabIndex нумеруется с 0. Массив тоже с 0 сделать лучше будет
При удалении вкладки с индексом i все элементы массива от i+1 и до конца перемещаем на одну позицию к началу массива
Вот у меня собственно вопрос как это сделать?
kettanaito вне форума Ответить с цитированием
Старый 24.09.2011, 18:26   #5
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Решил проблему. Извините, что создал новую тему, нужно было использовать поиск.
kettanaito вне форума Ответить с цитированием
Старый 24.09.2011, 18:27   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

for k:=i+1 to 1000 do TabArray[k-1]:=TabArray[k];

Вместо 1000 лучше кол-во TabControl без 1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.09.2011, 18:56   #7
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Удаление и добавление элементов в динамический массив
Lesha вне форума Ответить с цитированием
Старый 24.09.2011, 19:59   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

ТС, странный вы=) Чесно. Пишите свои грабли. А ведь за вас такие грабли уже придумали ещё в 2002 году. И называются они Tlist(Classes.pas) и его наследник TObjectList(Contrs.pas). Эти классы создают динам. массив указателей. Это значит, что Tlist может хранить в себе все, что вы в него запихаете. А TobjectList может ещё и автоматически убивать(вызывть Free у обьектов) при вызове TobjectList.Destroy.

Очень удобные классы. Особенно при вашей задаче.

Последний раз редактировалось Человек_Борща; 24.09.2011 в 20:02.
Человек_Борща вне форума Ответить с цитированием
Старый 25.09.2011, 11:17   #9
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
for k:=i+1 to 1000 do TabArray[k-1]:=TabArray[k];
Господи люди, по сколько вы лет программируете в Делфи?
Код приведённые Вами будет маслать несколько миллисеунд.
A : array of TRecord;
SetLenGth(A,200);
записываем элементы
----------
удаляем 102 элемент
Код:
Move(A[102], A[101], SizeOf(TRecord)*99);
if LenGth(A)>0 then SetLenGth(A, LenGth(A)-1);
числа 102,102,99 вычисляются в зависимости от того какой элемент и сколько нужно удалить
Так же можно и вставить элемент, зхаранее расширив размерность массива и сместив элементы командой Move
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 25.09.2011, 11:27   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Господи люди, по сколько вы лет программируете в Делфи?
Для динамического массива да. А где вы его увидели в вопросе ТС?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присвоение значения елементу массива. Демик Общие вопросы C/C++ 2 26.05.2011 21:26
Значения массива Serebah Общие вопросы Delphi 7 09.02.2011 17:37
Присвоение переменной значения из массива Maxx Microsoft Office Excel 4 21.07.2010 13:53
Как сместить указатель мыши (с щелчком) на последний символ в Edit1 ??? newprog12 Общие вопросы Delphi 2 24.01.2010 12:12
Помогите сместить большую картинку на кнопке SpeedButton1 DemonXT Компоненты Delphi 4 19.11.2009 15:28