2013-01-14 40 views
7

này đem lại cho tôi đau đầu ...Nhúng nhiều trường MS Word trong TOleContainer

Các delphi App Tôi đang làm việc trên mở ra một hoặc nhiều hình thức với Word trong một TOLEContainer. Vấn đề tôi gặp phải là khi có nhiều hơn một biểu mẫu được mở bằng một cá thể Word được nhúng, các điều khiển của một cá thể ảnh hưởng đến tất cả các cá thể khác trong khi các điều khiển trên cá thể đầu tiên không sử dụng được.

Các điều khiển cho TOleContainer đầu tiên, vẫn hiển thị và có vẻ được bật nhưng không hoạt động, chọn văn bản trong trường hợp đầu tiên và sử dụng các điều khiển trong trường hợp thứ hai. (?!? rõ ràng là bùn) Ví dụ tất cả rất khó hiểu vì vậy tôi đã bao gồm một bức tranh:

OleControls toolbar controlling both instances of word

Mục đích là để có mỗi trường hợp của chữ nhúng trong hình thức riêng của nó và sử dụng nó điều khiển riêng. Vậy điều gì gây ra hành vi không mong muốn của tôi và tôi có thể làm gì với nó? Tôi chắc chắn nó là một cái gì đó đơn giản, giống như bắt các "kích hoạt" tài sản và thiết lập (Tôi không biết những gì để thiết lập) của OleContainer, nhưng tôi đã không có may mắn với điều này.

Tôi tìm một giải pháp thay thế có thể là tạo ra các trường hợp TWordApplication của riêng tôi và cha hoặc mẹ qua Windows.SetParent() (điều này làm việc, btw, mỗi cá thể tự kiểm soát nhưng sẽ đòi hỏi nhiều việc làm lại) hoặc nhúng trong một OleContainer ... tôi có thể nhúng TWordApplication trường hợp OleContainers riêng của họ? Nếu thế thì sao? Ngoài ra thay đổi hành vi mở mặc định của CreateObjectFromFile (nhưng tôi nghĩ rằng điều này được điều khiển bởi máy chủ COM là Word) ...

Để tham khảo .... Kiểm tra sau bằng cách tạo một vài biểu mẫu ...

// This embed into an OleContainer, but opening two forms 
// leaves me with one that has working controls and another 
// that has non-working controls (this code on it's own form) 
// If this code is on TForm2 and you create two instances of TForm2 
// Word behaves incorrectly 
OleContainer1.CreateObjectFromFile('C:\Test.docx', false); 
OleContainer1.AutoActivate := aaGetFocus; 
OleContainer1.DoVerb(ovOpen); 

OleContainer1.Run; 


// To embed Word on a TPanel (this code on it's own form) 
// This code on TForm3, create two instance of TForm3 to see 
// word work independently as desired 
wordApp := TWordApplication.Create(Self); 
wordApp.ConnectKind := TConnectKind.ckNewInstance; 
wordApp.Caption := IntToStr(AppId); 
wordApp.Visible := True; 

WordHandle := FindWindow('OpusApp', PWideChar(wordApp.Caption)); 

Windows.SetParent(WordHandle, Panel1.Handle); 

if AppId = 1 then 
begin 
    lFilename := 'C:\Test.docx'; 
end else begin 
    lFilename := 'C:\Test2.docx'; 
end; 
wordApp.Documents.Open(lFileName, EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); 

Trả lời

6

Bạn có thể thử làm việc với IOleInPlaceActiveObject và kích hoạt và hủy kích hoạt khi biểu mẫu của bạn kích hoạt và hủy kích hoạt. Xem câu trả lời chấp nhận câu hỏi của tôi: Context menu disappears with Word automation

+3

Đối với bất cứ ai trong trỗi dậy của tôi ... Cách để làm điều đó là bắt OnActivate/Tắt của Mẫu, sau đó đúc như sau ... nếu Assigned (FWordApplication) sau đó bắt đầu nếu Hỗ ​​trợ (OleContainer1.OleObject, IOleInPlaceActiveObject, lOleInPlaceActiveObject) sau đó bắt đầu lOleInPlaceActiveObject.OnDocWindowActivate (True) cuối; kết thúc; Những gì tôi thực sự cần thiết tuy nhiên là OnFrameWindowActivate là một phần của cùng một giao diện. Dễ dàng khi bạn biết làm thế nào! – 0909EM

+0

@ 0909EM: Rất vui khi tôi đã sử dụng de OnFrameWindowActivate. –

+1

Đọc thêm dẫn đến điều này sắp tới ... http://support.microsoft.com/kb/98678 ... mặc dù tôi có thể bỏ qua nó trong ứng dụng tôi đang làm việc – 0909EM

Các vấn đề liên quan