Kopiowanie tablicy do ComboBox

0

Cześć,

Jak można skopiować tablicę:

Tablica: array[1..8, 1..100] of string;

do ComboBox, gdzie [1..8] to nazwa 8-literowa?

Pozdrawiam.

0

możesz bardziej po polsku? Co masz w tablicy (przykładowe dane), co chciałbyś mieć docelowo w CB i co byś chciał dostać po wybraniu pozycji w CB.

1

Z deklaracji tej tablicy wychodzi na to, że w [1..8] siedzi 8 ciągów znaków per wiersz, a nie jeden, więc nijak. :D

Wyobraź sobie tę tablicę jako tabelkę 8x100 (8 kolumn i 100 wierszy), która w każdej swojej komórce przechowuje łańcuch (czyli łącznie 800 łańcuchów). Z której kolumny chcesz przepisywać ciągi do komponentu?

0

Można tylko po co tak?

var
    arr: array[1..2, 1..3] of string;
  i: Integer;
begin
    for i := 1 to 3 do
    begin
        arr[1][i] := 'a';
        arr[2][i] := 'b';
        ComboBox1.Items.Add(arr[1][i]+arr[2][i]);
    end;
end;

Lepiej użyć TStringList lub czegoś podobnego natomiast jeśli chcesz się zabezpieczyć przed wpisaniem więcej niż 8 znaków dodanego rekordu na liście / tablicy to można utworzyć sobie klasę z odpowiednią funkcją walidującą ;)

0

Wygląda mi to na problem XY.

0

Dokładniej mówiąc:
Tablica: array[1..8, 1..100] of string;

[1..8] to 8 "kolumn"
[1..100] to ilość "wierszy" dla każdej "kolumny"

w komórkach tablicy są z nazwy 8-literowe,

do ComboBox-a chcę wpisywać wszystkie "wiersze" [1..100] z jednej kolumny.

0

nie mogę napisać jak to zrobić wprost ale mogę cię naprowadzić.

  1. Jeśli chcesz dane wczytywać częściej niż tylko przy starcie aplikacji, musisz za każdym razem wyczyścić to co aktualnie jest w ComboBox-ie. Jest do tego funkcja Clear.
  2. Tablica ma stałą wielkość więc jest dużo prościej. Użyj pętli od 1 do 100.
  3. Wewnątrz pętli, przy każdej iteracji wpisujesz do ComboBox-a wartość z tablicy funkcją Add.

Jak się odwołać do wybranej przez ciebie kolumny? To jest bardziej niż proste, tutaj jest opis Tablice

Więcej nie mogę napisać.

0

OK, dzięki za informację. Przy okazji zapytam, jak zrobić żeby pierwszy wiersz był Od razu widoczny w ComboBoxie? (bez rozwijania)

0

W pętli ładujesz dane do combobox. Po zakończeniu pętli ustaw index dla combobox:

ComboBox.ItemIndex:=0;

0 to pierwsza pozycja, oczywiście możesz od razu ustawić inną. Jak chcesz wyczyścić to ustaw -1.

0

No dobra, rozpiszę się bo widać że potrzebujesz troszkę pomocy.

ComboBox ma style, podstawowy styl to csDropDown, znasz go na pewno.

Przykład, mamy w ComboBox następujące elementy:

Ala
Ewa
Ola

Jeśli chcesz się od razu ustawić np. na Ewa to możesz oczywiście zrobić to tak:

ComboBox.ItemIndex := 1; // 1 to drugi element

Ale co zrobić gdy nie znasz indexu? Robisz po prostu tak:

ComboBox.Text:='Ewa';

Fajnie działa. Ale jest pewien problem, styl ten ma możliwość wpisania do ComboBox wartości której nie ma w itemsach. Czasami takie coś może powodować problemy. Np., chcesz wybrać drukarkę z dostępnych. Nie możesz sobie wpisać przecież czegokolwiek.

Wtedy należy ustawić styl csDropDownList.
Wgrywasz dane do niego tak samo ale nie możesz nic wpisać czego nie ma w itemsach. Dodatkowo nie da rady ustawić się na odpowiednim itemsie w tak prosty sposób jak poprzednio. Oczywiście po indeksie bez problemu można.
Ale gdy chcesz się ustawić na jakimś elemencie znając tylko nazwę to należy zrobić to tak:

ComboBox.ItemIndex := ComboBox.Items.IndexOf('Ewa');

Na dzisiaj to wystarczy.

1
Markoni napisał(a):

do ComboBox-a chcę wpisywać wszystkie "wiersze" [1..100] z jednej kolumny.

No to indeks tej kolumny będzie hardkodowany (albo parametryzowany — jeśli chcesz mieć wybór kolumny), a po wierszach skaczesz w pętli. Przykład niżej, ze sparametryzowanym indeksem kolumny.

type
  TStringsArray = array [1 .. 8, 1 .. 100] of String;

procedure LoadArrayToComboBox(AComboBox: TComboBox; const AArray: TStringsArray; AColumnIndex: Integer);
var
  RowIndex: Integer;
begin
  AComboBox.Items.BeginUpdate();
  AComboBox.Items.Clear();
  try
    for RowIndex := 1 to 100 do
      AComboBox.Items.Add(AArray[AColumn, RowIndex]);
  finally
    AComboBox.Items.EndUpdate();
  end;
end;

Oczywiście dobrze by było, gdyby pętla nie posiadała hardkodowanych indeksów, a bazowała na wielkości macierzy. Do tego celu powinieneś skorzystać z funkcji Low i High, w taki sposób:

for RowIndex := Low(AArray[1]) to High(AArray[1]) do
  AComboBox.Items.Add(AArray[AColumnIndex, RowIndex]);

albo tak:

for RowIndex := Low(AArray[Low(AArray)]) to High(AArray[Low(AArray)]) do
  AComboBox.Items.Add(AArray[AColumnIndex, RowIndex]);

Jest to macierz prostokątna, więc obojętne której kolumny sprawdza się długość (wyżej użyłem pierwszej). Lepiej by było, gdybyś komórki indeksował od 0, bo to jest intuicyjne dla wszystkich.

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