Cứ upload lên ai cần thì họ dùng, họ cảm ơn. Còn đây thì chỉ thấy Úp - Mở thôi.chính xác là vậy ..
Khó nhất là dựa vào đó viết 1 class tùy chỉnh liên kết sử dụng cho hàm với nhiều tham số
còn khai báo thủ công theo chỉ dẫn của Ms sẻ rất khó cho ai đó mới tập tành sử dụng nó
nếu ai đó thích hay có nhu cầu tôi sẻ úp tiếp file tạo Menu Ribbon cho Delphi lên cho tham khảo thêm như mô tả bài số 14
File đo tân thành viên GPE viết còn phần XML cho Delphi + VB6 do Tôi kết hợp với Tân Viết sẻ hổ trợ tạo menu Ribbon trên VBA + VB6 + Delphi = 3 trong 1
Mới tải về xem thấy như sau + 2 link khác ngó qua thì làm biếng xem tiếpCứ upload lên ai cần thì họ dùng, họ cảm ơn. Còn đây thì chỉ thấy Úp - Mở thôi.
Vào trang http://techvanguards.com/ của Bác BinhLy
https://github.com/jhc-systems/DelphiUIAutomation
https://www.davidghoyle.co.uk/WordPress/?p=311
Hình như bằng ngôn ngữ lập trình Pascal thì phải, thấy họ viết như thế lày:
unit ExcelApp.MenuButton.pas;
interface
uses Office2000_TLB, ExcelApp.EventSink;
type
TMenuButton = class(TObject)
private
FID: string;
FButton: _CommandBarButton;
FSink: TEventSink;
FCookie: Integer;
FClickProc: TClickProc;
public
constructor Create(const Parent: CommandBarPopup; const strID: string; const strCaption:
string; const EventHandler: TClickProc; const MenuOptions: TMenuOptions); overload;
constructor Create(const Parent: CommandBar; const strCaption: string; const EventHandler:
TClickProc; const MenuOptions: TMenuOptions); overload;
destructor Destroy; override;
property Button: _CommandBarButton read FButton;
property ID: string read FID default 0;
property ClickProc: TClickProc read FClickProc;
end;
implementation
{ TMenuButton }
constructor TMenuButton.Create(const Parent: CommandBarPopup; const strID: string; const
strCaption: string; const EventHandler: TClickProc; const MenuOptions: TMenuOptions);
begin
end;
constructor TMenuButton.Create(const Parent: CommandBar; const strCaption: string; const
EventHandler: TClickProc; const MenuOptions: TMenuOptions);
begin
end;
destructor TMenuButton.Destroy;
begin
end;
end.
------------------------------------------------------------
View attachment 295814
unit Unit2;
interface
uses
Windows, ActiveX, ComObj, Variants;
const
CLASS_DTExtensibility2: TGUID = '{AD1C5BA3-0140-4E45-8C92-2550B1271BC0}';
type
IDTExtensibility2 = interface(IDispatch)
['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}']
procedure OnConnection(const HostApp: IDispatch; ext_ConnectMode: Integer;
const AddInInst: IDispatch; var custom: PSafeArray); safecall;
procedure OnDisconnection(ext_DisconnectMode: Integer; var custom: PSafeArray); safecall;
procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
procedure OnStartupComplete(var custom: PSafeArray); safecall;
procedure BeginShutdown(var custom: PSafeArray); safecall;
procedure DoAction(const Control: IUnknown); safecall;
function DoLoadImage(const aImageName: WideString): IPictureDisp; safecall;
end;
IRibbonExtensibility = interface(IDispatch)
['{000C0396-0000-0000-C000-000000000046}']
function GetCustomUI(const RibbonID: WideString): WideString; safecall;
end;
TOfficeAddInsTest = class(TAutoObject, IDTExtensibility2, IRibbonExtensibility)
private
protected
procedure BeginShutdown(var custom: PSafeArray); safecall;
function GetCustomUI(const RibbonID: WideString): WideString; safecall;
procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
procedure OnConnection(const HostApp: IDispatch;
ext_ConnectMode: Integer; const AddInInst: IDispatch;
var custom: PSafeArray); safecall;
procedure OnDisconnection(ext_DisconnectMode: Integer;
var custom: PSafeArray); safecall;
procedure OnStartupComplete(var custom: PSafeArray); safecall;
procedure DoAction(const Button: IUnknown); safecall;
function DoLoadImage(const aImageName: WideString): IPictureDisp; safecall;
end;
implementation
uses
AxCtrls, Graphics, ComServ;
procedure TOfficeAddInsTest.OnConnection(const HostApp: IDispatch;
ext_ConnectMode: Integer; const AddInInst: IDispatch;
var custom: PSafeArray);
begin
end;
procedure TOfficeAddInsTest.OnDisconnection(ext_DisconnectMode: Integer;
var custom: PSafeArray);
begin
end;
procedure TOfficeAddInsTest.BeginShutdown(var custom: PSafeArray);
begin
end;
procedure TOfficeAddInsTest.OnAddInsUpdate(var custom: PSafeArray);
begin
end;
procedure TOfficeAddInsTest.OnStartupComplete(var custom: PSafeArray);
begin
end;
procedure TOfficeAddInsTest.DoAction(const Button: IUnknown);
begin
MessageBox(0, 'Hello, World', 'Information', MB_ICONINFORMATION)
end;
function TOfficeAddInsTest.DoLoadImage(const aImageName: WideString): IPictureDisp;
var
PictureDesc: TPictDesc;
begin
if aImageName = 'mainicon.ico' then begin
with PictureDesc do begin
cbSizeOfStruct := SizeOf(PictureDesc);
picType := PICTYPE_ICON;
hIcon := LoadIcon(HInstance, 'MAINICON')
end;
OleCheck(OleCreatePictureIndirect(PictureDesc, IPicture, True, Result))
end else
Result := nil
end;
function TOfficeAddInsTest.GetCustomUI(const RibbonID: WideString): WideString; safecall;
begin
Result :=
'<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" loadImage="DoLoadImage">'#13#10+
' <ribbon>'#13#10+
' <officeMenu>'#13#10+
' <menu idMso="FileSendMenu">'#13#10+
// ' <button id="TestButtonID" insertAfterMso="FileSendAsAttachment" label="Hello, World!" imageMso ="HappyFace" onAction="DoAction"/>'#13#10+
' <button id="TestButtonID" insertAfterMso="FileSendAsAttachment" label="Hello, World!" image="mainicon.ico" onAction="DoAction"/>'#13#10+
' </menu>'#13#10+
' </officeMenu>'#13#10+
' </ribbon>'#13#10+
'</customUI>'
end;
initialization
TAutoObjectFactory.Create(ComServer, TOfficeAddInsTest, CLASS_DTExtensibility2, ciSingleInstance);
end.
Rem =========== Ap dung cho Delphi
Public Function GetXML_Delphi(ByRef GTri As Boolean, ByVal mTHop As Byte) As String
Rem Luu trong Sub ExportXML Module Code_In_Ribbon_help Ap dung cho Xuat XML Cho Delphi
Dim a As Long, b As Long, c As Long, s As String, Arrs, Arrd(1 To 10000)
Arrs = mArr(1, mTHop) 'Sheet1.Range("A3:AZ" & Sheet1.Cells(&H100000, 1).End(xlUp).Row).Value
a = 0
a = a + 1: Arrd(a) = "<customUI xmlns=""http://schemas.microsoft.com/office/2006/01/customui""" & _
IIf(mTHop > 1, " onLoad= ""onLoad""", "") & ">"
a = a + 1: Arrd(a) = "<ribbon startFromScratch=""false"">"
a = a + 1: Arrd(a) = " <tabs>" & IIf((mTHop = 1 Or mTHop = 3), "", vbNewLine & _
" <!-- Doan nay dung de an Tab he thong-->" & vbNewLine & _
" <tab idMso=""TabHome"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabInsert"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabPageLayoutExcel"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabFormulas"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabData"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabReview"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabView"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabDeveloper"" getVisible=""getVisible""/>" & vbNewLine & _
" <tab idMso=""TabAddIns"" getVisible=""getVisible""/>") '' & vbNewLine
For b = RwStar + 2 To UBound(Arrs, 1)
If Len(LTrim(Arrs(b, 1))) > 0 Then
s = Space(Get_Str(Arrs(b, 1)) + 6)
If LTrim(Arrs(b, 1)) Like "End *" Then
s = s & Replace(LTrim(Arrs(b, 1)), "End ", "</") & ">"
Else
s = s & "<" & LTrim(Arrs(b, 1))
For c = 2 To UBound(Arrs, 2)
If Len(Arrs(b, c)) > 0 Then
s = s & get_XXX(Arrs, b, c, mTHop)
End If
Next
If " item " Like "* " & LTrim(Arrs(b, 1)) & " *" And (mTHop = 3 Or mTHop = 4) Then
If Not IsEmpty(Sheet1.Cells(b, xlabel)) Then s = s & " label=""" & Sheet1.Cells(b, xlabel) & """"
If Not IsEmpty(Sheet1.Cells(b, xscreentip)) Then s = s & " screentip=""" & Sheet1.Cells(b, xscreentip) & """"
If Not IsEmpty(Sheet1.Cells(b, xsupertip)) Then s = s & " supertip=""" & Sheet1.Cells(b, xsupertip) & """"
End If
s = s & IIf(" box buttonGroup comboBox dialogBoxLauncher dropDown group menu splitButton tab " Like "* " & LTrim(Arrs(b, 1)) & " *", ">", "/" & ">")
End If
If Len(Arrs(b, ximage)) > 0 Then s = s & "<!--" & Arrs(b, ximage) & "-->"
a = a + 1: Arrd(a) = s
End If
Next
a = a + 1: Arrd(a) = " </tabs>"
a = a + 1: Arrd(a) = " </ribbon>"
a = a + 1: Arrd(a) = "</customUI>"
For b = 1 To a
GetXML_Delphi = GetXML_Delphi & vbNewLine & "'" & Arrd(b)
Next
GetXML_Delphi = RibbonTV(Mid(GetXML_Delphi, 3))
GetXML_Delphi = Replace(GetXML_Delphi, vbNewLine, "'#13#10 +" & vbNewLine)
GetXML_Delphi = "result := " & GetXML_Delphi '17h32 them cai nay
GetXML_Delphi = GetXML_Delphi & "';"
End Function
Rem =========== Chuyen doi tieng Viet co dau tren Ribbon
Private Function RibbonTV(ByVal myText As String) As String
Dim i As Long, myWord As Long
For i = 1 To Len(myText)
myWord = AscW(Mid$(myText, i, 1))
If myWord < &H80 Then
RibbonTV = RibbonTV & Chr$(myWord)
Else
RibbonTV = RibbonTV & "&#" & myWord & ";"
End If
Next i
End Function
Rem ===========
Thay vì rảnh ngồi hóng thì chuyển qua thử dò đi xem sao ... dò diết mắt sẻ sáng ra thôi àCó tài liệu XLL giúp đỡ không?
xem lại các bài trước và mã nguồn trong link bài số 1 là làm đượcHọc C API một thời gian nhưng không thay đổi các biểu tượng thanh công cụ, bất kỳ ý tưởng tốt View attachment 298580
Menu Ribbon trên Excel thì em chỉ biết viết trực tiếp trên file Excel hoặc Addin Excel bằng phần mềm Custom UI Editor!! Viết như nào thì nó nằm chết như thế luôn. Theo em hiểu, nếu dùng Delphi thì có thể tạo ra Menu Ribbon động, nghĩa là có thể cho nó xuất hiện hoặc không bằng 1 lệnh, thêm bớt Menu tùy theo lệnh mình viết.Không phải là ít mà nhiều đấy.. có điều nó chỉ dẫn bao quát theo tổng thể mà khả năng của ta chưa nhận ra thôi
trên Delphi cũng vậy nguồn Server + Client có ngay trên chính máy tính của ta khi cài chọn Samples nhưng vận dụng nó thì phải mất nhiều thời gian ngâm cứu thôi
tải file bài số 1 viết vài hàm nhỏ lẻ 1 tham số là ok... xong dò lên 2,3 hay n+1 tham số xem sao
Bài đã được tự động gộp:
xem cái Ribbon cho Excel hay nguyên bộ Office của bài số 14 là thấy... không có ai chỉ dẫn + tài liệu cả.. nhưng tôi dò ra xong kết hợp với Tân viết ra 1
Tools tự dộng tạo menu Ribbon cho nguyên bộ Office trên Delphi sử dụng ngay mã trên VBA thôi ... tìm nát Google không có ra cái thứ 2 đâu
mọi cái dò đi là ra thôi
Tôi chưa làm trên excel chứ trên Access thì tạo Ribbon menu thoải mái. Khi gọi Form hoặc Report thì có thể load Ribbon menu cho riêng từng Form/ Report, kể cả menu nút chuột phải.Menu Ribbon trên Excel thì em chỉ biết viết trực tiếp trên file Excel hoặc Addin Excel bằng phần mềm Custom UI Editor!! Viết như nào thì nó nằm chết như thế luôn. Theo em hiểu, nếu dùng Delphi thì có thể tạo ra Menu Ribbon động, nghĩa là có thể cho nó xuất hiện hoặc không bằng 1 lệnh, thêm bớt Menu tùy theo lệnh mình viết.
Delphi thì tui không rành nhưng nhìn mã xml là biết có thể tùy biến ribbon, việc vô hiệu, ẩn hay hiện đề được hết.Menu Ribbon trên Excel thì em chỉ biết viết trực tiếp trên file Excel hoặc Addin Excel bằng phần mềm Custom UI Editor!! Viết như nào thì nó nằm chết như thế luôn. Theo em hiểu, nếu dùng Delphi thì có thể tạo ra Menu Ribbon động, nghĩa là có thể cho nó xuất hiện hoặc không bằng 1 lệnh, thêm bớt Menu tùy theo lệnh mình viết.
Delphi không biết có được không chứ C# hơi bị ngon về các sự kiện.ai có ví dụ về bắt sự kiện trong excel không ta ?
Excel vẫn làm được mấy chuyện đó, tùy biến là do người dùng mà. Vô hiệu, ẩn, hiện, thay đổi Caption, thay đổi trạng thái (CheckBox, item, menu chuột phải...) đều làm được tất.Tôi chưa làm trên excel chứ trên Access thì tạo Ribbon menu thoải mái. Khi gọi Form hoặc Report thì có thể load Ribbon menu cho riêng từng Form/ Report, kể cả menu nút chuột phải.
Oh!! Vậy là em làm chưa tới nơi, học chưa hết rồi!!!!Delphi thì tui không rành nhưng nhìn mã xml là biết có thể tùy biến ribbon, việc vô hiệu, ẩn hay hiện đề được hết.