![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброе время суток, форумчане.
У меня есть 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
|
||||
|
||||
|
Попробовал повторить, получилось сначало поиск похожего по источнику, затем присвоение найденного, если что нашлось
Код:
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
|
|||
|
|||
|
О, как раз то, что нужно.
Только, чтоб курсор в 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
|
|||
|
|||
|
Только не совсем понятно, почему при первом добавлении новой записи, в основную таблицу, в этом DBEdit остается значение предыдущей записи?
![]() Я конечно его уберу: Код:
procedure TFMain.ibDataSet1BeforeInsert(DataSet: TDataSet); begin DBEdit.Clear; end; но всеравно , как-то не приятно Последний раз редактировалось Konstantin-78, 05.12.2015 в 16:43. |
|
#5
|
|||
|
|||
|
Все равно немного не доконца Ваш код приведен.
Вот например, есть поле, откуда набирает список DBLookupComboBox. В нем допустим есть строки: фамилия1 фамлия2 фамля3 При добавлении новой строки в таблицу, при наборе первой буквы "ф", в DBEdit, появляется первая строка, т.е. "фамилия1", а мне нужна третья строка, т.е. "фамля3". Наверное при продолжении нажатия клавиш, все справой стороны после курсора нужно все удалять. Чтоб в результате появилось сначала "фамлия2", а потом уже "фамля3" |
|
#6
|
||||
|
||||
|
С такими запросными закидонами
прямой путь к использованию квери с параметрами типа like, order by..desc или distinct... |
|
#7
|
|||
|
|||
|
Не, ваш код все таки помог,
теперь, я могу и из списка выбирать или печатая (по-буквенно) или с помощью мышки, и если в списке нет, то заводить нового. обработка "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. |