No przecież Items.Add dodaje Ci jeden element.
Skąd mamy wiedzieć, co robi Twoja funkcja?
Ech....Niech będzie, podam Ci gotowe własne rozwiązanie:
Jeśli będziesz chciał znać jakieś dodatkowe informacje(np. ID rekordu, z którego jest zaczytane pole), to stwórz sobie typ:
type
TComboObj = record
Value: LongInt;
end;
Jeśli nie, to olej wszystko, co związane z tym typem w poniższej funkcji:
function ExecuteQueryList(Query: string; ListFieldName: string; List: TStrings;
ListFieldValName: string = ''; ConListFieldName: string = '';
Connection: TADOConnection = nil;
MessageOnError: boolean = true): boolean;
var
ADO: TADOQuery;
Obj: TComboObj;
FN: string;
begin
result:=false;
if Connection = nil then Connection := Base.MainConnection;
try
Ado:=TADOQuery.Create(Application);
ADO.Connection:=Connection;
ADO.SQL.Text:=Query;
ADO.Open;
ADO.First;
while not ADO.Eof do
begin
if ListFieldValName<>'' then Obj.Value:=ADO.fieldByName(ListFieldValName).AsInteger;
if conListFieldName<>'' then
FN:=ADO.FieldByName(ListFieldName).AsString+' '+ADO.FieldByName(ConListFieldName).AsString
else FN:=ADO.FieldByName(ListFieldName).AsString;
if ListFieldValName<>'' then List.AddObject(FN, TObject(Obj))
else List.Add(FN);
ADO.Next;
end;
Result:=true;
except
on E: Exception do
begin
if MessageOnError then
application.MessageBox(PChar('Wystąpił błąd: '+#13+#10+e.Message), PChar(Application.Title), mb_OK+mb_IconStop);
end;
end;
if ADO<>nil then FreeAndNil(ADO);
end;
Funkcja pobiera dane pole(pola) z bazy, a następnie umieszcza je w przekazanym TStrings.
Parametry:
Query - zapytanie SELECT do wykonania(np: Select ID, pole1, pole2, pole3 from tabela)
ListFieldName - nazwa pola, którego wartość będzie pokazywana w combo(np: pole1)
List - obiekt TStrings, do którego zaczytane zostaną wartości
ListFieldValName - nazwa pola, które ma pełnić rolę identyfikatora(np: ID). Jeśli olałeś TComboObj, to olej to też
ConListFieldName - nazwa pola, która będzie dołączona do pola ListFieldName(przykład poniżej)
Connection - TADOConnection do połączenia z bazą
MessageOnError - czy, jesli wystąpi błąd, funkcja ma o tym poinformować.
W powyższej funkcji użyłem czegoś takiego jak: Base.MainConnection.
To jest mój domyślny obiekt TADOConnetion. Usuń tą linię albo wpisz tam swój domyślny. On jest brany pod uwagę wtedy, gdy nie przekażesz parametru Connection.
Przykłady użycia:
Zakładając taki zbiór danych:
ID | Pole 1 | Pole 2
-----------------------------
1 | Blabla | Ojojoj
-----------------------------
2 | Inne | rumtumtum
-----------------------------
Wywołanie:
var
myQuery: string;
begin
myQuery:='SELECT * FROM tabela';
executeQueryList(myQuery, 'pole1', comboBox.Items);
end;
Spowoduje wypełnienie ComboBoxa wartościami:
Blabla
Inne
Wywołanie:
var
myQuery: string;
begin
myQuery:='SELECT * FROM tabela';
executeQueryList(myQuery, 'pole1', comboBox.Items, 'ID', 'pole2');
end;
Spowoduje wypełnienie ComboBox tak:
Blabla Ojojoj
Inne Rumtumtum
ponadto będziesz miał dostęp do wartości ID poprzez:
id:=TComboObj(ComboBox.Items.Objects[index_elementu]).Value;
oczywiście, jeśli nic nie wywalisz i zadeklarujesz klasę TComboObj
:)
Zrozumiano? :)