Советы по Delphi

         

Синхронизация таблицы и StringList


Допустим что вы имеете TTable с именем Table1 и DBGrid с именем DBGrid1:

  1. В секции модуля interface объявите переменную:

FieldLst: TStringList ;

  • Установите свойство формы KeyPreview в TRUE
  • В обработчике события формы OnCreate добавьте:


  • FieldLst := TStringList.Create ;

  • В обработчике события формы OnDestroy добавьте:
  • FieldLst.Free ;

  • В обработчике события формы OnKeyUp добавьте:
  • if (ssCtrl in Shift) and (Key in [Ord('D'), Ord('d')]) thenif (FieldLst.Count > 0 ) thenbegin{Если вам необходимы все предыдущие данные полей}{for nFld := 0 to Table1.FieldCount - 1 doTable1.Fields[nFld].AsString := FieldLst.Strings[nFld] ;}
    {Если вы хотите только поле, с которым сейчас имеете дело }DBGrid1.Fields[DBGrid1.SelectedIndex].AsString := FieldLst.Strings[DBGrid1.SelectedIndex] ;end ;

  • Обработчик события таблицы BeforeInsert должен выглядеть следующим образом:
  • procedure TForm1.Table1BeforeInsert(DataSet: TDataset);
    var
    nFld: Integer ;bmPos: TBookMark ;begin
    if
    (not Table1.BOF) and (Assigned( FieldLst )) thentrybmPos := Table1.GetBookMark ;Table1.DisableControls ;Table1.Prior ;FieldLst.Clear ;for nFld := 0 to Table1.FieldCount - 1 doFieldLst.Add( Table1.Fields[nFld].AsString ) ;Table1.GotoBookMark( bmPos ) ;Table1.FreeBookMark( bmPos ) ;Table1.EnableControls ;excepton E: EOutOfMemory do ShowMessage( E.Message ) ;end ;end;

    Надеюсь, что это будет работать. {Обратите внимание, что при обработке события OnKeyUp вы можете воспользоваться закомментаренными строками, которые позволят вам с помощью комбинации клавиш Ctrl-D получить все предыдущие данные полей. Если вы уберете этот комментарий, то не забудьте прокомментировать строку с DBGrid1....}

    OAmiry/Borland [000366]



    Содержание раздела