С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Кирилл1000
1 / 1 / 0
Регистрация: 05.05.2015
Сообщений: 60
1

Заполнение динамического массива через edit

22.12.2016, 17:59. Просмотров 1058. Ответов 10
Метки нет (Все метки)

Доброе время суток. Не получается довести до ума добавление элементов в одномерный динамический массив через обычный edit. Что получилось - прикрепляю. По возможности, помогите довести до ума.
0
Вложения
Тип файла: rar Массив.rar (1.63 Мб, 3 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2016, 17:59
Ответы с готовыми решениями:

Ввод через edit на основе динамического массива
Доброго времени суток. Начну издалека. Есть готовая программа на delphi,...

Заполнение динамического массива
Хочу вручную заполнить динамический массив. В последний элемент массива после...

Заполнение динамического массива
procedure TForm1.LoadListItem; var Item:TListItem; i,j: integer; s,s1:...

Заполнение StringGrid-a через Edit
помогите разобраться почему программа делает так.

заполнение двухмерного динамического массива
заполняю массив так arr:array of array of integer; implementation {$R...

10
avstantso
72 / 71 / 43
Регистрация: 17.11.2016
Сообщений: 211
22.12.2016, 19:07 2
Достал Unit2 из архива. Натравил форматер CnPack. Увидел следующее:

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
var
  Form2: TForm2;
   i: Integer;
  mas: array of integer;//динамический массив
  sum,len,km: Integer;
 
 
implementation
{$R *.dfm}
 
procedure TForm2.Button2Click(Sender: TObject);
begin
 
  for i := 0 to len do
  begin
    mas[len] := strtoint(edit2.text);
    Memo1.Lines.Add('Элемент массива [' + IntToStr(i) + ']: ' + IntToStr(mas[len]));
    len := len + 1;
  end;
end;
 
procedure TForm2.Button3Click(Sender: TObject);
begin
  memo2.Clear;
  for i := 0 to len - 1 do
  begin
    memo2.Lines.Add(inttostr(mas[i]));
    sum := sum + mas[i];
  end;
  ShowMessage(inttostr(sum));
end;
 
procedure TForm2.FormShow(Sender: TObject);
begin
  Memo1.Lines.Clear;
  SetLength(mas, 10);
  len := strtoint(edit1.Text);
  sum := 0;
  for i := 1 to len do
  begin
//Memo1.Lines.Add('Элемент массива [' + IntToStr(i) + ']: ' + IntToStr(mas[i]));
  end;
end;
 
end.
Для доведения до ума:
1. Сделай счетчики циклов локальными переменными.
2. Код Button2Click делает что-то странное... Кирилл1000, что именно должна делать эта процедура?

Пример добавления элемента в одномерный динамический массив
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type
  TIntDynArr = array of integer;
 
/// <summary>
///   Добавить один элемент в конец динамического массива.
/// </summary>
/// <param name="AArray">
///   Массив, в который производим добавление.
/// </param>
/// <param name="AItem">
///   Добавляемый элемент.
/// </param>
/// <returns>
///   Индекс добавленного элемента.
/// </returns>
function IntDynArrayAddItem(var AArray : TIntDynArr; const AItem : integer) : integer;
begin
  Result := Length(AArray);
  SetLength(AArray, Result + 1);
  AArray[Result] := AItem;
end;
1
Кирилл1000
1 / 1 / 0
Регистрация: 05.05.2015
Сообщений: 60
22.12.2016, 19:12  [ТС] 3
Цитата Сообщение от avstantso Посмотреть сообщение
2. Код Button2Click делает что-то странное... Кирилл1000, что именно должна делать эта процедура?
Это у меня так добавлялся элемент..
0
avstantso
72 / 71 / 43
Регистрация: 17.11.2016
Сообщений: 211
22.12.2016, 19:18 4
Кирилл1000, почему там цикл от нуля до текущей длинны? Сколько элементов тебе нужно добавить?
0
Кирилл1000
1 / 1 / 0
Регистрация: 05.05.2015
Сообщений: 60
22.12.2016, 19:19  [ТС] 5
Цитата Сообщение от avstantso Посмотреть сообщение
Кирилл1000, почему там цикл от нуля до текущей длинны? Сколько элементов тебе нужно добавить?
Столько, сколько будет указано в edit 1. А цикл - это уже изощрялся как мог.
0
avstantso
72 / 71 / 43
Регистрация: 17.11.2016
Сообщений: 211
22.12.2016, 19:27 6
Кирилл1000, сейчас получается, что при старте программы (при показе формы) из edit1 берется значение len, указанное в дизайнтайме (и пользователь его изменить не может). Затем, при нажатии кнопки Button2 в массив надо добавить len одинаковых элементов со значением из edit2. При повторном нажатии — еще раз добавить.

Правильно ли я понял твои намерения?
0
Кирилл1000
1 / 1 / 0
Регистрация: 05.05.2015
Сообщений: 60
22.12.2016, 19:33  [ТС] 7
Цитата Сообщение от avstantso Посмотреть сообщение
Правильно ли я понял твои намерения?
Не совсем.
Правильно поняли:
1) из edit1 берется значение len, указанное в дизайнтайме (и пользователь его изменить не может).

Неправильно:
1)Затем, при нажатии кнопки Button2 в массив надо добавить len одинаковых элементов со значением из edit2. При повторном нажатии — еще раз добавить.

