ListBox przypisanie wartosci?

0

czesc wszystkim. Mam liste w listbox'ie jak powiino wygladac wypelnienie case by kazej linijce przypiusac wartosc , a nastepnie uzyc jej do obliczenia? np. z list box wybieram kawa - przypisana do niego lioczba to 3,44 po nacisnieciu buttonu mnozy wartosc wybrana z wpisana do edit'A np 5? Troche zamotate ale mam nadzieje ze wiecie co mam na mysli. :-D pzdr

0

Każde pole ListBoxa przechowywuje dodatkowo obiekt. W rzeczywistości są to po prostu dodatkowe 4 bajty, gdzie można upchnąć co się chce ;]. Taki przykład mały:
Dodanie tekstu z wartością:

var liczba: PSingle;
begin
  New(liczba);
  liczba^ := 3.44;
  ListBox.Items.AddObject('kawa', TObject(liczba));
end;

Odczytanie wartości:

var x: Single;
    i: Integer;
begin
  x := PSingle(ListBox.Items.Objects[i])^;
end;
0

A jak wyczyścić zawartość ListBoxa? Chcę po kliknięciu na przycisk zmienić zawartość listy.

0
Tarcil napisał(a)

A jak wyczyścić zawartość ListBoxa? Chcę po kliknięciu na przycisk zmienić zawartość listy.

ListBox1.Clear(); [???]

0
Sake napisał(a)

czesc wszystkim. Mam liste w listbox'ie jak powiino wygladac wypelnienie case by kazej linijce przypiusac wartosc , a nastepnie uzyc jej do obliczenia? np. z list box wybieram kawa - przypisana do niego lioczba to 3,44 po nacisnieciu buttonu mnozy wartosc wybrana z wpisana do edit'A np 5? Troche zamotate ale mam nadzieje ze wiecie co mam na mysli. :-D pzdr

var
R : Real;
I : Integer;
begin
I:=StrToInt(Edit1.text);
  case listBox1.ItemIndex of 
  0: R:= 3.44*I;
  1: // tu dla innych 
  2: // tu dla innych
  3: // tu dla innych
   end;
Label1.Caption:= FloatToStr(R);
end;
0

A gdyby zamias ListBoxa użyc ComboBoxa z własnością style=csDroopDownList? Następnie stworzyć tablicę współczynników indeksowaną od zera: const coeff :array[0..10] of float = (0.0, 0.1...) i operować później własnością ItemIndex. Zwalnia nas to z konieczności używania instrukcji case. Mnożenie odbywałoby się po prostu na zasadze: coś*coeff[ComboBox1.ItemIndex]. Jak na moje to ten sposób jest prostrzy.

0

*prostszy :)

0
Oleksy Adam napisał(a)

*prostszy :)

Akurat. To tak jakby jechać z Warszawy do Katowic przez Berlin i w końcu zamiast do Katowic pojechać do Krakowa. Co jest trudnego w case? Podałem gotowy kodzik, który jest wręcz banalny.

0
statjacek napisał(a)
Oleksy Adam napisał(a)

*prostszy :)

Akurat. To tak jakby jechać z Warszawy do Katowic przez Berlin i w końcu zamiast do Katowic pojechać do Krakowa. Co jest trudnego w case? Podałem gotowy kodzik, który jest wręcz banalny.

Zgadzam się, że instrukcja CASE jest prosta do użycia. Pamiętaj jednak, że nie wiemy ile item-ów będzie owy ComboBox zawierał. W przypadku kilku wartości jest to uzasadnione. A co jeżeli owych itemów będzie kilkaset? Dla każdego będzież tworzył osobną linie z warunkiem? Trochę dużo miejsca to zajmie. Moim zamysłem było aby współczynniki przechowywać nawet w osobnym pliku, wczytać je i zastąpić Twoje kilkaset wierszy kodu zwykłmy mnożeniem: Coś*coeff[ComboBox.ItemIndex]. Poza tym tablica współczynników też zajmie mniej miejsca.

const
 Coeff :array [0..10] of Float = (0.0, 0.1, 0.2, 0.3, 0.4, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9);
var
 x, y :float;
begin
 x := y * Coeff[ComboBox.ItemIndex];
end;

Moje kolejne pytanie jest, co zrobić jeżeli owe przypisanie trzeba będzie powtórzyć naście razy w kodzie? Mamy proste mnożenie 100 współczynników * 10 powtórzeń. 1000 wierszy? Gdzie ekonomia.
Mozna zrobić uniwersalną funkcję, do obliczania tego, ale po co? Będę bronił mojego sposobu jak lew.

0
Oleksy Adam napisał(a)
statjacek napisał(a)
Oleksy Adam napisał(a)

*prostszy :)

Akurat. To tak jakby jechać z Warszawy do Katowic przez Berlin i w końcu zamiast do Katowic pojechać do Krakowa. Co jest trudnego w case? Podałem gotowy kodzik, który jest wręcz banalny.

Zgadzam się, że instrukcja CASE jest prosta do użycia. Pamiętaj jednak, że nie wiemy ile item-ów będzie owy ComboBox zawierał. W przypadku kilku wartości jest to uzasadnione. A co jeżeli owych itemów będzie kilkaset? Dla każdego będzież tworzył osobną linie z warunkiem? Trochę dużo miejsca to zajmie. Moim zamysłem było aby współczynniki przechowywać nawet w osobnym pliku, wczytać je i zastąpić Twoje kilkaset wierszy kodu zwykłmy mnożeniem: Coś*coeff[ComboBox.ItemIndex]. Poza tym tablica współczynników też zajmie mniej miejsca.

const
 Coeff :array [0..10] of Float = (0.0, 0.1, 0.2, 0.3, 0.4, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9);
var
 x, y :float;
begin
 x := y * Coeff[ComboBox.ItemIndex];
end;

Moje kolejne pytanie jest, co zrobić jeżeli owe przypisanie trzeba będzie powtórzyć naście razy w kodzie? Mamy proste mnożenie 100 współczynników * 10 powtórzeń. 1000 wierszy? Gdzie ekonomia.
Mozna zrobić uniwersalną funkcję, do obliczania tego, ale po co? Będę bronił mojego sposobu jak lew.

To jest błędne rozumowanie, ponieważ Sake wie ile jest pozycji w menu. Każda pozycja ma przypisaną cene. Kawa, lody itp. Chodzi o to aby program policzył cene np. jak klijent zamówi 5 kaw.

0

Moje pytanie nadal brzmi: po co budować drabinkę CASE skoro można zastąpić ją jedną linią. Nie wnikam czy liczba pozycji w ListBoxsie jest ustalona, tylko ile ich jest. Jeżeli poniżej 10 to ok, niech będzie instrukcja CASE. Moje rozwiązanie jest przyszłościowe. Zakłada ono, że lista "zakupów" będzie rosła. Wielokrotnie pisałem programy do obliczeń wytrzymałościowych, gdzie do wyboru było dziesiątki współczynników. Nie wyobrażam sobie aby można było owo zadanie zrealizować inaczej. Jest ono elastyczne, ponieważ można użyć pętli przeszukujących i innych tego typu "ekstrawagancji".
Programowanie nauczyło mnie jednego: założona wielkość programu i jego opcji w miarę upływu czasu rośnie. Dlatego dobrze na samym początku przedsięwziąć kroki zapobiegawcze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1