maxfad
-
Постов
9 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные maxfad
-
-
Способ рабочий. Часто применимый.
Вы не назначаете значение Tag, поэтому и считываете 0. Картинку с кодом и результатом прикладываю
Очень интересное решение, сейчас попробую..)))
Ну что тут сказать...Очень красиво. Все работает, поражает простота исполнения. Я об этом методе не знал. Спасибо большое!!!!
-
Способ рабочий. Часто применимый.
Вы не назначаете значение Tag, поэтому и считываете 0. Картинку с кодом и результатом прикладываю
Очень интересное решение, сейчас попробую..)))
-
Чем может быть заполнен Item.Tag при заполнении ListBox1 не представляю. Поле kateg с ListBox1 не связано.
Item.Tag := DataSet.FieldByName('kateg').Value;
DataSet в проекте не использовал....Для связи SQLite через FireDAC использую FDConnection, FDQuery, FDPhysSQLiteDriverLink. Вы предлагаете добавить компонент DataSet? Или это свойство? Простите,я с БД пока на "ВЫ"...
-
Проблема в том, что этот вариант в моем случае не работает. i := Item.Tag при нажатии возвращает 0, а во второй форме ListBox становится пустой.
ну так вы просто Item.Tag не заполняете при выводе первого listbox.
если у вас будет 2 и более одинаковых наименования, то ваш код работать не будет!
ListBox1 на первой форме заполняется из таблицы с тремя полями(ID,NAM1,kateg), поле NAM1 попадает в ListBox и значения там уникальные. Чем может быть заполнен Item.Tag при заполнении ListBox1 не представляю. Поле kateg с ListBox1 не связано. Я двумя руками за то чтоб этот код упростить, но красивый код не всегда работающий код...Подскажите как можно использовать конструкций i:=Item.Tag в TForm1.FormCreate.
-
Ну вот не удержался, извините.
Если бы Вы воспользовались советом zairkz, вам бы дополнительный seleсt не потребовался. Сразу же, при заполнение списка в ListBox сохраните kateg в поле Item(i).Tag
Тогда вся обработка в ListBox1ItemClick будет:
procedure TForm1.ListBox1ItemClick(const Sender: TCustomListBox; const Item: TListBoxItem); var //s:string; i:integer; begin { убираем s:=ListBox1.Items[ListBox1.ItemIndex]; //тут находил значение ListBox1 в переменную FDQuery2.Close; FDQuery2.SQL.Clear; FDQuery2.SQL.Add('select kateg from kategorii WHERE NAM1="'+s+'"'); // тут ее использовал FDQuery2.OpenOrExecute; i:=FDQuery2.FieldByName('kateg').AsInteger;// тут получал номер категории из того поля которое явно в ListBox не попадает } i := Item.Tag; // или вообще без этой переменной Form2.Show; Form2.FDQuery2.Close; Form2.FDQuery2.SQL.Clear; Form2.FDQuery2.SQL.Add('select razdel.NAM2 from razdel WHERE razdel.kateg2='+IntToStr(i));// далее в Form2 в ListBox выводил раздел относящийся к категории из первой формы Form2.FDQuery2.OpenOrExecute; end;
Красивый код постепенно из мелочей складывается
Проблема в том, что этот вариант в моем случае не работает. i := Item.Tag при нажатии возвращает 0, а во второй форме ListBox становится пустой. прикладываю скрин с откомпелированной программой под win-32. Среда DELPHI XE7. На Form1 положил Label1 чтоб видеть значение i...оно равно 0. Спасибо за внимание к моему проекту, но этот метод или не полный или не подходящий.
А вот как оно в моем варианте:
-
Ну вот не удержался, извините.
Если бы Вы воспользовались советом zairkz, вам бы дополнительный seleсt не потребовался. Сразу же, при заполнение списка в ListBox сохраните kateg в поле Item(i).Tag
Тогда вся обработка в ListBox1ItemClick будет:
procedure TForm1.ListBox1ItemClick(const Sender: TCustomListBox; const Item: TListBoxItem); var //s:string; i:integer; begin { убираем s:=ListBox1.Items[ListBox1.ItemIndex]; //тут находил значение ListBox1 в переменную FDQuery2.Close; FDQuery2.SQL.Clear; FDQuery2.SQL.Add('select kateg from kategorii WHERE NAM1="'+s+'"'); // тут ее использовал FDQuery2.OpenOrExecute; i:=FDQuery2.FieldByName('kateg').AsInteger;// тут получал номер категории из того поля которое явно в ListBox не попадает } i := Item.Tag; // или вообще без этой переменной Form2.Show; Form2.FDQuery2.Close; Form2.FDQuery2.SQL.Clear; Form2.FDQuery2.SQL.Add('select razdel.NAM2 from razdel WHERE razdel.kateg2='+IntToStr(i));// далее в Form2 в ListBox выводил раздел относящийся к категории из первой формы Form2.FDQuery2.OpenOrExecute; end;
Красивый код постепенно из мелочей складывается
Проблема в том, что этот вариант в моем случае не работает. i := Item.Tag при нажатии возвращает 0, а во второй форме ListBox становится пустой. прикладываю скрин с откомпелированной программой под win-32. Среда DELPHI XE7. На Form1 положил Label1 чтоб видеть значение i...оно равно 0. Спасибо за внимание к моему проекту, но этот метод или не полный или не подходящий.
-
Вопрос решил прибегнув к помощи еще одного FDQuery и ListBox1ItemClick обработал по иному
procedure TForm1.ListBox1ItemClick(const Sender: TCustomListBox;const Item: TListBoxItem);vars:string;i:integer;begins:=ListBox1.Items[ListBox1.ItemIndex]; //тут находил значение ListBox1 в переменнуюFDQuery2.Close;FDQuery2.SQL.Clear;FDQuery2.SQL.Add('select kateg from kategorii WHERE NAM1="'+s+'"'); // тут ее использовалFDQuery2.OpenOrExecute;i:=FDQuery2.FieldByName('kateg').AsInteger;// тут получал номер категории из того поля которое явно в ListBox не попадаетForm2.Show;Form2.FDQuery2.Close;Form2.FDQuery2.SQL.Clear;Form2.FDQuery2.SQL.Add('select razdel.NAM2 from razdel WHERE razdel.kateg2='+IntToStr(i));// далее в Form2 в ListBox выводил раздел относящийся к категории из первой формыForm2.FDQuery2.OpenOrExecute;end;Zairkz, вариант с ListView посмотрю.Прикреплю исходник того что получилось, база в архиве, все работает. Спасибо за советы, попытаюсь применить на практике. В принципе вопрос решен. -
Существует база данных SQLite из двух таблиц: категории(kategorii) и разделы(razdel). В категориях три поля: ID.NAM1,kateg(Nam1 уникальные значения), разделы : ID.NAM2,KATEG2(категории одинаковы для одной группы разделов).
Подключение SQLite через FDConnection1 и FDQuery1. Тут нормально.
На Form1 лежит ListBox1 в него из таблицы kategorii добавлены данные NAM1 стандартным методом .
procedure TForm1.FormCreate(Sender: TObject); begin try ListBox1.Items.Clear; FDQuery1.Close; FDQuery1.SQL.Clear; FDQuery1.SQL.Add('select * from kategorii'); FDQuery1.OpenOrExecute; while not FDQuery1.Eof do begin ListBox1.Items.Add(FDQuery1.FieldByName('nam1').AsString); FDQuery1.Next; end; except on e: exception do Showmessage(e.ClassName + ': ' + e.Message); end; end;
В ListBox-e для примера Овощи, Фрукты, Страна, Звери....
Поле kateg имеет значения 1,2,3,4 соответственно. Вторая таблица для каждой категории из первой таб. имеет разделы : лук, чеснок,помидор, хрен...Поле KATEG2 для этих элементов равно 1.
Для фруктов то же четыре наименования и KATEG2=2. Остальное по такому же принципу.
Есть вторая форма: на ней тоже ListBox, Button-с процедурой Form2.Hide и FDQuery2;
Необходимо: при процедуре TForm1.ListBox1ItemClick открывалась Form2 и в ListBox2 загружались данные относящиеся только к одной категории.
С формой проблем нет:
Form2.Show;Form2.FDQuery2.Close; Form2.FDQuery2.SQL.Clear; Form2.FDQuery2.SQL.Add('select razdel.NAM2 from razdel WHERE razdel.kateg2='+???????? Form2.FDQuery2.OpenOrExecute;
Вопрос: как получить значение поля kateg первой таблицы что бы во втором ListBox были данные относящиеся к нажатому в первом листбоксе пункта....
Делал все то же самое но вместо ListBox1 в Form1 использовал Grid1. В нем через переменную
i:=FDQuery1.FieldByName('kateg').AsInteger ; ....... Form2.FDQuery2.SQL.Add('select razdel.NAM2 from razdel WHERE razdel.kateg2='+IntToStr(i));
получал нужный результат и все работает, на телефоне выглядит нормально. Но меня этот вариант не устраивает. Нужно использовать ListBox на первой форме.Помогите!
Связь ListBox и SQLite. (Подобие справочника)
в Доступ к итемам
Опубликовано
Та да...Действительно проглядел)))) Что как отмечается, по не опытности понял по своему)))))Спасибо!!!