преиндексиране на динамичен масив...
6 отговора
145 прегледа
преиндексиране на динамичен масив...
Здравейте, сигурен съм, че има елементарно разрешение на проблема ми, но какео да се прави - знанията не ми достигат... Та ето с няколко думи самият проблем:
Имам един листбокс в който добавям стойности и един динамичен масив (of Extended).
1. добавям в листбокса
2. определям дължина на масива равна на броя на items в листбокса
3. в масива - с индекс равен на броя items на листбокса добавям стойност която се получава при някакво изчисление
Целта ми е да получа сумата от елементите не масива и до тук всичко е наред, но искам да имам и бутон който да изтрива item от листбокса, което трябва да се свърже обаче и с въпросният масив. Тук за мен става пълна какафония -
след като натисна бутона за изтриване, как да изтрия самият елемент от масива с индекс аналогичен на този в листбокса? Пробвах да го (елемета с индекс равен на itemindex на листбокса) просвоя на нула, но това не ми върши работа, защото самия листбокс се "преиндексира" (не знам дали е правилно да се каже така), моя масив си запазва реда на индексите и всичко се омазва... Има ли функция за изтриване на елемент от динамичен масив? Има ли функция за преиндексиране на динамичен масив? Изобщо моля за съвет...
Благодаря предварително!
Имам един листбокс в който добавям стойности и един динамичен масив (of Extended).
1. добавям в листбокса
2. определям дължина на масива равна на броя на items в листбокса
3. в масива - с индекс равен на броя items на листбокса добавям стойност която се получава при някакво изчисление
Целта ми е да получа сумата от елементите не масива и до тук всичко е наред, но искам да имам и бутон който да изтрива item от листбокса, което трябва да се свърже обаче и с въпросният масив. Тук за мен става пълна какафония -
след като натисна бутона за изтриване, как да изтрия самият елемент от масива с индекс аналогичен на този в листбокса? Пробвах да го (елемета с индекс равен на itemindex на листбокса) просвоя на нула, но това не ми върши работа, защото самия листбокс се "преиндексира" (не знам дали е правилно да се каже така), моя масив си запазва реда на индексите и всичко се омазва... Има ли функция за изтриване на елемент от динамичен масив? Има ли функция за преиндексиране на динамичен масив? Изобщо моля за съвет...
Благодаря предварително!
Re: преиндексиране на динамичен масив...
Най-лесно по начина който си избрал е :
т.е. да си напълниш масива наново. Масива е малко излишен в случая според ман но ти си знаеш
AquilaX
procedure TForm1.Button1Click(Sender: TObject);
var
k:Integer;
begin
SetLength(masiv, ListBox1.Items.Count);
for k := 0 to ListBox1.Items.Count-1 do
try
masiv[k] := StrToFloat(ListBox1.Items[k])
except
masiv[k] := 0;
end;
end;
т.е. да си напълниш масива наново. Масива е малко излишен в случая според ман но ти си знаеш
AquilaX
Редактирано от AquilaX на
Re: преиндексиране на динамичен масив...
Там е работата, че не мога да ползвам стойностите на листбокса понеже не са същите (дори не са числа) при самото добавяне в листбокса нещата са различни от тези в масива... в листбокса има текст+числа, но ми се вижда много грубо да ползвам регулярни изрази за да отделя текста от числата само за да мога да си напълня масива от предложеният от теб начин. Дали все пак няма ореиндексиране на динамични масиви?
Re: преиндексиране на динамичен масив...
ListBox1.Items.Delete(Inx);
For i:=Inx to High(MyArr)-1 do MyArr[ i ]:=MyArr[i+1];
SetLength(MyArr,High(MyArr));

