Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 08.08.2019, 22:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,473
Версия Delphi: 7, XE3, 10.2
Репутация: 49088
По умолчанию

А связь - за многоточием.
Или ты ожидал, что я буду повторять уже приведенный ранее код???
Ответить с цитированием
  #17  
Старый 08.08.2019, 23:01
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А связь - за многоточием.
Или ты ожидал, что я буду повторять уже приведенный ранее код???
Как раз как связать и не понятно. Как связать id записи в таблице со строкой в комбобокс?
Ответить с цитированием
  #18  
Старый 09.08.2019, 13:15
DenSarych DenSarych вне форума
Прохожий
 
Регистрация: 02.08.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Как раз как связать и не понятно. Как связать id записи в таблице со строкой в комбобокс?
У ComboBox есть свойство Items:TStrings. Кроме текстовых строк, в него можно добавлять значения (ComboBox1.Items.AddObject()), а потом их извлекать (ComboBox1.Items.Objects[]). А кроме того, можно использовать DbComboBox и DbLookupComboBox.
Цитата:
Как сделать чтобы при удалении записи из таблицы удалилась строка в комбобоксе? Т. е изначально при вводе в комбокс текст попадает в таблицу.
Вообще, использование базы данных, предполагает то, что данные будут храниться именно в этой БД, а не на стороне программы её использующей. Зачем? Да просто так удобнее с ними работать. Данные находятся в одном месте. Данные, с помощью "ссылочной целостности" всегда находятся в согласованном состоянии (соответствие ключей, взаимосвязанное удаление и т.д.). А если мы редактируем такие данные из разных мест, то нам не приходится вручную синхронизировать процедуры редактирования и изменения 'этих данных.

Вся эта методика работы с БД описана, простым и доступным языком на первых 50 страницах книги Фаронова и Шумакова ( Фаронов В.В. Delphi 5. Руководство разработчика баз данных).
Ответить с цитированием
  #19  
Старый 10.08.2019, 23:33
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от DenSarych
У ComboBox есть свойство Items:TStrings. Кроме текстовых строк, в него можно добавлять значения (ComboBox1.Items.AddObject()), а потом их извлекать (ComboBox1.Items.Objects[]). А кроме того, можно использовать DbComboBox и DbLookupComboBox.
Вообще, использование базы данных, предполагает то, что данные будут храниться именно в этой БД, а не на стороне программы её использующей. Зачем? Да просто так удобнее с ними работать. Данные находятся в одном месте. Данные, с помощью "ссылочной целостности" всегда находятся в согласованном состоянии (соответствие ключей, взаимосвязанное удаление и т.д.). А если мы редактируем такие данные из разных мест, то нам не приходится вручную синхронизировать процедуры редактирования и изменения 'этих данных.

Вся эта методика работы с БД описана, простым и доступным языком на первых 50 страницах книги Фаронова и Шумакова ( Фаронов В.В. Delphi 5. Руководство разработчика баз данных).
Каких значений? Что даст добавление значений?
Код:
(ComboBox1.Items.AddObject())
Ответить с цитированием
  #20  
Старый 10.08.2019, 23:57
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Это то, что ты удаляешь. Т.е. имя, я просто сделал переменную для простоты. Если ты удаляешь выбранный в ComboBox проект, то тогда код будет примерно таким:
Код:
var
  Idx : Integer;
begin
  DeletedProjectName := ComboBox1.Text;
  ...
  Idx := ComboBox1.Items.IndexOf(DeletedProjectName);
  If Idx > -1 Then 
    Begin
      ComboBox1.Items.Delete(Idx);
      ComboBox1.Text := '';
    End;
end;
Если удаляется не выбранный в ComboBox проект, а выбранная запись в DBrid?
Ответить с цитированием
  #21  
Старый 11.08.2019, 12:33
Аватар для Guaho
Guaho Guaho вне форума
Новичок
 
Регистрация: 27.08.2017
Сообщения: 94
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Не ComboBox надо использовать, а DBComboBox. Или DBLookupComboBox, если данные надо получать из другой таблицы. Тогда не нужны будут манипуляции с Combobox.Items.
Ответить с цитированием
  #22  
