Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
1

Динамический массив, перемещение элемента

02.07.2012, 11:05. Показов 1652. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем есть динамический массив форм.

Delphi
1
BDForm.FormsList[i].Form // вызов
Допустим я открывая три формы.
Получается что FormsList[0].Form , FormsList[1].Form, FormsList[2].Form - начинают существование.

Вопрос в том, что при закрытии не последней формы, например 1й, последняя форма вставала на место закрытой формы (то есть 1й), а последний элемент массива освобождался.

Пробовал так, но где то не верно

Delphi
1
2
3
4
5
6
 max  := High(BDForm.FormsList);
  // FormID  - номер закрывающейся формы
  BDForm.FormsList[max].Form.FormID :=  BDForm.FormsList[FormID].Form.FormID; // передаю ID закрытой формы, последней форме
  BDForm.FormsList[FormID].Form :=  BDForm.FormsList[max].Form; 
  FreeAndNIL(BDForm.FormsList[max].Form); // освобождаю последний элемент
  SetLength(BDForm.FormsList, Length(BDForm.FormsList)-1); // уменьшаю массив на единицу
Добавлено через 23 минуты
Вопрос : Как поставить последнюю форму на место закрытой ?
Delphi
1
2
3
// firmID номер закрытой форы
// max номер последней формы 
BDForm.FormsList[FormID].Form := BDForm.FormsList[max].Form; // так не выходит
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2012, 11:05
Ответы с готовыми решениями:

Вставка элемента в одномерный динамический массив
Нужно добавить в массив один элемент. Процедура Add Место и значение элемента указываются. Что не...

Добавление элемента в динамический массив - как описать проверку необходимости расширения массива
Уважаемые форумчане. помогите не могу реализовать добавление элемента в дин.массив. - не могу...

Динамический массив. Инвертировать часть массива с элемента, номер которого задан, до последнего элемента
Инвертировать часть массива с элемента, номер которого задан, до последнего элемента, после чего...

Используя динамический массив выполнить перемещение всех цифровых символов в начало заданной строки
Требуется помощь в написании следующей задачи -> Ввести символьную строку. Выполнить...

18
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
02.07.2012, 11:24 2
Delphi
1
BDForm.FormsList[FormID].Form := BDForm.FormsList[Length(BDForm.FormsList)].Form;
а если так без max... ,а потом setlength
0
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
02.07.2012, 11:28  [ТС] 3
Нет, все равно при закрытии первой формы закрывает последнюю
Delphi
1
 FreeANDNIL(BDForm.FormsList[max]);
Что говорит о том что последняя форма не встала на место закрываемой

Добавлено через 1 минуту
Я даже так делал
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TBDForm.MoveForm(OldID, NewID: Integer);
begin
 
  FormsList[NewID] := FormsList[OldID];
  FormsList[NewID].Form := BDform.FormsList[OldID].Form;
  FormsList[NewID].Form.FormID := BDForm.FormsList[OldID].Form.FormID;
 
 
 
  FormsList[NewID].Panel.Tag := BDForm.FormsList[OldID].Panel.Tag;// тут еще панельки привязаны, но сначала надо форму передвинуть
  FormsList[NewID].Panel := BDform.FormsList[OldID].Panel;
 
  FreeAndNIL(BDForm.FormsList[OldID]);
end;
Delphi
1
BDForm.MoveForm(max, FormID);
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
02.07.2012, 11:37 4
а так у тебя дело в том что первая форма задана главной. Тебе надо сделать главной другую форму. Погугли я не знаю как это делается...
1
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
02.07.2012, 11:42  [ТС] 5
Ну они вроде все равнозначны? Главная BDForm дочерняя EDForm
Или вы имели ввиду главная форма в динамически созданных формах?
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
02.07.2012, 12:40 6
зачем закрывать первую ты же ей присваиваешь значение последней... Присвоил значение и закрыл последнюю... И покажи как ты закрываешь форму, может быть ты этим методом вырубаешь все формы разом...
0
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
02.07.2012, 12:55  [ТС] 7
Немного грязно
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
procedure TEdForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
  i, max, Ind: Integer;
  st: String;
 
 