For i:=Inx to High(MyArr)-1 do MyArr[ i ]:=MyArr[i+1];
SetLength(MyArr,High(MyArr));
Редактирано от NDeu на
Re: преиндексиране на динамичен масив...
procedure Tf_add_profile.b_addClick(Sender: TObject);
begin
if not err then
begin
if c_type.Text='Ïðîôèë 20x40' then
begin
ListBox1.Items.Add(c_type.Text+' '+e_broi.Text+'x'+e_razmer.Text);
SetLength(p_40,ListBox1.Items.Count);
ShowMessage(IntToStr(ListBox1.Items.Count));
p_40[ListBox1.Items.Count-1]:=StrToFloat(e_broi.Text)*StrToFloat(e_razmer.Text);
end;
if c_type.Text='Ïðîôèë 20x60' then
begin
ListBox2.Items.Add(c_type.Text+' '+e_broi.Text+'x'+e_razmer.Text);
SetLength(p_60,ListBox2.Items.Count);
p_60[ListBox2.count]:=StrToFloat(e_broi.Text)*StrToFloat(e_razmer.Text);
end;
end
else
MessageDlg('Âúçíèêíàëè ñà ñëåäíèòå ïðîáëåìè: '+#13+err_msg,mtError,[mbok],0);
end;
procedure Tf_add_profile.b_removeClick(Sender: TObject);
var i:integer;
begin
if ListBox1.ItemIndex>-1 then
begin
p_40[ListBox1.ItemIndex]:=0;}
ListBox1.Items.Delete(ListBox1.ItemIndex);
for i:=ListBox1.ItemIndex to High(p_40)-1 do p_40[ i ]:=p_40[i+1];
SetLength(p_40,High(p_40));
end;
{ if ListBox2.ItemIndex>-1 then
begin
p_60[ListBox2.ItemIndex-1]:=0;
ListBox2.Items.Delete(ListBox2.ItemIndex);
//SetLength(p_60,ListBox1.Items.Count);
end;}
if ListBox1.Count=0 then p_40:=nil;
if ListBox2.Count=0 then p_60:=nil;
end;
Ето и целия код върху който се тормозя - при последното предложение избива:
Range Check Error
begin
if not err then
begin
if c_type.Text='Ïðîôèë 20x40' then
begin
ListBox1.Items.Add(c_type.Text+' '+e_broi.Text+'x'+e_razmer.Text);
SetLength(p_40,ListBox1.Items.Count);
ShowMessage(IntToStr(ListBox1.Items.Count));
p_40[ListBox1.Items.Count-1]:=StrToFloat(e_broi.Text)*StrToFloat(e_razmer.Text);
end;
if c_type.Text='Ïðîôèë 20x60' then
begin
ListBox2.Items.Add(c_type.Text+' '+e_broi.Text+'x'+e_razmer.Text);
SetLength(p_60,ListBox2.Items.Count);
p_60[ListBox2.count]:=StrToFloat(e_broi.Text)*StrToFloat(e_razmer.Text);
end;
end
else
MessageDlg('Âúçíèêíàëè ñà ñëåäíèòå ïðîáëåìè: '+#13+err_msg,mtError,[mbok],0);
end;
procedure Tf_add_profile.b_removeClick(Sender: TObject);
var i:integer;
begin
if ListBox1.ItemIndex>-1 then
begin
p_40[ListBox1.ItemIndex]:=0;}
ListBox1.Items.Delete(ListBox1.ItemIndex);
for i:=ListBox1.ItemIndex to High(p_40)-1 do p_40[ i ]:=p_40[i+1];
SetLength(p_40,High(p_40));
end;
{ if ListBox2.ItemIndex>-1 then
begin
p_60[ListBox2.ItemIndex-1]:=0;
ListBox2.Items.Delete(ListBox2.ItemIndex);
//SetLength(p_60,ListBox1.Items.Count);
end;}
if ListBox1.Count=0 then p_40:=nil;
if ListBox2.Count=0 then p_60:=nil;
end;
Ето и целия код върху който се тормозя - при последното предложение избива:
Range Check Error
Re: преиндексиране на динамичен масив...
ListBox1.Items.Delete(ListBox1.ItemIndex);
for i:=ListBox1.ItemIndex to High(p_40)-1 do p_40[ i ]:=p_40[i+1];
Каква ли е стойността на ListBox1.ItemIndex след ListBox1.Items.Delete(ListBox1.ItemIndex)
Или изпълни ListBox1.Items.Delete(ListBox1.ItemIndex) последно, или направи това, което съм ти дал, като преди това присвоиш Inx:=ListBox1.ItemIndex.

for i:=ListBox1.ItemIndex to High(p_40)-1 do p_40[ i ]:=p_40[i+1];
Каква ли е стойността на ListBox1.ItemIndex след ListBox1.Items.Delete(ListBox1.ItemIndex)
Или изпълни ListBox1.Items.Delete(ListBox1.ItemIndex) последно, или направи това, което съм ти дал, като преди това присвоиш Inx:=ListBox1.ItemIndex.
Редактирано от NDeu на