Старый 11.08.2019, 12:42
DenSarych DenSarych вне форума
Прохожий
 
Регистрация: 02.08.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Каких значений? Что даст добавление значений?
В вашем случае, скорее всего, ничего не даст. Вы спрашиваете "как сделать", но, не описываете ни "зачем это нужно", ни "общей задумки", ни "общего подхода". А поскольку вы стоите программу на основе "советов из интернета" (каждый из которых по-своему правильный, но в общем-то несовместим с любым другим), то в результате и получите "лоскутное одеяло", набор кусков кода, а не цельную, работоспособную программу.

Вы опишите "что вы хотите получить в конечном итоге". Может - "форму ввода значений", или "пару форм раздельного отображения и редактирования данных", или "небольшую программку учёта, работающую с БД"?

Цитата:
Каких значений?
Как раз как связать и не понятно. Как связать id записи в таблице со строкой в комбобокс?
Добавление значений (id, Name), т.е. "id записи в таблице и строки" в ComboBox:
Код:
procedure TfvMain.btnAddClick(Sender: TObject);
  var i, n :integer;
begin
    //заполним ComboBox значениями
  ComboBox1.Items.Clear;
  with Query1 do
  begin
    Open;
    for i := 1 to RecordCount do
    begin
      ComboBox1.Items.AddObject(
        FieldByName('Name').AsString,
        TObject(FieldByName('Id').AsInteger)
        );
      Next;
      end;
    Close;
    ComboBox1.Text := '';
    end;
end;
Изменение значений в ComboBox:
Код:
procedure TfvMain.btnDelClick(Sender: TObject);
  procedure ComboBox1_DelId ( cId :integer);
    var i :integer;
  begin
    with ComboBox1.Items do
    for i := 0 to Count -1 do
      if Integer(Objects[i]) = cId
        then begin
          Delete(i);
          Break;
          end;
  end;
begin
  //Изменим значения ComboBox
  // 1 вариант (рекомендуемый):
    // Очистить ComboBox1.Items: ComboBox1.Items.Clear;
    // Загрузить все данные из Query
  // 2 вариант (удаление единственного значения по id):
  ComboBox1_DelId(StrToInt(edValueId.Text));
end;
Получение значений id из ComboBox:
Код:
procedure TfvMain.ComboBox1Change(Sender: TObject);
begin
    //Посмотрим, какие значения Name и Id находятся в ComboBox1
  with (Sender as TComboBox) do
  begin
    ShowMessage('Name = '+Items.Strings[ItemIndex] +', Id = ' +
      IntToStr(Integer(Items.Objects[ItemIndex])))
    end;
end;
Ответить с цитированием
  #23  
Старый 11.08.2019, 23:54
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Guaho
Не ComboBox надо использовать, а DBComboBox. Или DBLookupComboBox, если данные надо получать из другой таблицы. Тогда не нужны будут манипуляции с Combobox.Items.
ComboBox используется для ввода и отображения записей в таблице.
С помощью DBComboBox или DBLookupComboBox можно вводить ?Нет
Ответить с цитированием
  #24  
Старый 11.08.2019, 23:59
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от DenSarych
В вашем случае, скорее всего, ничего не даст. Вы спрашиваете "как сделать", но, не описываете ни "зачем это нужно", ни "общей задумки", ни "общего подхода". А поскольку вы стоите программу на основе "советов из интернета" (каждый из которых по-своему правильный, но в общем-то несовместим с любым другим), то в результате и получите "лоскутное одеяло", набор кусков кода, а не цельную, работоспособную программу.

Вы опишите "что вы хотите получить в конечном итоге". Может - "форму ввода значений", или "пару форм раздельного отображения и редактирования данных", или "небольшую программку учёта, работающую с БД"?
Да небольшая программка, где происходит расчет по определенному алгоритму с вводом исходных данных, получением результатов и их хранением в таблицах базы.
Ответить с цитированием
  #25  
Старый 12.08.2019, 00:31
Maks19 Maks19 вне форума
Новичок
 
Регистрация: 19.06.2019
Сообщения: 81
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от DenSarych
В вашем случае, скорее всего, ничего не даст. Вы спрашиваете "как сделать", но, не описываете ни "зачем это нужно", ни "общей задумки", ни "общего подхода". А поскольку вы стоите программу на основе "советов из интернета" (каждый из которых по-своему правильный, но в общем-то несовместим с любым другим), то в результате и получите "лоскутное одеяло", набор кусков кода, а не цельную, работоспособную программу.

Вы опишите "что вы хотите получить в конечном итоге". Может - "форму ввода значений", или "пару форм раздельного отображения и редактирования данных", или "небольшую программку учёта, работающую с БД"?


Добавление значений (id, Name), т.е. "id записи в таблице и строки" в ComboBox:
Код:
procedure TfvMain.btnAddClick(Sender: TObject);
  var i, n :integer;
begin
    //заполним ComboBox значениями
  ComboBox1.Items.Clear;
  with Query1 do
  begin
    Open;
    for i := 1 to RecordCount do
    begin
      ComboBox1.Items.AddObject(
        FieldByName('Name').AsString,
        TObject(FieldByName('Id').AsInteger)
        );
      Next;
      end;
    Close;
    ComboBox1.Text := '';
    end;
end;
Изменение значений в ComboBox:
Код:
procedure TfvMain.btnDelClick(Sender: TObject);
  procedure ComboBox1_DelId ( cId :integer);
    var i :integer;
  begin
    with ComboBox1.Items do
    for i := 0 to Count -1 do
      if Integer(Objects[i]) = cId
        then begin
          Delete(i);
          Break;
          end;
  end;
begin
  //Изменим значения ComboBox
  // 1 вариант (рекомендуемый):
    // Очистить ComboBox1.Items: ComboBox1.Items.Clear;
    // Загрузить все данные из Query
  // 2 вариант (удаление единственного значения по id):
  ComboBox1_DelId(StrToInt(edValueId.Text));
end;
Получение значений id из ComboBox:
Код:
procedure TfvMain.ComboBox1Change(Sender: TObject);
begin
    //Посмотрим, какие значения Name и Id находятся в ComboBox1
  with (Sender as TComboBox) do
  begin
    ShowMessage('Name = '+Items.Strings[ItemIndex] +', Id = ' +
      IntToStr(Integer(Items.Objects[ItemIndex])))
    end;
end;
Алгоритм подразумевался такой сначала вводится текстовое имя проекта через комбобокс и вводятся исходные данные, далее происходит расчет получаются результирующие данные. Таким образом одному проекту соответствуют исходные данные и результат. Проекты хранятся в таблице с двумя полями id и имя проектов. И если надо удалить проект из таблицы то по кнопке запись удаляется из дбгрида (дбгрид для контроля сколько проектов в таблице), а вместе с ним должна удалиться и его отображение в комбобокс.
по коду
Код:
var
  Idx : Integer;
begin
  DeletedProjectName := ComboBox1.Text;
  ...
  Idx := ComboBox1.Items.IndexOf(DeletedProjectName);
  If Idx > -1 Then
    Begin
      ComboBox1.Items.Delete(Idx);
      ComboBox1.Text := '';
    End;
end;
удаляется запись из комбобокс (и запись в дбгриде т.к по нажатию на кнопку и выбранной записи в комбокс становиться соответствующая текущая запись в дб гриде). Но как удалить из комбобокс имя проекта, просто выбрав проект в дбгриде?
Т.к если в первом случае если выбрав в комбобоксе нужный проект в дбгриде становилось текущая нужная запись, то при выборе в ручную в дбгриде в комбоксе удаляется уже запись которая не соответствует выбранной в дбгриде.

Последний раз редактировалось Maks19, 12.08.2019 в 00:34.
Ответить с цитированием
  #26  
Старый 12.08.2019, 00:32
Аватар для Guaho
Guaho Guaho вне форума
Новичок
 
Регистрация: 27.08.2017
Сообщения: 94
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Maks19
ComboBox используется для ввода и отображения записей в таблице. С помощью DBComboBox или DBLookupComboBox можно вводить ?Нет
Точнее, не записей, а содержимого полей этих записей. Что касается ввода - разумеется, любое изменение содержимого DBComboBox-а (или DBLookupComboBox) автоматически приведёт к изменению содержимого того поля БД, к которому этот контрол подключен.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter