Q&A

  • 2개의 DBGrid의 동기화
안녕하세요.

델파이를 독학하고 있는 초보자입니다.



2개의 DBGrid의 동기화 하는데 문제가 생겨 고수님들의

도움을 청합니다.



DBGrid1 -> DataSource1 -> Table1

DBGrid2 -> DataSource2 -> Table2



Table1과 Table2는 Record길이나 Field구성이 같고

Field 값만 조금다른데,

DBGrid1 과 DBGrid2 의 Scroll되는 상태를 동기화 시키기 위해



DataSourceDataChange Event 에 다음과 같이 코딩했는데

문제점이 생겼습니다.



Table2.RecNo := Table1.RecNo;



DBGrid1의 Record이동시 처음에는 DBGrid2도 동기화되어 동시에

동일 RecordNo, 동일 Scroll Position을 유지하지만

DBGrid1 이 화면의 중간쯤을 지나면 DBGrid1은 Scroll 이 안되고

Record만 이동하는데 DBGrid2는 Scroll 이 됩니다.

즉 DBGrid2가 화면의 맨 마지막에서 Scroll이 안되고 중간에서

Scroll이 되어 버립니다.



DBGrid1과 DBGrid2가 동일 Record의 내용을 보여주어야 하는데

애를 먹고 있습니다.



고수님들의 고언 부탁드립니다.



좋은 하루되세요....

3  COMMENTS
  • Profile
    홍성락 2001.08.29 07:44
    산돈 wrote:

    > 안녕하세요.

    > 델파이를 독학하고 있는 초보자입니다.

    >

    > 2개의 DBGrid의 동기화 하는데 문제가 생겨 고수님들의

    > 도움을 청합니다.

    >

    > DBGrid1 -> DataSource1 -> Table1

    > DBGrid2 -> DataSource2 -> Table2

    >

    > Table1과 Table2는 Record길이나 Field구성이 같고

    > Field 값만 조금다른데,

    > DBGrid1 과 DBGrid2 의 Scroll되는 상태를 동기화 시키기 위해

    >

    > DataSourceDataChange Event 에 다음과 같이 코딩했는데

    > 문제점이 생겼습니다.

    >

    > Table2.RecNo := Table1.RecNo;

    >

    > DBGrid1의 Record이동시 처음에는 DBGrid2도 동기화되어 동시에

    > 동일 RecordNo, 동일 Scroll Position을 유지하지만

    > DBGrid1 이 화면의 중간쯤을 지나면 DBGrid1은 Scroll 이 안되고

    > Record만 이동하는데 DBGrid2는 Scroll 이 됩니다.

    > 즉 DBGrid2가 화면의 맨 마지막에서 Scroll이 안되고 중간에서

    > Scroll이 되어 버립니다.

    >

    > DBGrid1과 DBGrid2가 동일 Record의 내용을 보여주어야 하는데

    > 애를 먹고 있습니다.

    >

    > 고수님들의 고언 부탁드립니다.

    >

    > 좋은 하루되세요....

    ///////////////////////////////////////////////////////////

    아래 예를 들어봤습니다. 참고해보시면 다른 좋은방법도 생길지 모르겠네요.

    각 레코드는 가리키는데요 화면위치상은 일치를하지안습니다.

    그리고 마우스로 클릭시도 위를 변화게하려면 SendMessage등을 써서 키다운이벤트를 먹게할 수 도 있거든요. shift나 ctrl키누르면서 마우스 클릭하면 되는것처럼 코딩히시면될거구요.

    procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if Table1.GetBookmark <> nil then begin

    Table2.GotoBookmark(Table1.GetBookmark);

    if key = 38 then Table2.Prior

    else if key = 40 then Table2.Next;

    end;



    end;



    procedure TForm1.DBGrid2KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if Table1.GetBookmark <> nil then begin

    Table1.GotoBookmark(Table2.GetBookmark);

    if key = 38 then Table1.Prior

    else if key = 40 then Table1.Next;

    end;

    end;

  • Profile
    산돈 2001.08.29 21:49
    홍성락 wrote:

    > 산돈 wrote:

    > > 안녕하세요.

    > > 델파이를 독학하고 있는 초보자입니다.

    > >

    > > 2개의 DBGrid의 동기화 하는데 문제가 생겨 고수님들의

    > > 도움을 청합니다.

    > >

    > > DBGrid1 -> DataSource1 -> Table1

    > > DBGrid2 -> DataSource2 -> Table2

    > >

    > > Table1과 Table2는 Record길이나 Field구성이 같고

    > > Field 값만 조금다른데,

    > > DBGrid1 과 DBGrid2 의 Scroll되는 상태를 동기화 시키기 위해

    > >

    > > DataSourceDataChange Event 에 다음과 같이 코딩했는데

    > > 문제점이 생겼습니다.

    > >

    > > Table2.RecNo := Table1.RecNo;

    > >

    > > DBGrid1의 Record이동시 처음에는 DBGrid2도 동기화되어 동시에

    > > 동일 RecordNo, 동일 Scroll Position을 유지하지만

    > > DBGrid1 이 화면의 중간쯤을 지나면 DBGrid1은 Scroll 이 안되고

    > > Record만 이동하는데 DBGrid2는 Scroll 이 됩니다.

    > > 즉 DBGrid2가 화면의 맨 마지막에서 Scroll이 안되고 중간에서

    > > Scroll이 되어 버립니다.

    > >

    > > DBGrid1과 DBGrid2가 동일 Record의 내용을 보여주어야 하는데

    > > 애를 먹고 있습니다.

    > >

    > > 고수님들의 고언 부탁드립니다.

    > >

    > > 좋은 하루되세요....

    > ///////////////////////////////////////////////////////////

    > 아래 예를 들어봤습니다. 참고해보시면 다른 좋은방법도 생길지 모르겠네요.

    > 각 레코드는 가리키는데요 화면위치상은 일치를하지안습니다.

    > 그리고 마우스로 클릭시도 위를 변화게하려면 SendMessage등을 써서 키다운이벤트를 먹게할 수 도 있거든요. shift나 ctrl키누르면서 마우스 클릭하면 되는것처럼 코딩히시면될거구요.

    > procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    > Shift: TShiftState);

    > begin

    > if Table1.GetBookmark <> nil then begin

    > Table2.GotoBookmark(Table1.GetBookmark);

    > if key = 38 then Table2.Prior

    > else if key = 40 then Table2.Next;

    > end;

    >

    > end;

    >

    > procedure TForm1.DBGrid2KeyDown(Sender: TObject; var Key: Word;

    > Shift: TShiftState);

    > begin

    > if Table1.GetBookmark <> nil then begin

    > Table1.GotoBookmark(Table2.GetBookmark);

    > if key = 38 then Table1.Prior

    > else if key = 40 then Table1.Next;

    > end;

    > end;

    //////////////////////////////////////////

    답변 감사드립니다.



    그런데 님께서 답해드린데로 해도 제가 한 방법이나 결과가 동일합니다.

    즉 DBGrid1에서 Key Down하면 화면 중간까지는 동일 RecordNo 동일 Scroll Position을

    유지하지만 그 이후는 DBGrid1은 Scroll이 안되고 있는데 DBGrid2는 화면 중간에서

    부터 Scroll을 시작합니다. 물론 DBGrid1은 화면 마지막에서 부터 Scroll을 시작하지만..



    DBGrid의 Scroll을 Control하는 방법은 없을까요???????



    좋은하루되세요....

  • Profile
    홍성락 2001.08.30 02:09
    산돈 wrote:

    > 홍성락 wrote:

    > > 산돈 wrote:

    > > > 안녕하세요.

    > > > 델파이를 독학하고 있는 초보자입니다.

    > > >

    > > > 2개의 DBGrid의 동기화 하는데 문제가 생겨 고수님들의

    > > > 도움을 청합니다.

    > > >

    > > > DBGrid1 -> DataSource1 -> Table1

    > > > DBGrid2 -> DataSource2 -> Table2

    > > >

    > > > Table1과 Table2는 Record길이나 Field구성이 같고

    > > > Field 값만 조금다른데,

    > > > DBGrid1 과 DBGrid2 의 Scroll되는 상태를 동기화 시키기 위해

    > > >

    > > > DataSourceDataChange Event 에 다음과 같이 코딩했는데

    > > > 문제점이 생겼습니다.

    > > >

    > > > Table2.RecNo := Table1.RecNo;

    > > >

    > > > DBGrid1의 Record이동시 처음에는 DBGrid2도 동기화되어 동시에

    > > > 동일 RecordNo, 동일 Scroll Position을 유지하지만

    > > > DBGrid1 이 화면의 중간쯤을 지나면 DBGrid1은 Scroll 이 안되고

    > > > Record만 이동하는데 DBGrid2는 Scroll 이 됩니다.

    > > > 즉 DBGrid2가 화면의 맨 마지막에서 Scroll이 안되고 중간에서

    > > > Scroll이 되어 버립니다.

    > > >

    > > > DBGrid1과 DBGrid2가 동일 Record의 내용을 보여주어야 하는데

    > > > 애를 먹고 있습니다.

    > > >

    > > > 고수님들의 고언 부탁드립니다.

    > > >

    > > > 좋은 하루되세요....

    > > ///////////////////////////////////////////////////////////

    > > 아래 예를 들어봤습니다. 참고해보시면 다른 좋은방법도 생길지 모르겠네요.

    > > 각 레코드는 가리키는데요 화면위치상은 일치를하지안습니다.

    > > 그리고 마우스로 클릭시도 위를 변화게하려면 SendMessage등을 써서 키다운이벤트를 먹게할 수 도 있거든요. shift나 ctrl키누르면서 마우스 클릭하면 되는것처럼 코딩히시면될거구요.

    > > procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    > > Shift: TShiftState);

    > > begin

    > > if Table1.GetBookmark <> nil then begin

    > > Table2.GotoBookmark(Table1.GetBookmark);

    > > if key = 38 then Table2.Prior

    > > else if key = 40 then Table2.Next;

    > > end;

    > >

    > > end;

    > >

    > > procedure TForm1.DBGrid2KeyDown(Sender: TObject; var Key: Word;

    > > Shift: TShiftState);

    > > begin

    > > if Table1.GetBookmark <> nil then begin

    > > Table1.GotoBookmark(Table2.GetBookmark);

    > > if key = 38 then Table1.Prior

    > > else if key = 40 then Table1.Next;

    > > end;

    > > end;

    > //////////////////////////////////////////

    > 답변 감사드립니다.

    >

    > 그런데 님께서 답해드린데로 해도 제가 한 방법이나 결과가 동일합니다.

    > 즉 DBGrid1에서 Key Down하면 화면 중간까지는 동일 RecordNo 동일 Scroll Position을

    > 유지하지만 그 이후는 DBGrid1은 Scroll이 안되고 있는데 DBGrid2는 화면 중간에서

    > 부터 Scroll을 시작합니다. 물론 DBGrid1은 화면 마지막에서 부터 Scroll을 시작하지만..

    >

    > DBGrid의 Scroll을 Control하는 방법은 없을까요???????

    >

    > 좋은하루되세요....

    ////////////////////////////////////////////////////////////////////////

    DBGrid의 Scroll을 직접 제어하는것은 좀더 알아봐야겠고요, 화면에 뿌려주는 시작 레코드를 제어하는 방법도 알아봐야겠는데요.

    편법으론 그리드 두개다 중간에서만 Scroll하게하는것으로 하면...원하는결과는 아닌줄알지만요....

    아래처럼 그리드1에도 북마크를 찍는거로 추가해서요.

    procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    begin

    if Table1.GetBookmark <> nil then begin

    Table1.GotoBookmark(Table1.GetBookmark);

    Table2.GotoBookmark(Table1.GetBookmark);

    if key = 38 then Table2.Prior

    else if key = 40 then Table2.Next;

    end;

    end;