0

私は最近、ある会社で新しい仕事を始めました。私の最初の仕事は、かなり古いソフトウェアを更新することです。

大きな裏話がありますが、基本的にソフトウェアは PB8 (1997 年頃) で書かれており、社内の誰も (私を含めて) PowerBuilder の経験がありません。代替品は承認されており、開発可能です。

PowerBuilder 12.5 のライセンスを持っているので、PB12.5 Classic を使用してすべてを実行しています。元の開発者にサポートを求めることができず、ドキュメントもありません。

私が理解しようとしていることの 1 つは、将来的に大きな助けになることですが、関数が定義されている場所と変数が値を取得する場所を決定する方法です。

現在取り組んでいる例は、次のシナリオです。タブ付きのデータ ウィンドウがあり、tab_detail各タブには、ツリー リストにある小さなオレンジ色の男性がさまざまに表示されます。

これらの 1 つが呼び出されdw_detail、データの貼り付けが可能になります。他のタブではデータの貼り付けが許可されていませんが、許可したいと思います。次のコードをdw_detail含むイベントがあります。rbuttondown()

    Window  w_parentwin

    If ib_add_mode Or ib_chg_mode Then
        w_parentwin = Parent.GetParent().GetParent()

        m_dwpaste   m_pop_paste
        m_pop_paste = CREATE m_dwpaste

        m_pop_paste.idw_data = This

        If ii_agent_code > 0 And Not IsNull(id_period) And Clipboard() <> "" Then
            m_pop_paste.m_popup.m_paste.Enabled = TRUE
        Else
            m_pop_paste.m_popup.m_paste.Enabled = FALSE
        End If

        m_pop_paste.m_popup.PopMenu(w_parentwin.PointerX(), w_parentwin.PointerY())        

        DESTROY(m_pop_paste)
    End If

rbuttondown()そのコードをタブ番号 2 ( )のイベントに追加すると、データ ウィンドウdw_adjustment内で右クリックするとタブ 2 で貼り付けが可能になりますが、データはタブのフィールドではなくタブ内のフィールドに貼り付けられます。dw_adjustmentdw_detaildw_adjustment

コードのデバッグとステップ実行を試みましたが、変数ウィンドウに何千もの値があり、検索する機能がないと、上記で使用されている変数とその値が見つからないか、データがdw_detailタブではなくタブにdw_adjustment貼り付けられる理由を見つけることができませんタブに貼り付けdw_adjustmentます。

基本的に、どこを見ればいいのか、上記が何をしているのか、クリックしたタブではなくすべてがタブ1に貼り付けられる理由について、役立つヒントを探しています。

別の場所のコードからさらに詳細が必要な場合、またはより多くの情報が必要な場合は、喜んで提供します。

関が示唆したm_popupように、ダブルクリックするとwf_pastereturn()次のように表示されました。

Integer li_idx, li_rows, li_dwrows, li_comm, li_seqno
String  ls_approval_type

If tab_detail.tabpage_details.dw_detail.RowCount() > 0 Then
    li_idx = 1
    li_dwrows = tab_detail.tabpage_details.dw_detail.RowCount()

    Do Until li_idx > li_dwrows
        ls_approval_type = tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx]
        If IsNull(ls_approval_type) or ls_approval_type = "" Then
            tab_detail.tabpage_details.dw_detail.DeleteRow(li_idx)
        Else
            li_idx++
        End If
        li_dwrows = tab_detail.tabpage_details.dw_detail.RowCount()
    Loop
End If

If li_dwrows > 0 Then
    li_seqno = Long(tab_detail.tabpage_details.dw_detail.Object.seq_no [li_dwrows])
End If
li_seqno += 10


If Clipboard() <> "" Then
    If tab_detail.tabpage_details.dw_detail.ImportClipboard(1, li_rows, 1, 4, 3) <= 0 Then
        MessageBox("Invalid Data", "Unable to paste!", StopSign!)
        Return -1
    End If
    li_rows = tab_detail.tabpage_details.dw_detail.RowCount()
    li_dwrows++
    For li_idx = li_dwrows To li_rows
        tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx] = trim(tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx])
        tab_detail.tabpage_details.dw_detail.Object.approval_no [li_idx] = trim(tab_detail.tabpage_details.dw_detail.Object.approval_no [li_idx])
        tab_detail.tabpage_details.dw_detail.Object.agent_code [li_idx] = ii_agent_code
        tab_detail.tabpage_details.dw_detail.Object.period [li_idx] = id_period
        li_comm = f_new_commission(Long(tab_detail.tabpage_details.dw_detail.Object.value_of_work[li_idx]), id_period)
        tab_detail.tabpage_details.dw_detail.Object.levy_payable[li_idx]= &
            inv_rate.of_CalculateLevyPayable (Long(tab_detail.tabpage_details.dw_detail.Object.value_of_work[li_idx]), id_period)
        tab_detail.tabpage_details.dw_detail.Object.comm_deductable [li_idx] = li_comm
        tab_detail.tabpage_details.dw_detail.Object.commission [li_idx] = li_comm
        tab_detail.tabpage_details.dw_detail.Object.seq_no [li_idx] = li_seqno
        li_seqno += 10
        tab_detail.tabpage_details.dw_detail.Object.agent_return_detail_create_date[li_idx] = Today()
        tab_detail.tabpage_details.dw_detail.Object.agent_return_detail_create_user[li_idx] = SQLCA.Logid
    Next
    Clipboard("")
    Return 0
Else
    Return -1
End If

