powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как при вводе числа в Edit1, по очереди удалять элементы?
14 сообщений из 14, страница 1 из 1
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941502
Дмитрий97
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда я ввожу число значения массива в Eidt1 то элемент удаляется с этим значением, пытаюсь удалить следующий элемент. Массив создаётся заново и удаляется другой элемент массива. Вообщем сколько раз я бы не вводил, удаляется только один элемент. Как это можно исправить, чтобы при удалении, массив сохранялся с уже удалённым элементом и при повторе удалялся другой элемент, до тех пор пока массив не станет пустым. Основной код привязан к Button2.
Код: pascal
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.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TArr = array of integer;
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  n: Integer;
   TArr2: Array [1..2] of integer;
  A1: TArr;



implementation

{$R *.dfm}




procedure delElem( var A : TArr; elem: String );
var i,ii, h : Integer;

begin

 for ii:=1 to Length(A)-1 do
 begin
  if IntToStr(A[ii]) = elem then
  begin
     h := High(A);
     if elem = '' then Exit;
     if h = -1 then Exit;
     for i := ii to h - 1 do A[i] := A[i + 1];
     SetLength(A, h);
  end;
 end;


end;

procedure asdf(var A: TArr);
begin
  SetLength(A, 11);
  A[1]:=10;
  A[2]:=11;
  A[3]:=12;
  A[4]:=13;
  A[5]:=14;
  A[6]:=15;
  A[7]:=16;
  A[8]:=17;
  A[9]:=18;
  A[10]:=19;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Arr: TArr; i:Integer;
begin
  //Создаёт массив
  asdf(Arr);
  Memo1.Clear;
  for i:=1 to Length(Arr)-1 do
  begin
    Memo1.Lines.Append( IntToStr(Arr[i]) );
  end;
 
  
end;

procedure TForm1.Button2Click(Sender: TObject);
var Arr: TArr; i:Integer;
begin
  //Создаёт массив
   asdf(Arr);
  //Удадяет массив
  delElem( Arr, Edit1.Text );
  Memo2.Clear;
  for i:=1 to Length(Arr)-1 do
  begin
   Memo2.Lines.Append( IntToStr(Arr[i]) );
  end;
end;

end.

...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941503
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий97
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure delElem( var A : TArr; elem: String );
var i,ii, h : Integer;

begin

 for ii:=1 to Length(A)-1 do
 begin
  if IntToStr(A[ii]) = elem then
  begin
     h := High(A);
     if elem = '' then Exit;
     if h = -1 then Exit;
     for i := ii to h - 1 do A[i] := A[i + 1];
     SetLength(A, h);
  end;
 end;


end;


Я не совсем вник в "проблему", но тут вроде как явный косяк. Твой тип TArr - это динамический массив, он индексируется от нуля. Даже если ты в качестве параметра передашь массив, который индексируется иначе.
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941505
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий97Как это можно исправить

Именно для таких случаев придумали пошаговую отладку. Идёшь по коду и смотришь на значения
переменных пока они не начнут отличаться от тех, которые ты ожидаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941506
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий97
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure asdf(var A: TArr);
begin
  SetLength(A, 11);
  A[1]:=10;
  A[2]:=11;
  A[3]:=12;
  A[4]:=13;
  A[5]:=14;
  A[6]:=15;
  A[7]:=16;
  A[8]:=17;
  A[9]:=18;
  A[10]:=19;
end;


И тут, вроде, то же самое, ты про нулевой элемент забыл...
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941522
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий97,
автор h := High(A);
...
SetLength(A, h );

не вижу уменьшения массива. Просто часть массива перетирается, при этом последний элемент не меняется
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941523
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
не вижу уменьшения массива. Просто часть массива перетирается, при этом последний элемент не меняется
Для тебя High и Length одно и то же? ;)
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941524
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

нет, но у него именно эта проблема
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941527
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
rgreat,

нет, но у него именно эта проблема

кстати, он еще и пересоздает массив перед удалением элемента

procedure TForm1.Button2Click(Sender: TObject);
var Arr: TArr; i:Integer;
begin
//Создаёт массив
asdf(Arr);
//Удадяет массив
delElem( Arr, Edit1.Text );
Memo2.Clear;
for i:=1 to Length(Arr)-1 do
begin
Memo2.Lines.Append( IntToStr(Arr[i]) );
end;
end;
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941528
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gerasimenko
rgreat,

нет, но у него именно эта проблема


Код: pascal
1.
2.
3.
4.
5.
6.
  var A := [1,2,3];
  var h := High(A);
  Writeln(length(A));
  SetLength(A, h);
  Writeln(length(A));
  Readln;



результат3
2
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941529
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Gerasimenko
rgreat,

нет, но у него именно эта проблема


Код: pascal
1.
2.
3.
4.
5.
6.
  var A := [1,2,3];
  var h := High(A);
  Writeln(length(A));
  SetLength(A, h);
  Writeln(length(A));
  Readln;



результат3
2

Да, в данном конкретном случае, я тупанул. Пересоздание массива у него.
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941532
Дмитрий97
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе я это и ожидал, что никто мне не поможет. Придут люди воздух потрясут, дадут “вумные” советы и разбегутся. Потому, что никто не знает.
авторЯ не совсем вник в "проблему", но тут вроде как явный косяк. Твой тип TArr - это динамический массив, он индексируется от нуля. Даже если ты в качестве параметра передашь массив, который индексируется иначе.
Если вы не поняли сути проблемы, хотя я максимально подробно объяснил что нужно удалять элементы массива через edit, пока массив не будет пустой. Тогда вряд ли вы знаете как удалять элементы массива.
авторИменно для таких случаев придумали пошаговую отладку. Идёшь по коду и смотришь на значения
переменных пока они не начнут отличаться от тех, которые ты ожидаешь.
Ваша отладка нафиг никому не нужна меня интересует сам алгоритм, а не отладка кода, я ей пользуюсь только в том случае если серьёзная ошибка и код не запускается, а он работает криво но работает.
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941535
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий97
Ваша отладка нафиг никому не нужна меня интересует сам алгоритм, а не отладка кода, я ей пользуюсь только в том случае если серьёзная ошибка и код не запускается, а он работает криво но работает.


рукалицо.

Когда код не запускается - его не отлаживают, а исправляют.
А отладка - это как раз для случая криво работающего кода.
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941537
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что это было? Эт чё, новая поросль программистов? В трех соснах плутают и отладкой брезгуют с апломбом? Нда...
...
Рейтинг: 0 / 0
Как при вводе числа в Edit1, по очереди удалять элементы?
    #39941561
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий97,

Ты в Edit вводишь что? N элемента массива или элемент массива, который нужно удалить? Если элемент массива - могут ли быть в массиве дубли?

А так-то:

Код: pascal
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.
 Function SearchInArr(Arr:TDynamicArray; Searched: integer):integer;
 var i : integer;
 begin 
   Result:=-1;                           // ничего не нашли
   for i:=0 to Length(Arr)-1 do   // помним, что дин. массивы индексируются с 0
     begin
         if  (Arr[i] = Searched) then
             begin
                 Result:=i;
                 break;
             end;
     end;
  end;

 // ну пусть Arr - глобальная переменная
 Procedure DeleteItems;
 var Idx, j : integer;
 begin
  repeat
   Idx:=SearchInArr(Arr, IntToStr(Edit) );  // что ищем. Тут кстати уместнее IntToStrDef() или какой-то MaskEdit / SpinEdit для ввода...
   if (Idx>-1) then                                   // нашли?
     begin
       j:=0;
       for i:=0 to Idx-1 do
          begin
            Arr[j]:=Arr[i];
            inc(j);
          end;
       for i:=Idx+1 to Length(Arr)-1 do
          begin
            Arr[j]:=Arr[i];
            inc(j);
          end;    
       SetLength(Arr,Length(Arr)-1);        // удалили 1 элемент, сократили длину массива на 1.
     end;
  until Idx=-1;                                     // если ничего не нашли - значит не ничего не делаем
 end;



P.S. Писалось на коленке. Не проверялось. Так что отладчик может и пригодится :)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как при вводе числа в Edit1, по очереди удалять элементы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]