문제

표준 dbnavigator bar의 삽입 버튼의 동작을 데이터 세트 인서트에서 추가로 변경하고 싶습니다.

Beforeacction 이벤트에서 버튼 클릭을 가두거나 추가 할 수 있습니다. 그런 다음 OnClick 이벤트에서 원래 인서트가 중단되지만 이것은 약간의 해킹처럼 보입니다. 더 나은 아이디어가 있습니까? 나는 D6 (시계에 500,000kms, 여전히 강해지고 있습니다 ...)을 사용하고 있습니다.

조언에 감사드립니다

문안 인사,

Philw.

도움이 되었습니까?

해결책

tdbnavigator에서 자신의 클래스를 도출하고 btnclick 메소드를 무시할 수 있습니다. 또는 빠르고 더러운 수정을 위해 런타임에서 삽입 버튼의 클릭 핸들러를 변경할 수 있습니다.

type
  THackDBNavigator = class(TDBNavigator);

procedure TForm1.DBNavigatorInsertClick(Sender: TObject);
var
  DBNavigator: TDBNavigator;
begin
  DBNavigator := ((Sender as TControl).Parent as TDBNavigator);
  if Assigned(DBNavigator.DataSource) and (DBNavigator.DataSource.State <> dsInactive) then
  begin
    if Assigned(DBNavigator.BeforeAction) then
      DBNavigator.BeforeAction(DBNavigator, nbInsert);

    DBNavigator.DataSource.DataSet.Append;

    if Assigned(DBNavigator.OnClick) then
      DBNavigator.OnClick(DBNavigator, nbInsert);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  THackDBNavigator(DBNavigator1).Buttons[nbInsert].OnClick := DBNavigatorInsertClick;
end;

다른 팁

삽입과 부록 사이에는 대부분의 데이터베이스에는 차이가 없습니다. 실제 물리적 삽입을 수행한다는 것은 실제로 모든 데이터를 이동하여 새 행을 삽입하고 한 행 크기의 크기를 낮추고 새로 열린 지점에 새 행을 작성하는 것을 의미합니다. 이것은 모든 디스크 활동으로 인해 매우 느립니다.

데이터베이스는 대신에 데이터를 물리적 파일의 끝에 기록하는 Append를 수행하고 인덱스 순서는 행이 파일의 올바른 위치에 위치하는 방식을 제어합니다.

따라서 대부분의 의도와 목적을 위해 사용하는 방법이나 DBNAVigator의 버튼에 관계없이 이미 삽입 대신에 추가를 받고있을 것입니다. 다른 것처럼 보이게하는 색인입니다.

인덱스없이 데이터베이스를 작성하여 유효성을 확인하고 모든 작업 후에 데이터를주의 깊게 검사하여 삽입물과 추가 기능을 몇 번 시도해 볼 수 있습니다.

@tondrej : 좋아요! 나는이 기술에 감사하지 않았다. 감사!

@Ken White : 귀하의 요점을 이해하지만 시각적으로 사용자에게는 차이를 만듭니다. DBNAVigator는 대부분의 경우 그리드에 사용되지 않은 행이 많이있는 DBGRID를 제어합니다. 현재 레코드가 그 순간에있는 곳보다는 그리드의 맨 아래에 새로운 레코드가 나타나는 것이 더 일관된 것으로 보입니다. 하지만 답변 해 주셔서 감사합니다.

안부, Philw.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top