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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.12.2015, 03:53
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Программно, по-буквенно выбрать значение в DBLookupComboBox

Доброе время суток, форумчане.
У меня есть DBLookupComboBox, вручную – все прекрасно выбирается, запоминается – вопросов нет.
Над DBLookupComboBox стоит DBEdit (с которым он связан и которое отображает соответствующее поле), у которого заполнены «DataField» и «DataSource».
DBLookupComboBox у меня используется как справочник, т.е. в нем не заполнены поля «DataField» и «DataSource».
В режиме редактирования БД, в DBLookupComboBox можно с клавиатуры вводить начальные буквы, и нужное значение будет подкачано с списка DBLookupComboBox.
Т.к. DBEdit стоит над DBLookupComboBox, то я хочу, чтоб при вводе значения в DBEdit, DBLookupComboBox подкачивал подходящее значение.
Но оказалось, что если вводить значение по-буквенно в DBEdit, который передает его непосредственно DBLookupComboBox
Например:
DBLookupComboBox1.KeyValue := 'R’ – НЕ работает.
Работает только когда значение введешь целиком
DBLookupComboBox1.KeyValue := 'Rose’.

Я уже пробовал программно (из "OnChange" DBEdit) вызывать
Код:
procedure TFMain.DBLookupComboBox1KeyDown(Sender: TObject; var Key: Word;  Shift: TShiftState);
и
Код:
procedure TFMain. DBLookupComboBox1KeyPress(Sender: TObject;  var Key: Char);

не помогает.
Как быть?

Спасибо…

Последний раз редактировалось Konstantin-78, 05.12.2015 в 04:02.
Ответить с цитированием
  #2  
Старый 05.12.2015, 07:49
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Попробовал повторить, получилось сначало поиск похожего по источнику, затем присвоение найденного, если что нашлось
Код:
procedure DBEdit1Change(Sender: TObject);
begin
 DBLookupComboBox1.ListSource.DataSet.Locate(DBLookupComboBox1.KeyField, DBEdit1.Text,[loPartialKey]);
 DBLookupComboBox1.KeyValue:= DBLookupComboBox1.ListSource.DataSet.FieldByName(DBLookupComboBox1.KeyField).Value;
end;
...
 {Для проверки: DBEdit1.EditText:= 'R';}
...
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Konstantin-78 (05.12.2015)
  #3  
Старый 05.12.2015, 16:31
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

О, как раз то, что нужно.
Только, чтоб курсор в DBEdit, сразу после присвоения DBEdit значения из списка, не "уходил" в конец строки, а оставался на той позиции, на которой он стоял до вставки,
нужно:

var
Код:
  LPos: integer;
begin
  if (ibdsGovEtalon.State in [dsInsert, dsEdit]) then
  begin
    LPos := length(DBEdit1.Text);
    DBLookupComboBox1.ListSource.DataSet.Locate(DBLookupComboBox1.KeyField, DBEdit1.Text,[loPartialKey]);
    DBLookupComboBox1.KeyValue := DBLookupComboBox1.ListSource.DataSet.FieldByName(DBLookupComboBox1.KeyField).Value;
    if DBLookupComboBox1.KeyValue = DBEdit1.Text then
    begin
      DBEdit1.SetFocus;
      DBEdit1.SelStart := LPos;
      DBEdit1.SelLength := 0;
    end;
  end;

Последний раз редактировалось Konstantin-78, 05.12.2015 в 16:46.
Ответить с цитированием
  #4  
Старый 05.12.2015, 16:38
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Только не совсем понятно, почему при первом добавлении новой записи, в основную таблицу, в этом DBEdit остается значение предыдущей записи?

Я конечно его уберу:
Код:
procedure TFMain.ibDataSet1BeforeInsert(DataSet: TDataSet);
begin
  DBEdit.Clear;
end;

но всеравно , как-то не приятно

Последний раз редактировалось Konstantin-78, 05.12.2015 в 16:43.
Ответить с цитированием
  #5  
Старый 05.12.2015, 17:07
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Все равно немного не доконца Ваш код приведен.
Вот например, есть поле, откуда набирает список DBLookupComboBox.
В нем допустим есть строки:
фамилия1
фамлия2
фамля3

При добавлении новой строки в таблицу, при наборе первой буквы "ф", в DBEdit, появляется первая строка, т.е. "фамилия1",
а мне нужна третья строка, т.е. "фамля3".
Наверное при продолжении нажатия клавиш, все справой стороны после курсора нужно все удалять.
Чтоб в результате появилось сначала "фамлия2", а потом уже "фамля3"
Ответить с цитированием
  #6  
