Синхронизация таблицы и StringList
Автор: OAmiry (Borland)
Допустим что вы имеете TTable с именем Table1 и DBGrid с именем DBGrid1:
- В секции модуля interface объявите переменную:
- Установите свойство формы KeyPreview в TRUE
- В обработчике события формы OnCreate добавьте:
- В обработчике события формы OnDestroy добавьте:
- В обработчике события формы OnKeyUp добавьте:
- Обработчик события таблицы BeforeInsert должен выглядеть следующим образом:
FieldLst: TStringList; |
FieldLst := TStringList.Create; |
FieldLst.Free; |
if (ssCtrl in Shift) and (Key in [Ord('D'), Ord('d')]) then if (FieldLst.Count > 0 ) then begin {Если вам необходимы все предыдущие данные полей} {for nFld := 0 to Table1.FieldCount - 1 do Table1.Fields[nFld].AsString := FieldLst.Strings[nFld] ;} {Если вы хотите только поле, с которым сейчас имеете дело } DBGrid1.Fields[DBGrid1.SelectedIndex].AsString := FieldLst.Strings[DBGrid1.SelectedIndex]; end ; |
procedure TForm1.Table1BeforeInsert(DataSet: TDataset); var nFld: Integer ; bmPos: TBookMark ; begin if (not Table1.BOF) and (Assigned( FieldLst )) then try bmPos := Table1.GetBookMark ; Table1.DisableControls ; Table1.Prior ; FieldLst.Clear ; for nFld := 0 to Table1.FieldCount - 1 do FieldLst.Add( Table1.Fields[nFld].AsString ) ; Table1.GotoBookMark( bmPos ) ; Table1.FreeBookMark( bmPos ) ; Table1.EnableControls ; except on E: EOutOfMemory do ShowMessage( E.Message ) ; end ; end; |
Надеюсь, что это будет работать. {Обратите внимание, что при обработке события OnKeyUp вы можете воспользоваться закомментаренными строками, которые позволят вам с помощью комбинации клавиш Ctrl-D получить все предыдущие данные полей. Если вы уберете этот комментарий, то не забудьте прокомментировать строку с DBGrid1....}
Далее: Создание компонента TTable без формы »»