Listar os dados de um campo de uma tabela em um TComboBox

28/10/2023

0

Meus Prezados,
Tenho duas tabelas a seguir:
CREATE TABLE Editora (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
Nome TEXT (60) NOT NULL
);
e a outra

CREATE TABLE Livro (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
ID_Editora INTEGER REFERENCES Editora (ID) ON DELETE CASCADE
ON UPDATE CASCADE,
NomeHQ TEXT (80) NOT NULL,
Numero INTEGER,
Titulo TEXT (80),
Volume INTEGER
);

Preciso mostrar em um TComboBox o campo Nome da Tabela Editora no formulário
de cadastro de Livros(FrmCadastroLivros). Alguém pode me ajudar?
Usei o exemplo abaixo da internet mas esta dando erro no params (pNome).
Segue abaixo :

procedure TfrmCadastroLivro.FormActivate(Sender: TObject);
begin
inherited;
DmEditora.cdsEditora.Open;
DmEditora.cdsEditora.First;
while not DmEditora.cdsEditora.eof do
begin
ComboBox1.Items.Add(DmEditora.cdsEditoraNome.Value);
DmEditora.cdsEditora.Next;
end;
e no evento onChange do ComboBox:

procedure TfrmCadastroHQ.ComboBox1Change(Sender: TObject);
begin
inherited;
with DmEditora.sqlEditora do
begin
Close;
sql.Clear;
sql.Add('Select *From Editora where Nome = pNome');
ParamByName('PNome').AsString := ComboBox1.Text;
Open;
end;
end;
Alguém pode me ajudar? Agradeço desde já.







end;
Mauricio Bomfim

Mauricio Bomfim

Responder

Posts

29/10/2023

Alan

Meus Prezados,
Tenho duas tabelas a seguir:
CREATE TABLE Editora (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
Nome TEXT (60) NOT NULL
);
e a outra

CREATE TABLE Livro (
ID INTEGER PRIMARY KEY AUTOINCREMENT
NOT NULL,
ID_Editora INTEGER REFERENCES Editora (ID) ON DELETE CASCADE
ON UPDATE CASCADE,
NomeHQ TEXT (80) NOT NULL,
Numero INTEGER,
Titulo TEXT (80),
Volume INTEGER
);

Preciso mostrar em um TComboBox o campo Nome da Tabela Editora no formulário
de cadastro de Livros(FrmCadastroLivros). Alguém pode me ajudar?
Usei o exemplo abaixo da internet mas esta dando erro no params (pNome).
Segue abaixo :

procedure TfrmCadastroLivro.FormActivate(Sender: TObject);
begin
inherited;
DmEditora.cdsEditora.Open;
DmEditora.cdsEditora.First;
while not DmEditora.cdsEditora.eof do
begin
ComboBox1.Items.Add(DmEditora.cdsEditoraNome.Value);
DmEditora.cdsEditora.Next;
end;
e no evento onChange do ComboBox:

procedure TfrmCadastroHQ.ComboBox1Change(Sender: TObject);
begin
inherited;
with DmEditora.sqlEditora do
begin
Close;
sql.Clear;
sql.Add('Select *From Editora where Nome = pNome');
ParamByName('PNome').AsString := ComboBox1.Text;
Open;
end;
end;
Alguém pode me ajudar? Agradeço desde já.







end;
with DmEditora.sqlEditora do
begin
Close;
sql.Clear;
sql.Add('Select *From Editora where Nome = :pNome');
ParamByName('PNome').AsString := ComboBox1.Text;
Open;
end;
end;

Quando você passa um parâmetro,precisa dos dois pontos,tente conforme te mandei .
Responder

30/10/2023

Arthur Heinrich

A maioria dos componentes que possuem listas, como no caso do ComboBox, possui internamente um TStringList ou uma variação deste.

Este componente contém, internamente, dois arrays, sendo um para armazenar o texto e outro para armazenar um object. Dá para fazer uma gambiarra e armazenar o "id" da editora, que é um inteiro, na propriedade do objeto. Assim, ao selecionar um item no combobox, você teria acesso ao "id" também.

while not DmEditora.cdsEditora.eof do
  begin
    ComboBox1.Items.AddObject(DmEditora.cdsEditora.FieldByName('nome').AsString, TObject(DmEditora.cdsEditora.FieldByName('id').AsInteger));
    DmEditora.cdsEditora.Next;
  end;


A rotina acima precisa armazenar um TObject (uma referência/pointer para a instância). Ao invés disso, estamos utilizando um cast para interpretar o "id" inteiro como um TObject, permitindo assim que o "ID" seja armazenado no array de objetos.

Para acessar um "ID", você utilizaria:

ID := Integer(ComboBox1.Objects[ComboBox1.ItemIndex]);


Aqui, novamente, acessamos um TObject que se supõe ser um ponteiro para uma instância do objeto, o que não é verdade. Então, fazemos um cast para transformar a referência ao objeto em um inteiro, que representa o "ID" da editora.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar