Показать сообщение отдельно
  #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;
Ответить с цитированием