преиндексиране на динамичен масив...

6 отговора 145 прегледа
#1

преиндексиране на динамичен масив...

Здравейте, сигурен съм, че има елементарно разрешение на проблема ми, но какео да се прави - знанията не ми достигат... Та ето с няколко думи самият проблем:
Имам един листбокс в който добавям стойности и един динамичен масив (of Extended).
1. добавям в листбокса
2. определям дължина на масива равна на броя на items в листбокса
3. в масива - с индекс равен на броя items на листбокса добавям стойност която се получава при някакво изчисление

Целта ми е да получа сумата от елементите не масива и до тук всичко е наред, но искам да имам и бутон който да изтрива item от листбокса, което трябва да се свърже обаче и с въпросният масив. Тук за мен става пълна какафония -
след като натисна бутона за изтриване, как да изтрия самият елемент от масива с индекс аналогичен на този в листбокса? Пробвах да го (елемета с индекс равен на itemindex на листбокса) просвоя на нула, но това не ми върши работа, защото самия листбокс се "преиндексира" (не знам дали е правилно да се каже така), моя масив си запазва реда на индексите и всичко се омазва... Има ли функция за изтриване на елемент от динамичен масив? Има ли функция за преиндексиране на динамичен масив? Изобщо моля за съвет...

Благодаря предварително!

Отговор
в отговор на 111 #2

Re: преиндексиране на динамичен масив...

Най-лесно по начина който си избрал е :

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 на

Отговор
в отговор на AquilaX #3

Re: преиндексиране на динамичен масив...

Там е работата, че не мога да ползвам стойностите на листбокса понеже не са същите (дори не са числа) при самото добавяне в листбокса нещата са различни от тези в масива... в листбокса има текст+числа, но ми се вижда много грубо да ползвам регулярни изрази за да отделя текста от числата само за да мога да си напълня масива от предложеният от теб начин. Дали все пак няма ореиндексиране на динамични масиви?

Отговор
в отговор на 111 #4

Re: преиндексиране на динамичен масив...

ListBox1.Items.Delete(Inx);
For i:=Inx to High(MyArr)-1 do MyArr[ i ]:=MyArr[i+1];
SetLength(MyArr,High(MyArr));

Редактирано от NDeu на

Отговор
в отговор на NDeu #5

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

Отговор
в отговор на 111 #6

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.

Редактирано от NDeu на

Отговор
в отговор на NDeu #7

10x

Работи!

Благодаря за помощта!!!

Отговор