從 OLE 服務端拖動對象放入 OLE 應用程序,無需插入/粘貼對話框,僅需鼠標拖放。釋放時觸發窗體 OnDragDrop 事件,Source 參數為 TOLEDropNotify 派生類型,其 PInitInfo 屬性對應 OLE 容器 PInitInfo。賦值即實現釋放功能:
procedure TOLEFrameForm.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
var NewChild: TOLEObjectForm;
begin
if Source is TOLEDropNotify then
begin
NewChild := CreateChild;
with Source as TOLEDropNotify do
NewChild.OLEContainer.PInitInfo := PInitInfo;
end;
end;
注意:不要 用 ReleaseOLEInitInfo 釋放內存,Delphi 自動處理。
.OLE)OLEContainer.SaveToFile('C:\SALES.OLE') 保存;OLEContainer.LoadFromFile('C:\SALES.OLE') 載入。例程用保存/打開對話框實現。
對話框屬性:
| 屬性 | 保存對話框 | 打開對話框 |
|---|---|---|
| Name | SaveAsDialog | OpenDialog |
| DefaultExt | ole | ole |
| FileName | .OLE | .OLE |
| Filter | OLE files (*.OLE)|*.OLE | OLE files (*.OLE)|*.OLE |
// 文件|保存
procedure TOLEObjectForm.SaveAs1Click(Sender: TObject);
begin
if SaveAsDialog.Execute then
OLEContainer.SaveToFile(SaveAsDialog.FileName);
end;
// 文件|打開
procedure TOLEFrameForm.Open1Click(Sender: TObject);
var NewChild: TOLEObjectForm;
begin
if OpenDialog.Execute then
begin
NewChild := CreateChild;
NewChild.OLEContainer.LoadFromFile(OpenDialog.FileName);
end;
end;
Delphi 無粘貼對話框組件,用 PasteSpecialDlg 函數顯示:
function PasteSpecialDlg(Form: TForm; const Formats: array; HelpContext: THelpContext;
var Format: Word; var Handle: THandle; var PInitInfo: Pointer): Boolean;
參數:Form(擁有對話框窗體)、Formats(註冊對象格式數組,BOLEFormat 類型)、HelpContext(在線幫助,0 為無)、Format(返回剪貼板格式)、Handle(數據句柄)、PInitInfo(初始化信息指針)。
主窗體 OnCreate 註冊格式:
procedure TOLEFrameForm.FormCreate(Sender: TObject);
begin
FEmbedClipFmt := RegisterClipboardFormat('Embedded Object');
FLinkClipFmt := RegisterClipboardFormat('Link Source');
Fmts[0].fmtId := FEmbedClipFmt;
Fmts[0].fmtMedium := BOLEMediumCalc(FEmbedClipFmt);
Fmts[0].fmtIsLinkable := False;
StrPCopy(Fmts[0].fmtName, '%s');
StrPCopy(Fmts[0].fmtResultName, '%s');
Fmts[1].fmtId := FLinkClipFmt;
Fmts[1].fmtMedium := BOLEMediumCalc(FLinkClipFmt);
Fmts[1].fmtIsLinkable := True;
StrPCopy(Fmts[1].fmtName, '%s');
StrPCopy(Fmts[1].fmtResultName, '%s');
RegisterFormAsOleDropTarget(Self, Fmts);
end;
RegisterClipboardFormat 返回 Word 唯一標識新格式。FEmbedClipFmt/FLinkClipFmt 為私有成員。BOLEFormat 定義於 BOLEDefs,BOLEMediumCalc 於 ToCtrl,需在 uses 引入。
procedure TOLEObjectForm.PasteSpecial1Click(Sender: TObject);
var ClipFmt: Word; DataHand: THandle; Info: Pointer;
begin
if PasteSpecialEnabled(Self, OLEFrameForm.Fmts) then
if PasteSpecialDlg(Self, OLEFrameForm.Fmts, 0, ClipFmt, DataHand, Info) then
InitializeOLEObject(Info);
end;
// 編輯菜單點擊啟用粘貼項
procedure TOLEObjectForm.Edit1Click(Sender: TObject);
begin
PasteSpecial1.Enabled := PasteSpecialEnabled(Self, OLEFrameForm.Fmts);
end;
PasteSpecialEnabled 判斷剪貼板是否有 Fmts 定義格式,有則啟用粘貼對話框。