"в массив надо добавить len одинаковых элементов со значением из edit2" -
Нужно добавить столько элементов, сколько указано в len, но при каждом нажатии в массив добавляется всего один элемент, который указан в edit 2.
Т.е. , первое нажатие:
edit 2 = 4
mas[] = 4

второе нажатие:
edit 2 = 3
mas[] = 4 3

третье нажатие:
edit 2 = 1
mas[] = 4 3 1

- и так до тех пор, пока кол-во элементов массива не будет равно значению edit 1
0
avstantso
72 / 71 / 43
Регистрация: 17.11.2016
Сообщений: 211
22.12.2016, 19:55 8
Лучший ответ Сообщение было отмечено Кирилл1000 как решение

Решение

Тогда можно внести следующие изменения:

После присвоения значения len сразу выделить память под массив (не 10, а len) и завести переменную — заполненная длина, допустим lenFilled.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
  sum,len,lenFilled,km: Integer;
 
procedure TForm2.FormShow(Sender: TObject);
begin
  Memo1.Lines.Clear;
  len := strtoint(edit1.Text);
  SetLength(mas, len);
  lenFilled := 0;
  sum := 0;
  for i := 1 to len do
  begin
//Memo1.Lines.Add('Элемент массива [' + IntToStr(i) + ']: ' + IntToStr(mas[i]));
  end;
end;
Здесь задаем очередной элемент и увеличиваем заполненную длину.
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm2.Button2Click(Sender: TObject);
begin
 
  if lenFilled = len then
    Exit; // Можно еще сообщение показать
 
  mas[lenFilled] := strtoint(edit2.text);
  Inc(lenFilled); 
end;
1
Кирилл1000
1 / 1 / 0
Регистрация: 05.05.2015
Сообщений: 60
22.12.2016, 20:03  [ТС] 9
Цитата Сообщение от avstantso Посмотреть сообщение
Тогда можно внести следующие изменения:
Спасибо за помощь, но не получается вывести массив с помощью вашего кода в memo1. Просто записывает пробел и всё
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
unit Unit2;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Button2: TButton;
    Edit2: TEdit;
    Button3: TButton;
    Memo2: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormShow(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
  mas: array of integer;//динамический массив
  sum,len,lenFilled,km,i: Integer;
 
 
implementation
{$R *.dfm}
 
procedure TForm2.Button2Click(Sender: TObject);
begin
 
  if lenFilled = len then
    Exit; // Можно еще сообщение показать
 
  mas[lenFilled] := strtoint(edit2.text);
  Inc(lenFilled);
  for i := 1 to len do
  Memo1.Lines.Add('Элемент массива [' + IntToStr(i) + ']: ' + IntToStr(mas[i]))
end;
 
procedure TForm2.Button3Click(Sender: TObject);
begin   {
memo2.Clear;
for i:= 0 to len-1 do
begin
memo2.Lines.Add(inttostr(mas[i]));
sum := sum + mas[i];
end;
ShowMessage(inttostr(sum)); }
end;
 
procedure TForm2.FormShow(Sender: TObject);
begin
  Memo1.Lines.Clear;
  len := strtoint(edit1.Text);
  SetLength(mas, len);
  lenFilled := 0;
  sum := 0;
  for i := 1 to len do
  begin
//Memo1.Lines.Add('Элемент массива [' + IntToStr(i) + ']: ' + IntToStr(mas[i]));
  end;
 
end;
end.
0
avstantso
72 / 71 / 43
Регистрация: 17.11.2016
Сообщений: 211
22.12.2016, 20:04 10
Выводи от 0 до lenFilled
0
Кирилл1000
1 / 1 / 0
Регистрация: 05.05.2015
Сообщений: 60
22.12.2016, 20:07  [ТС] 11
Цитата Сообщение от avstantso Посмотреть сообщение
Выводи от 0 до lenFilled
Всё. Исправил! Спасибо огромное!
0
22.12.2016, 20:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2016, 20:07

Заполнение динамического массива циклом For.
вырезал часть кода //================================GLOBAL...

Заполнение динамического массива из Memo
Написал такую часть проги, она не хочет работать. procedure...

Заполнение динамического массива именами файлов
Здравствуйте. Есть вот какая проблема. Необходимо заполнить динамический массив...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru