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 https://4programmers.net/Delphi/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.