begin
  CanClose := true;
  //BDForm.Label4.Caption := IntToStr(FormID);
 
  if bSave.Enabled then begin
    if MessageDlg('Данные не сохранены. Сохранить?', mtConfirmation, [mbOk, mbCancel], 0) = mrOk then begin
      Save;
    end;
  end;
    //Showmessage(IntToStr(Length(BDForm.formsList)));
    Cnt := Length(BDForm.FormsList);
    if Cnt-1 = FormID then begin
      ShowMessage('Последний');
      FreeAndNIL(BDForm.FormsList[FormID].Form);
      FreeAndNIL(BDForm.FormsList[FormID].Panel);
    end else begin
      ShowMessage('в середине');
 
      max  := High(BDForm.FormsList);
 
     // BDForm.FormsList[max].Form.FormID :=  BDForm.FormsList[FormID].Form.FormID;
      BDForm.FormsList[FormID] :=  BDForm.FormsList[max];
        //BDForm.FormsList[FormID].Form := BDForm.FormsList[Length(BDForm.FormsList)].Form;
 
 
        // BDForm.FormsList[max].Panel.Tag := BDForm.FormsList[FormID].Panel.Tag;
        // BDForm.FormsList[FormID].Panel  :=  BDForm.FormsList[max].Panel;
 
        //  BDForm.FormsList[max].Form.Free;
        //  BDForm.FormsList[max].Panel.Free;
 
        // BDForm.FormsList[max].Form := BDForm.FormsList[FormID];
         FreeANDNIL(BDForm.FormsList[max]);
   //   BDForm.MoveForm(max, FormID);
 
 
   end;
 
  
 
  SetLength(BDForm.FormsList, Length(BDForm.FormsList)-1);
 
 
 // for i := 0 to Length(BDForm.FormsList)-1 do begin
 //   st := st +'  FormsList[' +IntToStr(i)+ '] = ' + IntToStr(BDForm.FormsList[i].Form.FormID);
 // end;
 // ShowMessage(st);
 
 
 
end;
0
61 / 44 / 6
Регистрация: 15.01.2012
Сообщений: 167
02.07.2012, 13:03 8
Тебе нужно делать цикл.
Код писать не буду ибо некогда. Смотри, суть в том что тебе нужен цикл, ты знаешь индекс закрываемой формы и количество форм вообще, берешь цикл фор от "индекс закрываемой формы" до "количество форм вообше" и последовательно присваиваешь каждой предыдущей форме следующую, тем самым сдвигаешь все формы в массиве. А после самую последнюю форму освобождаем.
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
02.07.2012, 13:03 9
Почитай здесь может поможет...Как удалить динамически созданные объекты??
0
61 / 44 / 6
Регистрация: 15.01.2012
Сообщений: 167
02.07.2012, 13:06 10
удалять просто
либо
Delphi
1
FreeAndNil(TObject);
или
Delphi
1
2
TObject:=nil;
TObject.Free;
0
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
02.07.2012, 13:07 11
duhar, а если использовать Destroy; в чем разница между вашими методами и этим?..
0
61 / 44 / 6
Регистрация: 15.01.2012
Сообщений: 167
02.07.2012, 13:08 12
Destroy подходит только для форм. То есть выполняется процедура OnDestroy, а после выполняется то что я написал =)
1
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
02.07.2012, 13:09  [ТС] 13
Цитата Сообщение от duhar Посмотреть сообщение
Тебе нужно делать цикл.
Код писать не буду ибо некогда. Смотри, суть в том что тебе нужен цикл, ты знаешь индекс закрываемой формы и количество форм вообще, берешь цикл фор от "индекс закрываемой формы" до "количество форм вообше" и последовательно присваиваешь каждой предыдущей форме следующую, тем самым сдвигаешь все формы в массиве. А после самую последнюю форму освобождаем.
Этот вариант уже рассматривался, но например будет не 5 форм а 10000 и на закрытие формы потребуется секунда, то это не рационально. Надо бы последнюю форму переместить на место закрывающейся а последнюю free
0
61 / 44 / 6
Регистрация: 15.01.2012
Сообщений: 167
02.07.2012, 13:15 14
ну а в чем проблема та