windowsSelectedTabプロパティを使用するように関数を変更しました。データはタブに貼り付けられるようになりましたが、間違った入力フィールドに貼り付けられます。さらに調べたところ、ImportClipboard関数のデータ列が並んでいません。

選択したデータベース列の順序を変更する最良の方法は?

これがタブの意味のスクリーンショットです。 ここに画像の説明を入力

したがって、メイン プログラム ウィンドウ内には上記のタブがあり、各タブ (入力フィールドがある場所) 内には、dw_プレフィックスでラベル付けされたデータ ウィンドウがあります。

助けてくれてありがとう。

4

3 に答える 3

0

貼り付け問題

パス 1

確かなことはわかりませんが、m_dwpaste.m_popup.m_paste.Clicked のコードを見てみたいと思います。最悪のシナリオは、dw_detail がそのスクリプトにハード コードされていることです。少し良いケースは、より柔軟なルーチンが含まれていることですが、どういうわけか dw_adjustment がそのアルゴリズムに適合しません。

パス 2

新しい情報から、wf_pastereturn() のコード (どうやってこのスクリプトにたどり着いたのかはわかりませんが、これが原因のようです) は単に貼り付けているだけでなく、特定のフィールドを含む多くのことを行っていることがわかります。実際、これは単なる貼り付けではなく、データのインポートです。つまり、クリップボードの内容が特定の形式であるだけでなく、データウィンドウのデータ セットと一致することを前提としています (DW ペインタの列ペインを参照し、データウィンドウのデータ セット部分と UI 部分を混同しないように注意してください)。問題は、あなたがしたいですか:

  • 「貼り付け」は、テキストをメモ帳からブラウザ フォームにコピーするようなものです。テキストを現在のフィールドに入れるだけですか?
  • スクリプトに記述されているすべての同じカラムが両方のデータウィンドウにあるという仮定を含めて、他のデータウィンドウとまったく同じように「貼り付け」ますか?
  • このスクリプトのようなものを「貼り付け」ますが、新しいデータウィンドウのデータ セット用にカスタマイズしますか?

これらはすべて、タブとデータウィンドウに関する私のコメントで尋ねた違いと組み合わせて、多少異なるソリューションを必要とします。

ものを探す

私はPBL Peeperと呼ばれる PowerBuilder コードの検索を支援するツールの作成者であるため、偏りのない視点で申し上げたいと思います。

[参照] タブでコードを表示していて、変数に関する他の言及を表示したい場合は、変数を選択して右クリックし、次のいずれかを実行できます。

  • スクリプト内を前後に検索する
  • 左側のツリーでオブジェクト名を検索します (見れば分かります)。
  • オブジェクトの残りの部分またはアプリケーションの残りの部分を検索します

複数の構文が関係する可能性があるため、変数が割り当てられている場所を見つけるのは思ったより困難です。

// assigns a value on instantiation
int i = 1

// assigns a value when executed
i = 1

// does not assign a value
IF i = 1 THEN

// assigns a value possibly if the parameter is passed by reference (kind of like a pointer to the variable)
f_foo (i)

変数のスコープを理解すると、変数の設定を見つけるのに役立ちます。変数がローカルの場合は、スクリプトを検索するだけで済みます。スコープがインスタンスまたは共有の場合、オブジェクト (上記のように非常に簡単) とその子孫 (ツリービューで RMB を使用して特定の子孫に移動するのは簡単ですが、一連の子孫を検索するのは難しい) を検索する必要があります。範囲がグローバルの場合は、アプリ全体を検索する必要があります。

選択した関数が宣言されている場所を見つけることは可能ですが、ちょっとした秘密 (または RTFM) を知る必要があります。RMB メニューの [検索] は [検索] ページのパラメーターを使用するため、関数が宣言されている場所を検索するには、[部分の種類] を [スクリプト] だけでなく [すべて] に設定する必要があります。または、リスト/スクリプト ページを使用して、そのページの機能 (検索、クイック検索、フィルターなど) を使用してスクリプトを検索することもできます。

このツールには、コードを検索、フィルタリング、ふるいにかけることで目的のコードを取得できる機能が多数あります。上記は簡単な紹介です。

幸運を、

テリー。

于 2013-10-03T13:43:28.347 に答える
0

コンテキスト メニューを使用したアクションは 2 回あります。

  • マウスの右クリックを処理してコンテキスト メニューを表示する
  • ポップアップ メニューによって提供される 1 つまたは複数のアクションの中からアクションを実行する

PopMenu()クリップボードに何かがある場合 ( ) でメニューを表示している pbscript を示しましたClipboard() <> ""が、貼り付けアクションが別の場所にあることに気付いていない可能性があります。

を参照してくださいm_popup: 貼り付けるためにハードコードされている可能性のあるコードが内部にある必要がありますdw_detail。もしそうなら、コンテキスト メニューの現在処理されている dw への参照をウィンドウ インスタンス変数に保存できるかもしれません。

何かのようなもの :

  • datawindow idw_currentインスタンス変数で
  • その後、rbuttondown()イベントidw_current = this(これはrbuttondown()イベントが属するデータウィンドウです)
  • そして最後にメニューid_currentで、ハードコードされたの代わりにを再利用しますdw_detail

変数が変更された場所に関するあなたの質問に関して: あなたができることは、名前で変数を検索し (ターゲットまたは単一の pbl またはオブジェクトを右クリックしてから「検索」)、影響を受ける行にブレークポイントを配置することです. CtrlDCtrlT(ではなく)デバッグ モードで実行するCtrlRと、変数がいつ変更されたかを追跡できます。

于 2013-10-02T08:48:54.817 に答える