2011-12-30 72 views
3

我正在使用傳統的PowerBuilder應用程序,我們已升級到PowerBuilder 12,但仍繼續使用「經典」IDE。列控制PowerBuilder表達式控制奇怪的行爲

我有一個網格DataWindow與自由形式的DataWindow共享數據,它們都繼承祖先,以確保當網格中當前行發生變化時,自由形式滾動到同一行。

我已經開始在自由形式的列控件的Protect和Background.Color屬性上使用表達式來模擬啓用/禁用,作爲在rowfocuschanged上使用DataWindow.Modify的替代方法。

到目前爲止,我很喜歡這種方法,它看起來更清潔,並且沒有明顯的性能損失,因爲我沒有訪問我的任何表達式中的數據庫。

問題是,由於我難以固定的原因,這些表達式有時會導致上述行同步功能失敗。

在我的測試場景中,網格中有兩行。選擇第2行不會導致自由格式滾動到第2行,儘管調試顯示ScrollToRow確實被正常調用。然後我再次選擇第1行,不能確定這是否有效,因爲自由格式從未將第1行從第一行開始。然後,我再次選擇第2行,並且自由格式適當地滾動到第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會給你啓用屬性,所以保持你的方法模塊化和兼容。 – Terry 2011-12-30 16:06:04

+0

感謝您的及時回覆!在dw_grid.rowfocuschanged中有代碼可以執行dw_freeform.ScrollToRow(currentrow)。我添加了代碼來捕獲返回值,當問題發生時它返回1,但currentrow是2!我也注意到在dw_freeform.rowfocuschanging中我的斷點沒有被擊中。我會嘗試你的其他建議。 – Mike 2011-12-30 18:17:59

+0

因此,在dw_grid.retrieveend上,我做了一個dw_freeform.SetColumn,我唯一的列總是沒有保護,它的工作,非常感謝你!我很好奇,是什麼讓你想到的,是什麼時候評估表達式和是否設置了列之間的關係? – Mike 2011-12-30 18:29:48

回答

2

回想起來,回答這個問題的答案,取而代之的是對評論中開發的內容的補充。

設置新行時,PowerBuilder嘗試將列設置爲當前在當前行中具有焦點的列。這在基本情況下工作正常,但是當Protect屬性有表達式時,事情可能會有點不可預測。我不確定在目標行中的列是否受保護的情況下是否存在記錄或預期的行爲,但是我的安全位置是行爲是不可預知的,您可能不應該這樣做。正如邁克所證明的,明確設置專欄可以解決他的問題。

檢查是否嘗試解決類似問題的另一個主要問題是確保RowFocusChanging不返回1以防止發生行更改。

祝你好運,

特里。

1

我遇到過類似的問題,其中不僅字段被保護,而且行焦點更改時背景和文本顏色也會更改。

出於某種原因,Datawindow表達式非常不一致,尤其是當存在其他樣式(如複選框)時。從數據窗口對象中刪除所有這些表達式,並將它們全部放入使用Post()從網格列表的rowfocuschanged()事件調用的數據窗口控件中的一個用戶事件/函數中。此外,通過這種方式,您可以更好地控制事件何時啓動,而不是在dw表達式上添加代碼。