Старый 07.12.2015, 21:09
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

С такими запросными закидонами прямой путь к использованию квери с параметрами типа like, order by..desc или distinct...
Ответить с цитированием
  #7  
Старый 13.12.2015, 00:47
Konstantin-78 Konstantin-78 вне форума
Новичок
 
Регистрация: 27.04.2015
Сообщения: 76
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Не, ваш код все таки помог,
теперь, я могу и из списка выбирать или печатая (по-буквенно) или с помощью мышки, и если в списке нет, то заводить нового.

обработка "OnChange" DBEdit
Код:
procedure TFMain.DBEdit_OnChange(ADBEdit: TDBEdit; ADBComboBox: TDBLookupComboBoxEh; ADBDataSet: TIBDataSet);
//handling
var
  LPos: integer;
  LEvEdit: TNotifyEvent;
  LLastName, LSourceData: string;
begin
  LEvEdit := ADBEdit.OnChange;
  ADBEdit.OnChange := nil;

  if (ADBDataSet.State in [dsInsert, dsEdit]) then
  begin
    LLastName := ADBEdit.Text;
    Delete(LLastName, ADBEdit.SelStart+1, length(ADBEdit.Text));
    ADBEdit.Text := LLastName;

    LPos := length(ADBEdit.Text);

    if Pr_TypeEvent = 1 then
      LSourceData := ADBComboBox.Text
    else LSourceData := ADBEdit.Text;

    if ADBComboBox.ListSource.DataSet.Locate(ADBComboBox.KeyField, LSourceData, [loPartialKey]) then
    begin
      ADBComboBox.KeyValue := ADBComboBox.ListSource.DataSet.FieldByName(ADBComboBox.KeyField).value;
      ADBDataSet.FieldByName('KEEP_LAST_NAME').AsString := ADBComboBox.Text;
    end;
    ADBEdit.SelStart := LPos;
  end;
  ADBEdit.OnChange := LEvEdit;
  Pr_TypeEvent := 0;

  LEvEdit := dblcbehKeepLastName.OnChange;
  ADBComboBox.OnChange := nil;
  ADBComboBox.Clear;
  ADBComboBox.OnChange := LEvEdit;
end;

заполнение всех других полей из сотрудника, по выходу из поля "Фамилия"
Код:
procedure TFMain.EditLNP_OnExit(ADBEdit: TDBEdit; ADBDataSet: TIBDataSet);
var
  LEvEdit: TNotifyEvent;
begin
  LEvEdit := ADBEdit.OnChange;
  ADBEdit.OnChange := nil;
  if ADBDataSet.FieldByName('KEEP_LAST_NAME').AsString = ibdsPeople.FieldByName('LNP').AsString then
  begin
    ADBDataSet.FieldByName('KEEP_LAST_NAME').AsString := ibdsPeople.FieldByName('FAMILY_NAME').AsString;
    ADBDataSet.FieldByName('KEEP_NAME').AsString := ibdsPeople.FieldByName('NAME').AsString;
    ADBDataSet.FieldByName('KEEP_PATRONYMIC').AsString := ibdsPeople.FieldByName('PATRONYMIC_NAME').AsString;
    if ADBEdit = dbedKeepLastName then
    begin
      ADBDataSet.FieldByName('KEEP_DEGREE').AsString := ibdsPeople.FieldByName('DEGREE').AsString;
      ADBDataSet.FieldByName('KEEP_RANK').AsString := ibdsPeople.FieldByName('RANK').AsString;
      ADBDataSet.FieldByName('KEEP_POSITION').AsString := ibdsPeople.FieldByName('POSITION_PEOPLE').AsString;
    end
    else
    begin
      ADBDataSet.FieldByName('KEEP_TELEPHONE').AsString := ibdsPeople.FieldByName('TELEPHONE').AsString;
      ADBDataSet.FieldByName('KEEP_E_MAIL').AsString := ibdsPeople.FieldByName('E_MAIL').AsString;
    end;
  end;
  ADBEdit.OnChange := LEvEdit;
  Pr_PermitFullDBEdit := false;
end;

procedure TFMain.DBEditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_BACK)
    or (Key = VK_DELETE) then
  begin
    if Assigned(dbedLNP.OnChange) then
      Pr_LEvEdit := dbedLNP.OnChange;
    dbedLNP.OnChange := nil;
  end
  else
    if Assigned(Pr_LEvEdit) then
      dbedLNP.OnChange := Pr_LEvEdit;
end;

Последний раз редактировалось Konstantin-78, 13.12.2015 в 03:10.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter