2011-12-30 4 views
3

기존 PowerBuilder 앱에서 작업 중이지만 PowerBuilder 12로 업그레이드했지만 "클래식"IDE는 계속 사용합니다.열의 PowerBuilder 표현식이 이상한 동작을 제어합니다.

프리폼 데이터 윈도우와 데이터를 공유하는 데이터 윈도우가 있습니다. 프리폼은 현재 행이 그리드에서 변경 될 때 자유형이 동일한 행으로 스크롤되도록 상위를 상속합니다.

rowfocuschanged에서 DataWindow.Modify를 사용하는 대신 활성화/비활성화를 시뮬레이트하기 위해 자유형의 열 컨트롤의 Protect 및 Background.Color 속성에서 표현식을 사용하기 시작했습니다.

지금까지 나는이 접근법을 즐겼으며 훨씬 더 깨끗해 보였고 어떤 식 으로든 데이터베이스에 액세스하지 않으므로 성능상의 불이익이 없다.

문제는 내가 힘든 시간을 보내고 있기 때문에 이러한 표현이 앞에서 설명한 행 동기화 기능을 실패하게 만드는 경우가 있습니다.

내 테스트 시나리오에는 그리드에 두 개의 행이 있습니다. 2 행을 선택해도 디버깅이 ScrollToRow가 실제로 정상적으로 호출된다는 사실이 드러났음에도 불구하고 자유형이 2 행으로 스크롤되지 않습니다. 그런 다음 행 1을 다시 선택합니다. 자유형이 1 행부터 시작하지 않았기 때문에 이것이 작동하는지 여부는 확실하지 않습니다. 그런 다음 두 번째 행을 두 번째로 선택하면 자유형이 2 행으로 제대로 스크롤되며 앞으로는 사물함이 멋지게됩니다.

하나의 특정 표현식 내에서 코드를 이동하여이 문제를 다른 창에서 한 번 수정했습니다. 이유가 무엇인지에 대한 실마리가 없습니다. 변경 사항은 표현식의 결과에 영향을 미치지 않습니다. 불행히도 나는 현재의 창문에서 그렇게 쉬운 시간을 정하지 못하고있다. 지금까지 특정 특정 DateTime EditMask 열에서 Protect 식을 제거하거나 선행 DateTime EditMask 열의 TabOrder를 양수 값으로 설정하여 기능 손실시 문제를 해결할 수 있습니다. 첫 번째 열에는 Protect 표현식이 필요하고 두 번째 열은 편집 불가능해야합니다. 두 번째 열에 TabOrder 양수를 지정하려고 시도했지만 보호 식을 1로 설정했지만 작동하지 않았습니다.

나는 머리카락을 찢어 내고 PowerBuilder를 무서워하고 있습니다. 문제가 무엇인지 알지 못하는 경우와 열의 표현을 피하면서 계속 사용하는 방법에 대해 아는 사람이 있다면 고맙겠습니다. Rowfocuschanged에서 수정을 통해이 항목을 조작하는 방식으로 돌아가는 것에 저는 싫습니다.

+1

ScrollToRow()에서 반환을 확인 했습니까? 나는 Describe ("datawindow.firstrowonpage")와 lastrowonpage를 체크하여 당신의 컨트롤이 DW가 이미 있다고 생각하지 않도록한다. 다른 코드가 실행되지 않도록하는 PBDEBUG 추적 (예 : 리턴 코드를 방지하는 RowFocusChanging)은 아이디어 일 수 있습니다 (디버거는 방해가되며 이벤트 시퀀스를 변경할 수 있음). 그냥 브레인 스토밍, ScrollToRow() 전에 보호되지 않은 열에 SetColumn()보십시오. 여기에 SetRow()가 있습니까?) 12.5는 Enabled 속성을 제공하므로 메서드가 모듈화되고 호환되도록하십시오. – Terry

+0

신속한 답장을 보내 주셔서 감사합니다! dw_grid.rowfocuschanged에는 dw_freeform.ScrollToRow (currentrow)를 수행하는 코드가 있습니다. 반환 값을 캡처하는 코드를 추가하고 문제가 발생하면 1을 반환하지만 currentrow는 2입니다! dw_freeform.rowfocuschanging의 중단 점이 적중되지 않는 것으로 나타났습니다. 나는 너의 다른 제안을 시도 할 것이다. – Mike

+0

그래서 dw_grid.retrieveend에서 나는 항상 보호받지 못하고 작동하는 유일한 컬럼에 dw_freeform.SetColumn을 했어. 정말 고마워요! 내가 궁금한 점은 무엇을 생각하게 만들었습니까? 표현식이 평가되는 시점과 열이 설정되는 시점 사이에 어떤 관계가 있습니까? – Mike

답변

2

다음은 답을 다시 말하며 의견에서 개발 한 내용을 취합하여 추가 한 것입니다.

새 행을 설정할 때 PowerBuilder는 현재 행에 포커스가있는 열과 동일한 열을 설정하려고합니다. 이 경우 기본 작동에서는 정상적으로 작동하지만 Protect 특성에식이있는 경우 상황이 예측 가능성이 약간 떨어질 수 있습니다. 대상 행의 열이 보호되는 경우에 문서화되거나 의도 된 동작이 있는지 확실하지 않지만 내 위치는 동작이 예측할 수 없다는 것이고 아마도이 작업을해서는 안됩니다. Mike가 증명했듯이, 명시 적으로 열을 설정하면 문제가 해결됩니다.

비슷한 문제를 해결하려고 할 때 가장 중요한 사항은 RowFocusChanging이 행 변경을 방지하기 위해 1을 반환하지 않는지 확인하는 것입니다.

행운을 빕니다,

테리.

1

필자는 필드가 보호되고있을뿐만 아니라 행 포커스가 변경 될 때 배경과 텍스트 색이 변경되는 유사한 문제를 경험했습니다.

특히, 체크 박스와 같은 다른 스타일이있는 경우 Datawindow 표현식이 상당히 일치하지 않습니다. datawindow 객체에서이 모든 표현식을 제거하고 Post()를 사용하여 그리드 목록의 rowfocuschanged() 이벤트에서 호출되는 datawindow 컨트롤의 하나의 사용자 이벤트/함수에 모두 넣는 것이 트릭을 수행하는 것 같습니다. 또한이 방법을 사용하면 dw 표현식에 코드가있는 것과는 대조적으로 이벤트가 실제로 실행되는 시간을 제어 할 수 있습니다.

관련 문제