ComboBox + DBgrid

Odpowiedz Nowy wątek
2009-03-03 14:13
zxcv
0

Witam,

Bardzo proszę o pomoc. Chciałbym wyświetlić zawartość DBGrida dokładnie jednej kolumny w ComboBox.
i oto mam taki kodzik:

x:=pzapytanieSelect('Select stanowisko FROM stanowiska_wob;',Form4.ADOQuery1,'stanowisko');
Form5.combobox1.Items.add(x);

po takim zapisie wyświetla mi się jeden rekord :( Jak to ugryźć żeby miał wszystkie rekordy W ComboBox z tej kolumny?

Pozostało 580 znaków

2009-03-03 15:45
0

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? :)

Pozostało 580 znaków

2009-03-03 20:43
0

Jeszcze dodam, że można zamiast tego obiektu, robić bezpośrednio:

AddObject(string, TObject(jakis_integer));

a potem

ID := Integer(lista.objects[i]);

Z innych ciekawostek, to np w Firebirdzie jest funkcja List, ktora zwaraca sklejone wiersze rozdzielone separatorem, i cale ladowanie mozna zastapic 1 linijka

Combobox1.Lines.CommaText := lista;

b

Pozostało 580 znaków

2009-03-03 20:46
0

Tak mi się przypomniało, a może skorzystaj z DBComboBox'a : )

b

Pozostało 580 znaków

2009-03-04 11:18
0
b0bik napisał(a)

Jeszcze dodam, że można zamiast tego obiektu, robić bezpośrednio:

AddObject(string, TObject(jakis_integer));

a potem

ID := Integer(lista.objects[i]);

Patrz, nawet nie wpadłem na to :P

Pozostało 580 znaków

2009-03-04 12:35
zxcv
0

A jak to zrobić z DBComboBox ? Atk tylko pytam na przyszłość :)

Pozostało 580 znaków

2009-03-04 14:18
0
zxcv napisał(a)

A jak to zrobić z DBComboBox ? Atk tylko pytam na przyszłość :)

Wpisz se w google i zobaczysz, bo to ma wszystko w sobie.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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