Идёт загрузка страницы...

htp://aptem.net.ru





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

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

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


       
    FieldLst: TStringList ;

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


       
    FieldLst := TStringList.Create ;

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


       
    FieldLst.Free ;

  5. В обработчике события формы OnKeyUp добавьте:


       
    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 ;

  6. Обработчик события таблицы BeforeInsert должен выглядеть следующим образом:


        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....}

    OAmiry/Borland [000366]