Добавлено через 1 минуту
Delphi
1
2
Forms[DelFormIndex].Form:=Forms[(High(Forms))].Form;
Forms[(High(Forms))].Form.Free;
0
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
02.07.2012, 13:18  [ТС] 15
duhar, я третий день борюсь с этим, он последнюю форму не перемещает. И закрывается сразу две формы
0
61 / 44 / 6
Регистрация: 15.01.2012
Сообщений: 167
02.07.2012, 13:25 16
ААААА=))))
Туплю. тут надо проявить находчивость, щас у себя в проге над таким же косяком бился, надо вот так
Delphi
1
2
3
Forms[DelFormIndex].Form:=Forms[(High(Forms))].Form;
Forms[(High(Forms))].Form:=Nil;
Forms[(High(Forms))].Form.Free;
Пробуй

Добавлено через 3 минуты
проблема в том что при присвоении одной формы другой присваивается только адрес в памяти, и получается что две формы имеют один и тот же адрес, при попытке освобождения памяти этот адрес в памяти освобождается и сразу две формы перестают существовать.
1
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
02.07.2012, 13:25  [ТС] 17
duhar, отлично закрывает теперь только по одной) щас если ошибок с закрытием и сворачиванием не будет, то отлично)
0
61 / 44 / 6
Регистрация: 15.01.2012
Сообщений: 167
02.07.2012, 13:27 18
смотри, а жизнь то налаживается
1
42 / 59 / 15
Регистрация: 19.12.2011
Сообщений: 552
02.07.2012, 13:31  [ТС] 19
РЕШЕНО!
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
procedure TEdForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
   max: Integer;
begin
  CanClose := true;
   if bSave.Enabled then begin
    if MessageDlg('Данные не сохранены. Сохранить?', mtConfirmation, [mbOk, mbCancel], 0) = mrOk then begin
      Save;
    end;
  end;
    Cnt := Length(BDForm.FormsList);
    if Cnt-1 = FormID then begin
      FreeAndNIL(BDForm.FormsList[FormID].Form);
      FreeAndNIL(BDForm.FormsList[FormID].Panel);
    end else begin
 
      max  := High(BDForm.FormsList);
 
      BDForm.FormsList[max].Form.FormID :=  BDForm.FormsList[FormID].Form.FormID;
      BDForm.FormsList[FormID].Form :=  BDForm.FormsList[max].Form;
      BDForm.FormsList[max].Form := NIL;
      BDForm.FormsList[max].Form.Free;
 
 
      BDForm.FormsList[max].Panel.Tag := BDForm.FormsList[FormID].Panel.Tag;
      BDForm.FormsList[FormID].Panel := BDForm.FormsList[max].Panel;
      BDForm.FormsList[max].Panel := NIL;
      BDForm.FormsList[max].Panel.Free;
   end;
  SetLength(BDForm.FormsList, Length(BDForm.FormsList)-1);
end;
0
02.07.2012, 13:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2012, 13:31
Помогаю со студенческими работами здесь

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента)
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если...

Добавления элемента в динамический массив
ArrayList ar = new ArrayList(); protected void Page_Load(object sender, EventArgs e) ...

Массив: Добавление элемента в динамический массив
Помогите пожалуйста разобраться с добавлением элементов в динамический массив. Смысл в том, что...

Ошибка записи элемента в динамический массив
Объясните, почему выдает ошибку и не дает ввести последний k-ый элемент var a: array of...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru