Cześć,
Jak można skopiować tablicę:
Tablica: array[1..8, 1..100] of string;
do ComboBox, gdzie [1..8]
to nazwa 8-literowa?
Pozdrawiam.
Cześć,
Jak można skopiować tablicę:
Tablica: array[1..8, 1..100] of string;
do ComboBox, gdzie [1..8]
to nazwa 8-literowa?
Pozdrawiam.
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.
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?
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ą ;)
Wygląda mi to na problem XY.
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.
nie mogę napisać jak to zrobić wprost ale mogę cię naprowadzić.
Jak się odwołać do wybranej przez ciebie kolumny? To jest bardziej niż proste, tutaj jest opis Tablice
Więcej nie mogę napisać.
OK, dzięki za informację. Przy okazji zapytam, jak zrobić żeby pierwszy wiersz był Od razu widoczny w ComboBoxie? (bez rozwijania)
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.
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.
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.