貼り付けコマンド「RecordGridPaste」をカスタマイズして対応するのがよいかもしれないですね。
with マクロを使って、貼り付け処理のときだけ編集可能にしています。
エクセルと振舞いを合わせるために、貼り付け時に、選択範囲を変更することも
このクラスをカスタマイズすればできそうですね。
Code:
{define-class public open CustomPaste {inherits RecordGridPaste}
{constructor public {default context:RecordGrid}
{construct-super context}
}
{method public {do-command allow-prompt?:bool = true}:void
{if not self.context.editable? then
def ret-val = {popup-question "対象のグリッドは編集不可ですが、強制的に貼り付けますか?"}
{if ret-val == Dialog.yes then
{with self.context.editable? = true do
{super.do-command allow-prompt? = allow-prompt?}
}
}
else
{super.do-command allow-prompt? = allow-prompt?}
}
}
}
{define-class public CustomPasteControlRecordGrid {inherits RecordGrid}
{constructor public {default ...}
{construct-super {splice ...}}
}
{method public {create-command name:String}:#Command
{switch name
case "paste" do
def paste-command = {CustomPaste self}
{return paste-command}
else
{return {super.create-command name}}
}
}
}
{let rs:RecordSet =
{RecordSet
{RecordFields
{RecordField "First", domain = String},
{RecordField "Last", domain = String},
{RecordField "Age", domain = int}
}
,
{RecordData First = "John", Last = "Smith", Age = 25},
{RecordData First = "Jane", Last = "Smith", Age = 29},
{RecordData First = "Jane", Last = "Jones", Age = 28}
}
}
{def paste-grid =
{CustomPasteControlRecordGrid
record-source = rs,
editable? = false
}
}
{value paste-grid}
{CommandButton
label = "貼り付け",
{on Action do
{if paste-grid.records.size == 0 then
{if-non-null rs-tmp = paste-grid.record-source then
{rs-tmp.append {rs-tmp.new-record}}
}
}
{paste-grid.select-all}
{paste-grid.do-command "paste"}
{paste-grid.select-nothing}
}
}
{CommandButton
label = "全削除",
{on Action do
{rs.delete-all}
}
}
{CommandButton
label = "追加",
{on Action do
{rs.append {RecordData First = "John", Last = "Smith", Age = 25}}
}
}