AI muốn lập trình DLL cho Excel và các loại bằng Delphi thì xem video này nhé! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,842
Được thích
10,337
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Em mới thử viết kiểu vầy nó vẫn báo lỗi ... Anh xem Em viết sai cái gì hay thiếu cái gì viết lại dùm Em với
Với tập tin ở bài #1098 thì ví dụ:
Trong Unit1
Mã:
public
    { Public declarations }
    FExcelApp: ExcelApplication;  //TExcelApplication;
end;
...
procedure TForm1.Button2Click(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
Trong uDelphiAddIn1
Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  Form1 := TForm1.Create(nil);
  supports(Application, ExcelApplication, Form1.FExcelApp);
end;

procedure TDelphiAddIn1.OnStartupComplete(var custom: PSafeArray);
begin
  Form1.Show;
end;

Đây chỉ là ví dụ thôi.
 
Upvote 0
Với tập tin ở bài #1098 thì ví dụ:
Trong Unit1
Mã:
public
    { Public declarations }
    FExcelApp: ExcelApplication;  //TExcelApplication;
end;
...
procedure TForm1.Button2Click(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
Trong uDelphiAddIn1
Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  Form1 := TForm1.Create(nil);
  supports(Application, ExcelApplication, Form1.FExcelApp);
end;

procedure TDelphiAddIn1.OnStartupComplete(var custom: PSafeArray);
begin
  Form1.Show;
end;

Đây chỉ là ví dụ thôi.
Em mới Thử Build nó lỗi dòng đó Anh
Untitled.png
 
Upvote 0
OK Tuyệt vời Anh cảm ơn Anh @batman1 ... chạy Ngon Rồi
1592836662913.png

Nó thiếu mấy cái Uses à

Trong code sau nếu Em ko muốn chạy cái Form khi load Excel mà chỉ Load ExcelApp vào thôi thì sửa lại sao Anh nhỉ
Vì Form Em cho lên Menu Ribbon khi em bấm vào đó thì nó Show lên Rồi
Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  Form1 := TForm1.Create(nil);
  supports(Application, ExcelApplication, Form1.FExcelApp);
end;

và khi thoát Excel ( Add-ins ) thì có cần Giải phóng biến như trên VBA Set x = Nothing không vào Code sau
Mã:
procedure TDelphiAddIn1.OnBeginShutdown(var custom: PSafeArray);
begin

end;
 
Lần chỉnh sửa cuối:
Upvote 0
OK Tuyệt vời Anh cảm ơn Anh @batman1 ... chạy Ngon Rồi
Nó thiếu mấy cái Uses à
Tôi không hiểu.

Trong uDelphiAddIn1 ở phần implementation có uses Unit1. Trong Unit1 có
var
Form1: TForm1;

ExcelApplication có trong Excel2010.

Thiếu gì ở đây? Thiếu Excel2010 trong uses của uDelphiAddIn1?
Trong code sau nếu Em ko muốn chạy cái Form khi load Excel mà chỉ Load ExcelApp vào thôi thì sửa lại sao Anh nhỉ
Vì Form Em cho lên Menu Ribbon khi em bấm vào đó thì nó Show lên Rồi
Tôi không hiểu ý. Nếu không muốn hiện Form thì bỏ Form1 := TForm1.Create(nil) và Form1.Show

Chỉ để lại supports(Application, ExcelApplication, FExcelApp). Và FExcelApp chuyển ra chỗ mới trong Unit1:
...
var

Form1: TForm1;
FExcelApp: ExcelApplication;
-----
Thực ra trong VBA cũng không cần Set x = Nothing. Nếu x là biến cục bộ ̣(local) thì khi ra khỏi procedure "sau cánh gà" "người ta" sẽ hủy x. Nếu x là biến toàn cục thì khi kết thúc "sau cánh gà" "người ta" sẽ hủy x.
Trong Delphi nếu đối tượng là biến cục bộ thì khi ra khỏi procedure thì compilator sẽ hủy đối tượng.
 
Lần chỉnh sửa cuối:
Upvote 0
Thiếu cái Excel2010 đó em cho vào mới chạy
 
Upvote 0
Thiếu cái Excel2010 đó em cho vào mới chạy
Tôi biết ngay mà.

Có những cái mình phải tự thêm vào uses tùy vào việc cần làm. Có những cái bạn phải tự thêm vào tùy theo code hướng dẫn của tôi đòi hỏi gì. Tôi không phải ghi ra chi tiết tới Z vì vấn đề không phải của tôi. Và người có compiler trong tay là bạn chứ không phải tôi. Bạn compile lần đầu là Delphi đã gào lên là có lỗi, và chỉ rõ vị trí lỗi. Vậy tại tao bạn không sửa mà còn đăng ký cho Excel và bỏ công viết bài #1102?
 
Upvote 0
Tôi biết ngay mà.

Có những cái mình phải tự thêm vào uses tùy vào việc cần làm. Có những cái bạn phải tự thêm vào tùy theo code hướng dẫn của tôi đòi hỏi gì. Tôi không phải ghi ra chi tiết tới Z vì vấn đề không phải của tôi. Và người có compiler trong tay là bạn chứ không phải tôi. Bạn compile lần đầu là Delphi đã gào lên là có lỗi, và chỉ rõ vị trí lỗi. Vậy tại tao bạn không sửa mà còn đăng ký cho Excel và bỏ công viết bài #1102?
Không biết Em làm sai cái gì hay khai báo thiếu cái gì khi Em tạo 1 cái Form mới Em bỏ nó chạy khi Excel Load chỉ thực hiện khi bấm trên Menu mà nó không có chạy và không báo lỗi

Anh chỉ dùm Em khai báo lại , viết lại code sao mà sử dụng chung cho nhiều cái Form khi em gọi nó trên menu Excel

Code trong TDelphiAddIn1.OnConnection
Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  supports(Application, ExcelApplication)//Thiếu hay sai cái gì ở khúc này
end;

Code trên Form không chạy mà cũng ko báo lỗi
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
Cảm ơn Anh
 
Lần chỉnh sửa cuối:
Upvote 0
(*) Lưu ý khi viết COM Add-in
Việc khởi tạo Excel không được tự tạo mới nếu không có nhu cầu tách biệt (new instance). Hãy kết nối với tham số Application truyền vào từ sự kiện OnConnection(Application,...). Có nghĩa là biến FExcelApp không khai báo trong Form mà khai báo public - không nằm trong class mà nằm trong nhánh INTERFACE.

1. Cách kết nối với ứng dụng Excel khi chạy như sau

unit AddinConnect;

Inteface
uses ...

Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectTo(_Application(Application));
end;

2. Giải phóng biến FExcelApp khi thoát Excel và add-in

Mã:
procedure TDelphiAddIn1.OnDisconnection(RemoveMode: ext_DisconnectMode;
  var custom: PSafeArray);
begin
  if Assigned(FExcelApp) then
     FExcelApp.Free;// hoặc FreeAndNil(FExcelApp);
end;

Với cách làm như trên thì biên FExcepApp là đầu mối làm việc với Excel gọi nó. Khai báo cũ mà khởi tạo Excel trong Form là ví dụ mà tôi làm trong video trên là khi viết ứng dụng chạy độc lập (EXE). Vậy nên khi viết add-in thì không được viết như thế này nữa

Mã:
procedure TForm2.FormCreate(Sender: TObject);
begin
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectKind := ckNewInstance;
  FExcelApp.Connect;
end;

Hai Lúa, Kiều Mạnh và các bạn chú ý nhé.
 
Lần chỉnh sửa cuối:
Upvote 0
(*) Lưu ý khi viết COM Add-in
Việc khởi tạo Excel không được tự tạo mới nếu không có nhu cầu tách biệt (new instance). Hãy kết nối với tham số Application truyền vào từ sự kiện OnConnection(Application,...). Có nghĩa là biến FExcelApp không khai báo trong Form mà khai báo public - không nằm trong class mà nằm trong nhánh INTERFACE.

1. Cách kết nối với ứng dụng Excel khi chạy như sau

unit AddinConnect;

Inteface
uses ...

Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectTo(_Application(Application));
end;

2. Giải phóng biến FExcelApp khi thoát Excel và add-in

Mã:
procedure TDelphiAddIn1.OnDisconnection(RemoveMode: ext_DisconnectMode;
  var custom: PSafeArray);
begin
  if Assigned(FExcelApp) then
     FExcelApp.Free;// hoặc FreeAndNil(FExcelApp);
end;

Với cách làm như trên thì biên FExcepApp là đầu mối làm việc với Excel gọi nó. Khai báo cũ mà khởi tạo Excel trong Form là ví dụ mà tôi làm trong video trên là khi viết ứng dụng chạy độc lập (EXE). Vậy nên khi viết add-in thì không được viết như thế này nữa

Mã:
procedure TForm2.FormCreate(Sender: TObject);
begin
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectKind := ckNewInstance;
  FExcelApp.Connect;
end;

Hai Lúa, Kiều Mạnh và các bạn chú ý nhé.
Mạnh đang kẹt code trên Form mỗi lần nó Show ra mà ko chạy code ...
Mạnh tạo 1 cái Form xong Từ Menu Ribbon Excel bấm nó Show lên mỗi lần khi có nhu cầu mà khai báo sao nó không có chạy code sau:
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;

Toàn bộ code trên Form
Mã:
interface

uses
  System.Win.ComObj,
  Vcl.Buttons,
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms,
  Vcl.Dialogs, Excel2010, Vcl.OleServer,
  Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    DBRadioGroup1: TDBRadioGroup;
    DBListBox1: TDBListBox;
    Edit1: TEdit;
    GetRange: TButton;
    Label1: TLabel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure GetRangeClick(Sender: TObject);
  private
    { Private declarations }
    FExcelApp: TExcelApplication; // Uses Excel2010
  public
    { Public declarations }
    //FExcelApp: ExcelApplication; // TExcelApplication; khai báo sử dụng ExcelApp
  end;

  { var
    Form1: TForm1; code Delphi tao ra }
  { Khai bao cac bien su dung Cho Form }
procedure ShowForm;
var
  Form1: TForm1;
  f: TForm1; // Su dung Form

implementation

{$R *.dfm}

procedure ShowForm;
begin
  f := TForm1.Create(nil);
  try
    // f.Show; //.ShowModal;
    f.ShowModal;
  finally
    f.free
  end;
end;

procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;

Chỉnh sửa dùm Mạnh làm sao mỗi khi bấm Form Show lên là xài code Check Sheetname Ok
 
Upvote 0
Kiều Mạnh: bạn đang viết add-in hay EXE ?
 
Upvote 0
Upvote 0
Bạn đọc kỹ bài mình viết #1109 . Đưa đoạn code full trong Unit có sự kiện "OnConnection" đã sửa của bạn lên, chụp màn hình báo lỗi nhé.
code nó như sau ... chạy ko báo lỗi chỉ dùm Mạnh
Mã:
unit CustomUI;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Winapi.windows,
  Winapi.Messages,
  Vcl.Graphics,
  Vcl.oleServer,
  Vcl.stdctrls,
  Vcl.controls,
  Vcl.forms,
  System.Win.ComObj,
  Winapi.ActiveX,
  VBLibrary_TLB,
  System.Win.StdVcl,
  Vcl.Dialogs,
  System.Variants,
  AddInDesignerObjects_TLB,
  System.Classes,
  System.SysUtils,
  Office2010;

type
  TXLComAddinFactory = class(TAutoObjectFactory)
    procedure UpdateRegistry(Register: Boolean); override;
  end;

  TCoMultipleUIThreadsDemo = class(TAutoObject, ICoMultipleUIThreadsDemo,
    IDTExtensibility2, IRibbonExtensibility)
  private
    procedure OnConnection(const Application: IDispatch;
      ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
      var custom: PSafeArray); safecall;
    procedure OnDisconnection(RemoveMode: ext_DisconnectMode;
      var custom: PSafeArray); safecall;
    procedure OnAddInsUpdate(var custom: PSafeArray); safecall;
    procedure OnStartupComplete(var custom: PSafeArray); safecall;
    procedure OnBeginShutdown(var custom: PSafeArray); safecall;
    { IRibbonExtensibility }
    function GetCustomUI(const RibbonID: WideString): WideString; safecall;
  protected
    procedure ShowModelessForm(const Control: IDispatch); safecall;
    procedure Server(const Control: IDispatch); safecall;
    procedure SQLServer(const Control: IDispatch); safecall;
    procedure Client(const Control: IDispatch); safecall;
    procedure Help(const Control: IDispatch); safecall;
  end;

implementation

uses
  System.Win.ComServ,
  SQLDatabaseOffice,
  ExcelXP,
  Office2010,
  System.Win.Registry;

var
  FExcelApp: TExcelApplication;
  { TCoMultipleUIThreadsDemo }

function TCoMultipleUIThreadsDemo.GetCustomUI(const RibbonID: WideString)
  : WideString;
begin
  result := '<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">'#13#10
    + '<ribbon startFromScratch="false">'#13#10 + '    <tabs>'#13#10 +
    '      <tab id="NetworkTCPIP" label="ExcelTools">'#13#10 +
    '        <group id="GROU1" label="Access And Excel">'#13#10 +
    '          <button id="GetDatabase" onAction="ShowModelessForm" size="large" imageMso="ImportMoreMenu" label="SQL String Database" screentip="T&#249;y Ch&#7885;n L&#7845;y D&#7919; Li&#7879;u" supertip="Access V&#224; Excel"/>'#13#10
    + '        </group>'#13#10 +
    '        <group id="GROU3" label="Windows">'#13#10 +
    '          <button id="SQLServer" onAction="SQLServer" size="large" imageMso="ViewsAdpDiagramSqlView" label="Server Databases&#8203;" screentip="L&#7845;y D&#7919; Li&#7879;u T&#7915; Server" supertip="SQL Server"/>'#13#10
    + '        </group>'#13#10 +
    '        <group id="GROU2" label="Network - TCPIP">'#13#10 +
    '          <button id="Server" onAction="Server" size="large" imageMso="RemoveDuplicates" label="Server" screentip="NetworkTCPIP - Server" supertip="L&#7845;y D&#7919; Li&#7879;u Ph&#432;&#417;ng Th&#7913;c TCPIP"/>'#13#10
    + '          <separator id="SEPA1"/>'#13#10 +
    '          <button id="Client" onAction="Client" size="large" imageMso="MeetingsWorkspace" label="Client" screentip="NetworkTCPIP - Client" supertip="L&#7845;y D&#7919; Li&#7879;u Ph&#432;&#417;ng Th&#7913;c TCPIP"/>'#13#10
    + '        </group>'#13#10 +
    '        <group id="GROU4" label="About Excel Tools">'#13#10 +
    '          <button id="Help" onAction="Help" size="large" imageMso="FunctionsLogicalInsertGallery" label="Help" screentip="H&#7893; Tr&#7907;" supertip="S&#7917; D&#7909;ng Tr&#432;&#417;ng Tr&#236;nh"/>'#13#10
    + '          <separator id="SEPA2"/>'#13#10 +
    '          <labelControl id="LABE2" label="Author"/>'#13#10 +
    '          <labelControl id="LABE3" label="Phone"/>'#13#10 +
    '          <labelControl id="LABE4" label="Email"/>'#13#10 +
    '          <labelControl id="LABE5" label=": Ki&#7873;u M&#7841;nh"/>'#13#10
    + '          <labelControl id="LABE6" label=": 0929 555 666 - 0922 366 377"/>'#13#10
    + '          <labelControl id="LABE1" label=": kieumanh366377@gmail com"/>'#13#10
    + '        </group>'#13#10 + '      </tab>'#13#10 + '    </tabs>'#13#10 +
    '  </ribbon>'#13#10 + '</customUI>';

end;

procedure TCoMultipleUIThreadsDemo.OnAddInsUpdate(var custom: PSafeArray);
begin

end;

procedure TCoMultipleUIThreadsDemo.OnBeginShutdown(var custom: PSafeArray);
begin

end;

procedure TCoMultipleUIThreadsDemo.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
var
  // FExcelApp: ExcelApplication;
  FExcelApp: TExcelApplication;
begin
  // Form1 := TForm1.Create(nil); // Bỏ Show From Khi Excel Load
  // supports(Application, ExcelApplication, Form1.FExcelApp);
  // tren chay Ok
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectTo(_Application(Application));
end;

procedure TCoMultipleUIThreadsDemo.OnDisconnection
  (RemoveMode: ext_DisconnectMode; var custom: PSafeArray);
var
  // FExcelApp: ExcelApplication;
  FExcelApp: TExcelApplication;
begin
  if Assigned(FExcelApp) then
    FExcelApp.Free; // hoặc FreeAndNil(FExcelApp);
end;

procedure TCoMultipleUIThreadsDemo.OnStartupComplete(var custom: PSafeArray);
begin
  Form1.Show; // bỏ trên OnConnection  thi dòng này mất tác dụng
end;

{ TXLComAddinFactory }

procedure TXLComAddinFactory.UpdateRegistry(Register: Boolean);
var
  RootKey: HKEY;
  AddInKey: string;
  r: TRegistry;
begin
  RootKey := HKEY_CURRENT_USER;
  AddInKey := 'Software\Microsoft\Office\Excel\Addins\' + ProgID;
  r := TRegistry.Create;
  r.RootKey := RootKey;
  try
    if Register then
      if r.OpenKey(AddInKey, True) then
      begin
        r.WriteInteger('LoadBehavior', 3);
        r.WriteInteger('CommandLineSafe', 0);
        r.WriteString('FriendlyName', 'VBLibrary Excel Add-Ins');
        r.WriteString('Description', 'Code By Kieu Manh');
        r.CloseKey;
      end
      else
        raise EOleError.Create('Can''t register Add-In ' + ProgID)
    else if r.KeyExists(AddInKey) then
      r.DeleteKey(AddInKey);
  finally
    r.Free;
  end;
  inherited;
end;

procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
begin // onAction="ShowModelessForm" //gán Sub vao dây
  // ShowMessage('SQL String ... Thực hiện sau');
  ShowForm; { gọi Form SQLDatabaseOffice }
end;

procedure TCoMultipleUIThreadsDemo.Server(const Control: IDispatch);
Var // onAction="Server" //gán Sub vao dây
  Range: OleVariant;
  ExcelApp: Variant;
  XlVersion: Integer;
begin
  try
    ExcelApp := GetActiveOleObject('Excel.Application');
  except
    try
      ShowMessage('Excel not already open create a Excel Object');
      { If no instance of Word is running, try to Create a new Word Object }
      ExcelApp := CreateOleObject('Excel.Application');
      XlVersion := Trunc(ExcelApp.Application.Version);
      ShowMessage(IntToStr(XlVersion));
    except
      ShowMessage('Cannot start Excel/Excel not installed ?');
      Exit;
    end;
    ExcelApp := Unassigned;
  end;
end;
procedure TCoMultipleUIThreadsDemo.SQLServer(const Control: IDispatch);
begin // onAction="SQLServer" //gán Sub vao dây
  ShowMessage('SQLServer ... Thực hiện sau');
end;

procedure TCoMultipleUIThreadsDemo.Client(const Control: IDispatch);
begin // onAction="Client" //gán Sub vao dây
  ShowMessage('Client ... Thực hiện sau');
end;

procedure TCoMultipleUIThreadsDemo.Help(const Control: IDispatch);

begin // onAction="Help" //gán Sub vao dây
  ShowMessage('Help ... Thực hiện sau');
end;

initialization

TXLComAddinFactory.Create(ComServer, TCoMultipleUIThreadsDemo,
  Class_CoMultipleUIThreadsDemo, ciMultiInstance, tmApartment);

end.

Muốn khai báo Unit đó với Trên Form sao Mỗi khi có nhu cầu Mở Form lên là chạy ok Check SheetName và gán dữ liệu xuống Cells
 
Upvote 0
Kiều Mạnh: Hai sự kiện dưới đây không được khai báo FExxcelApp nữa vì đã khai báo public trên Interface rồi.

Mã:
procedure TCoMultipleUIThreadsDemo.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
var
  //FExcelApp: TExcelApplication; ==>Xóa đi
begin
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectTo(_Application(Application));
end;

procedure TCoMultipleUIThreadsDemo.OnDisconnection
  (RemoveMode: ext_DisconnectMode; var custom: PSafeArray);
var
  //FExcelApp: TExcelApplication; ==>Xóa đi
begin
  if Assigned(FExcelApp) then
    FExcelApp.Free; // hoặc FreeAndNil(FExcelApp);
end;
 
Upvote 0
Kiều Mạnh: Hai sự kiện dưới đây không được khai báo FExxcelApp nữa vì đã khai báo public trên Interface rồi.

Mã:
procedure TCoMultipleUIThreadsDemo.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
var
  //FExcelApp: TExcelApplication; ==>Xóa đi
begin
  FExcelApp := TExcelApplication.Create(nil);
  FExcelApp.ConnectTo(_Application(Application));
end;

procedure TCoMultipleUIThreadsDemo.OnDisconnection
  (RemoveMode: ext_DisconnectMode; var custom: PSafeArray);
var
  //FExcelApp: TExcelApplication; ==>Xóa đi
begin
  if Assigned(FExcelApp) then
    FExcelApp.Free; // hoặc FreeAndNil(FExcelApp);
end;
Vậy code trên Form mình viết như sau nó sai cái gì mà nó ko có chạy mỗi khi Bấm Show Form lên ... sửa dùm Mình
Mã:
interface

uses
  System.Win.ComObj,
  Vcl.Buttons,
  CustomUI,
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms,
  Vcl.Dialogs, Excel2010, Vcl.OleServer,
  Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    DBRadioGroup1: TDBRadioGroup;
    DBListBox1: TDBListBox;
    Edit1: TEdit;
    GetRange: TButton;
    Label1: TLabel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure GetRangeClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FExcelApp: TExcelApplication; // Uses Excel2010
  public
    { Public declarations }
    //FExcelApp: ExcelApplication; // TExcelApplication; khai báo sử dụng ExcelApp
  end;

  { var
    Form1: TForm1; code Delphi tao ra }
  { Khai bao cac bien su dung Cho Form }
procedure ShowForm;
var
  Form1: TForm1;
  f: TForm1; // Su dung Form

implementation

{$R *.dfm}

procedure ShowForm;
begin
  f := TForm1.Create(nil);
  try
    // f.Show; //.ShowModal;
    f.ShowModal;
  finally
    f.free
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
 
Upvote 0
Vậy code trên Form mình viết như sau nó sai cái gì mà nó ko có chạy mỗi khi Bấm Show Form lên ... sửa dùm Mình
Mã:
interface

uses
  System.Win.ComObj,
  Vcl.Buttons,
  CustomUI,
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms,
  Vcl.Dialogs, Excel2010, Vcl.OleServer,
  Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    DBRadioGroup1: TDBRadioGroup;
    DBListBox1: TDBListBox;
    Edit1: TEdit;
    GetRange: TButton;
    Label1: TLabel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure GetRangeClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FExcelApp: TExcelApplication; // Uses Excel2010
  public
    { Public declarations }
    //FExcelApp: ExcelApplication; // TExcelApplication; khai báo sử dụng ExcelApp
  end;

  { var
    Form1: TForm1; code Delphi tao ra }
  { Khai bao cac bien su dung Cho Form }
procedure ShowForm;
var
  Form1: TForm1;
  f: TForm1; // Su dung Form

implementation

Lại thừa khai báo FExcelApp trong class. Cái này mình đã nói kỹ ở bài #1109 rồi mà. BỎ KHAI BÁO FEXCELAPP ở tất cả các nơi, chỉ để duy nhất một lần khai báo public trong unit nhÁnh INTERFACE. Lắm bệnh quá :)

interface

uses
System.Win.ComObj,
Vcl.Buttons,
CustomUI,
Winapi.Windows, Winapi.Messages,
System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms,
Vcl.Dialogs, Excel2010, Vcl.OleServer,
Vcl.ComCtrls, Vcl.StdCtrls,
Vcl.DBCtrls, Vcl.ExtCtrls;

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
SpeedButton1: TSpeedButton;
DBRadioGroup1: TDBRadioGroup;
DBListBox1: TDBListBox;
Edit1: TEdit;
GetRange: TButton;
Label1: TLabel;
procedure SpeedButton1Click(Sender: TObject);
procedure GetRangeClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FExcelApp: TExcelApplication; // XÓA ĐI!!!!
public
{ Public declarations }
//FExcelApp: ExcelApplication; // TExcelApplication; khai báo sử dụng ExcelApp
end;

{ var
Form1: TForm1; code Delphi tao ra }
{ Khai bao cac bien su dung Cho Form }
procedure ShowForm;
var
Form1: TForm1;
f: TForm1; // Su dung Form

implementation

{$R *.dfm}


end;
 
Upvote 0
Lại thừa khai báo FExcelApp trong class. Cái này mình đã nói kỹ ở bài #1109 rồi mà. BỎ KHAI BÁO FEXCELAPP ở tất cả các nơi, chỉ để duy nhất một lần khai báo public trong unit nhÁnh INTERFACE. Lắm bệnh quá :)

interface

uses
System.Win.ComObj,
Vcl.Buttons,
CustomUI,
Winapi.Windows, Winapi.Messages,
System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms,
Vcl.Dialogs, Excel2010, Vcl.OleServer,
Vcl.ComCtrls, Vcl.StdCtrls,
Vcl.DBCtrls, Vcl.ExtCtrls;

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
SpeedButton1: TSpeedButton;
DBRadioGroup1: TDBRadioGroup;
DBListBox1: TDBListBox;
Edit1: TEdit;
GetRange: TButton;
Label1: TLabel;
procedure SpeedButton1Click(Sender: TObject);
procedure GetRangeClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FExcelApp: TExcelApplication; // XÓA ĐI!!!!
public
{ Public declarations }
//FExcelApp: ExcelApplication; // TExcelApplication; khai báo sử dụng ExcelApp
end;

{ var
Form1: TForm1; code Delphi tao ra }
{ Khai bao cac bien su dung Cho Form }
procedure ShowForm;
var
Form1: TForm1;
f: TForm1; // Su dung Form

implementation

{$R *.dfm}


end;
xóa đi nó báo lỗi
1592885079032.png
thiếu khai báo ở đâu đó mà mình chưa hình dung ra
 
Upvote 0
Upvote 0
Khai báo chung vào form có được ko
Được nhưng nó tối. Moitj add-in sẽ có nhiều form làm nhiều phần việc, các form đều dùng đến FExcelApp nên biến này nên nằm ở một unit riêng chứ không khai báo trong một form nào sẽ sáng phạm vi.
 
Upvote 0
Được nhưng nó tối. Moitj add-in sẽ có nhiều form làm nhiều phần việc, các form đều dùng đến FExcelApp nên biến này nên nằm ở một unit riêng chứ không khai báo trong một form nào sẽ sáng phạm vi.
chịu sáng tới giờ mò chưa ra cách khai báo sử dụng cho nhiều Form khi có nhu cầu Show Form lên là check Sheetnam và gán xuống Cells OK
 
Upvote 0
Upvote 0
Không biết Em làm sai cái gì hay khai báo thiếu cái gì khi Em tạo 1 cái Form mới Em bỏ nó chạy khi Excel Load chỉ thực hiện khi bấm trên Menu mà nó không có chạy và không báo lỗi

Anh chỉ dùm Em khai báo lại , viết lại code sao mà sử dụng chung cho nhiều cái Form khi em gọi nó trên menu Excel

Code trong TDelphiAddIn1.OnConnection
Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  supports(Application, ExcelApplication)//Thiếu hay sai cái gì ở khúc này
end;
1. Bạn không đọc kỹ bài 1104 của tôi.
2. Nếu bạn tìm và xem supports thì sẽ thấy thiếu cái gì.
Code trên Form không chạy mà cũng ko báo lỗi
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
Cảm ơn Anh
Báo lỗi gì nữa bạn? Bạn đọc code mà không không hiểu à? FExcelApp = nil, vậy Assigned(FExcelApp) = FALSE, vậy thì cụm code trong IF không được thực hiện. Báo lỗi gì ở đây?

Tôi cho vd. trong VBA cho gần với bạn.
Mã:
Sub test()
Dim a As Double, rng As Range
    If Not rng Is Nothing Then
        a = 3 / 0
        MsgBox "Ngay mai em di"
    End If
End Sub
Bạn có thấy code trong cụm IF thực hiện không? Rõ ràng không vì không thấy thông báo "Ngay mai em di". Có thấy báo lỗi không, vì có phép chia cho số 0. Rõ ràng là không. Tại sao? Bởi rng = Nothing nên biểu thức (Not rng Is Nothing) trả về FALSE và cụm IF không được thực hiện. Báo lỗi gì ở đây?
 
Upvote 0
Mạnh đang kẹt code trên Form mỗi lần nó Show ra mà ko chạy code ...
Mạnh tạo 1 cái Form xong Từ Menu Ribbon Excel bấm nó Show lên mỗi lần khi có nhu cầu mà khai báo sao nó không có chạy code sau:
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;

Toàn bộ code trên Form
Mã:
interface

uses
  System.Win.ComObj,
  Vcl.Buttons,
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms,
  Vcl.Dialogs, Excel2010, Vcl.OleServer,
  Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    DBRadioGroup1: TDBRadioGroup;
    DBListBox1: TDBListBox;
    Edit1: TEdit;
    GetRange: TButton;
    Label1: TLabel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure GetRangeClick(Sender: TObject);
  private
    { Private declarations }
    FExcelApp: TExcelApplication; // Uses Excel2010
  public
    { Public declarations }
    //FExcelApp: ExcelApplication; // TExcelApplication; khai báo sử dụng ExcelApp
  end;

  { var
    Form1: TForm1; code Delphi tao ra }
  { Khai bao cac bien su dung Cho Form }
procedure ShowForm;
var
  Form1: TForm1;
  f: TForm1; // Su dung Form

implementation

{$R *.dfm}

procedure ShowForm;
begin
  f := TForm1.Create(nil);
  try
    // f.Show; //.ShowModal;
    f.ShowModal;
  finally
    f.free
  end;
end;

procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;

Chỉnh sửa dùm Mạnh làm sao mỗi khi bấm Form Show lên là xài code Check Sheetname Ok
Ở bài 1104 tôi chỉ rõ cho bạn nơi cần chuyển FExcelApp
Và FExcelApp chuyển ra chỗ mới trong Unit1:
...
var

Form1: TForm1;
FExcelApp: ExcelApplication;
Tất nhiên không khai báo FExcelApp ở Unit1 mà ở unit khác cũng được. Và tất nhiên phải khai báo trong phần interface thì biến mới được"nhìn thấy" từ các unit khác. Khai báo ở phần implementation thì chỉ dùng được trong unit mà biến được khai báo mà thôi.

Nếu bạn đọc kỹ bài 1104 thì một loạt bài sau đó trong chủ đề này là không cần thiết.
Không ai chỉ bảo chi tiết cho bạn cho tới tận khi tôi chỉ ra cho bạn. Tôi là người chỉ bảo cho bạn. Nhưng bạn không chịu đoc kỹ và làm theo. Để rồi đẻ ra hàng loạt bài không cần thiết.


Mà đã có khai báo sẵn Form1: TForm1. Vậy thì khai báo f: TForm1 để làm gì?
 
Lần chỉnh sửa cuối:
Upvote 0
1. Bạn không đọc kỹ bài 1104 của tôi.
2. Nếu bạn tìm và xem supports thì sẽ thấy thiếu cái gì.

Báo lỗi gì nữa bạn? Bạn đọc code mà không không hiểu à? FExcelApp = nil, vậy Assigned(FExcelApp) = FALSE, vậy thì cụm code trong IF không được thực hiện. Báo lỗi gì ở đây?

Tôi cho vd. trong VBA cho gần với bạn.
Mã:
Sub test()
Dim a As Double, rng As Range
    If Not rng Is Nothing Then
        a = 3 / 0
        MsgBox "Ngay mai em di"
    End If
End Sub
Bạn có thấy code trong cụm IF thực hiện không? Rõ ràng không vì không thấy thông báo "Ngay mai em di". Có thấy báo lỗi không, vì có phép chia cho số 0. Rõ ràng là không. Tại sao? Bởi rng = Nothing nên biểu thức (Not rng Is Nothing) trả về FALSE và cụm IF không được thực hiện. Báo lỗi gì ở đây?
Khổ lắm Em đọc tới xong lại đọc lùi xong đọc từ dưới lên trên ...
Trình của Em còn kém nên chưa có hiểu đó Anh !!!

Với lại tự mò học là chính nên khúc biết khúc ko ... nên vẫn đang chịu thua Anh à
Ngày Qua Anh chỉ cái đó thì Ok Rồi ... Giờ Em muốn tạo nhiều cái Form và mở nó lên khi cần trên Menu Excel chạy nó mà không biết viết sao đó Anh

Em mò hoài 1 ngày nào đó sẻ ra thôi ... nhưng rất lâu đó ... Anh giúp Em chút thì sẻ rất nhanh
 
Lần chỉnh sửa cuối:
Upvote 0
VD như code sau xxxx Em cứ nghĩ như trên VBA thích cho chỗ nào trả được ... Mình viết đúng sao Delphi nó cứ keo sai ... Tìm hoài ko thấy vô tình copy lên trên thì nó ok... xong Em lại thử copy xuông dưới xem sao thì Delphi nó la lên đó Anh ...
Mã:
procedure TCoMultipleUIThreadsDemo.SQLServer(const Control: IDispatch);
begin
  xxxx
end;

procedure xxxx
Cuối cùng hóa ra Dephi nó bắt phải có trên xong mới có dưới là vậy .... thật mà hài ghê đó -0-0-0-
 
Upvote 0
Khổ lắm Em đọc tới xong lại đọc lùi xong đọc từ dưới lên trên ...
Trình của Em còn kém nên chưa có hiểu đó Anh !!!

Với lại tự mò học là chính nên khúc biết khúc ko ... nên vẫn đang chịu thua Anh à
Ngày Qua Anh chỉ cái đó thì Ok Rồi ... Giờ Em muốn tạo nhiều cái Form và mở nó lên khi cần trên Menu Excel chạy nó mà không biết viết sao đó Anh

Em mò hoài 1 ngày nào đó sẻ ra thôi ... nhưng rất lâu đó ... Anh giúp Em chút thì sẻ rất nhanh
Tôi không hiểu ý bạn. Ở bài 1101 thì Form1 được tạo ra trong OnConnection (do FExcelApp cần dùng trong SUPPORTS - bài 1104, mà FExcelApp lại là trường trong class TFrom1 như code của bạn)
Mã:
Form1 := TForm1.Create(nil);
và được hiển thị trong OnStartupComplete
Mã:
Form1.Show;
Nếu như ở bài tiếp theo 1004 FExcelApp được khai báo như biến toàn cục thì cả tạo Form1 và hiển thị nó đều có thể hoặc làm ở OnStartupComplete, hoặc làm khi chọn menu.

Bây giờ bạn muốn tạo và hiển thị khi chọn menu thì 2 việc trên làm khi chọn menu thôi. Nhưng muốn tiếp theo tương tác với bảng tính Excel thì phải có đối tượng Application. Với mục đích này thì ta dùng FExcelApp và code SUPPORTS(...) trong OnConnection như bài 1101. Khi server COM của bạn kết nối với server Excel thì Application: IDispatch trong OnConnection chính là đối tượng Application. Chỉ cần ghi nhớ nó vào FExcelApp để dùng về sau. Bởi cho tới tận khi hết kết nối thì FExcelApp luôn luôn là đối tượng Application.

Bạn nói nhiều cái bạn không biết, nhưng những cái bạn không biết nó lại là kiến thức cơ bản. Tìm kiếm (Find ..., Find in Files ...), khai báo các unit, tầm vực của biến, tự thêm các unit cần thiết ... là Delphi cơ bản. Server COM là Delphi nâng cao, thậm chí nâng rất cao. Bạn làm server COM mà vẫn chưa nắm vững Delphi cơ bản?

Thôi, tôi dừng ở đây. Những thông tin bạn cần tôi đã cung cấp trong các bài của mình. Chỉ cần đọc kỹ và làm theo. Mà từ các bài viết của bạn thì tôi thấy bạn không đọc kỹ các bài của tôi và làm theo.
 
Lần chỉnh sửa cuối:
Upvote 0
Ở bài 1101 thì Form1 ... là code nguyên Mẫu gốc của tây Em đưa lên cho HLMT tham khảo đó ... chứ không phải ý em muôn cái Form nó load khi mở Excel
Ý Em là tạo nhiều Form xong Từ menu Excel Gọi nó lên Khi cần thôi ... Em đang kẹt khai báo Sử dụng sao cho Từng Form mở nó lên khi cần xong thoát hoặc mở lại
 
Upvote 0
Ở bài 1101 thì Form1 ... là code nguyên Mẫu gốc của tây Em đưa lên cho HLMT tham khảo đó ... chứ không phải ý em muôn cái Form nó load khi mở Excel
Thì chính vì thế mà khi đưa code tôi nhấn mạnh là đó chỉ là ví dụ. Bạn phải biết biến tấu, chứ tôi làm sao có thể đoán ý hiện tại và tương lai của bạn được. Lôgíc chỉ có một. Không làm trong OnStartupComplete thì làm khi chọn menu. Tùy theo nhu cầu của mình mà biến tấu thôi.

Trong VBA tôi cho ví dụ gọi Sub A() trong UserForm_Initialize, còn bạn muốn gọi trong CommandButton1_Click() thì sao? Thì gọi trong CommandButton1_Click và trong UserForm_Initialize không gọi chứ sao.

Mà thôi, tôi đã nói là tôi dừng rồi.
 
Upvote 0
Thì chính vì thế mà khi đưa code tôi nhấn mạnh là đó chỉ là ví dụ. Bạn phải biết biến tấu, chứ tôi làm sao có thể đoán ý hiện tại và tương lai của bạn được. Lôgíc chỉ có một. Không làm trong OnStartupComplete thì làm khi chọn menu. Tùy theo nhu cầu của mình mà biến tấu thôi.

Trong VBA tôi cho ví dụ gọi Sub A() trong UserForm_Initialize, còn bạn muốn gọi trong CommandButton1_Click() thì sao? Thì gọi trong CommandButton1_Click và trong UserForm_Initialize không gọi chứ sao.

Mà thôi, tôi đã nói là tôi dừng rồi.
Cảm Ơn Anh Nhiều
Em mới làm xong Rùi ... Em chậm tiếp thu chút à chứ ko phải là ko đọc kỹ bài của Anh và ko đọc help.... Help cà chua lắm nếu cứ đọc help mà ai cũng học được thì mấy tay đứng bục giảng thất nghiệp hết :D

Em mò cái Hàm supports Anh viết xem nó là cái chi thì Em mới Biết đó

Vậy là logis em lại biết thêm Xài Hàm supports ... thật lòng mà nói VBA Em viết đủ thứ xong Anh hỏi Căn bản là Em tịt đó
Sang Delphi cũng thế vì em có được học hành bài bản chi mô .... Vóc diết xong mới hệ thống lại

và ngày xưa rất xưa Em còn ở Hà Nội ... cái tay giáo sư nó nói Lý luận khái quát từ thực tiễn mà ra ... và thực tiễn là nơi kiểm nghiệm lại cái lý luận đó ... Nó là 1 cặp phạm trù cơ bản của phép duy vật biện chứng ... -0-0-0-
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy là đã Xong Phần Form ... lại tiếp phần khác ... khó khăn lại nhờ các Bạn chỉ tiếp
Video sau Mới là cái Mạnh cần cho Viết Add -Ins COM Delphi cho Excel
Nó truyền tham số ExcelApp vào ngay khi mở Excel nên rất nhanh cảm giác như ngay trên Excel ... Code mã máy Nữa ko phải qua tay Phiên dịch ... đoán là sẻ nhanh hơn Code ngay trên Excel quá .... ( nếu phán sai bỏ qua he )

Eo ui vậy là Mạnh bước vào ngưỡng cửa COM COM Delphi viết Add-Ins cho Excel tạm ok rồi sao ??? -0-0-0-
 
Upvote 0
Vậy là đã Xong Phần Form ... lại tiếp phần khác ... khó khăn lại nhờ các Bạn chỉ tiếp
Video sau Mới là cái Mạnh cần cho Viết Add -Ins COM Delphi cho Excel
Nó truyền tham số ExcelApp vào ngay khi mở Excel nên rất nhanh cảm giác như ngay trên Excel ... Code mã máy Nữa ko phải qua tay Phiên dịch ... đoán là sẻ nhanh hơn Code ngay trên Excel quá .... ( nếu phán sai bỏ qua he )

Eo ui vậy là Mạnh bước vào ngưỡng cửa COM COM Delphi viết Add-Ins cho Excel tạm ok rồi sao ??? -0-0-0-
Form đằng form, còn ứng dụng Excel đằng ứng dụng Excel vậy anh?
 
Upvote 0
Form đằng form, còn ứng dụng Excel đằng ứng dụng Excel vậy anh?
chưa hiểu kịp nói gì ... chi tiết chút

Nó là Add-ins COM đó thích nhập bất cứ File Excel nào mở lên nó lấy ActiveSheet của File đó xong nhập liệu vào có như vậy mới viết SQL lấy dữ liệu gán lên Range ok được chứ
 
Upvote 0
File sau là bản Test thử của Mạnh ... COM Add-ins sử dụng cả Menu Ribbon Excel Luôn đó
To @giaiphap .... cái này viết Add-Ins hay đó Nó chỉ có 1 File DLL duy nhất và khi viết thích Build x32 or x64 trong 1 nốt nhạc
Mạnh Úp 2 bản Ai xài Office x32 thì Add COM x32
Chạy Excel.EXE chế độ Run As khi đó Windows hỏi thì chọn Yes xong Vào COM Excel Add nó vào
Untitled.png
 

File đính kèm

Upvote 0
Nếu đã chạy COM add-in tbif hãy gán biến Excel vào tham số Application trong sự kiện OnConnection nhé. Sau này không phải Create hay get Object gì cả.
Quậy diết mấy ngày hôm nay mới ngộ ra câu nói của bạn ... Nếu bạn nào mới nhập Môn Delphi mà hiểu được câu nói này chắc hack não cả năm quá
Chính xác là thế mọi cái lấy từ cái dòng tô đậm thì các Object từ Excel truyền vào Delphi như nhau nên code trên Delphi sẻ nhanh hơn trên VBA ... Vì VBA qua dịch xong mới chạy còn Delphi mã máy chạy ngay lập tức ( Mạnh phán đại thế hên trúng ... trật bỏ qua he )
Cảm ơn rất nhiều
 
Upvote 0
File sau là bản Test thử của Mạnh ... COM Add-ins sử dụng cả Menu Ribbon Excel Luôn đó
To @giaiphap .... cái này viết Add-Ins hay đó Nó chỉ có 1 File DLL duy nhất và khi viết thích Build x32 or x64 trong 1 nốt nhạc
Mạnh Úp 2 bản Ai xài Office x32 thì Add COM x32
Chạy Excel.EXE chế độ Run As khi đó Windows hỏi thì chọn Yes xong Vào COM Excel Add nó vào
View attachment 239862
Tôi vẫn đang nghiên cứu C#, viết Add-Ins cũng thấy OK. Hiện tại vẫn phát triển tốt, hiện tại là tự mò nhưng cũng cảm thấy hiểu nhiều về nó rồi. Hầu như là những cái tiện ích VNTools của tôi hoàn toàn chuyển được sang C# rồi. Thấy ái Delphi này ít tài liệu nghiên cứu quá nên chạy mất dép, nhưng những bài viết trong chủ đề này vẫn tò mò muốn xem, thấy bác mò dữ quá.
 
Upvote 0
SQL đang hình thành trong tầm tay
1593088077818.png
 
Lần chỉnh sửa cuối:
Upvote 0
các Bạn cho Mình hỏi chút trong VBA mình sử dụng Hàm Right ... Thì trong Delphi Mình sử dụng hàm Gì tương đương như thế ???
Mình có tìm hiểu thấy có mấy hàm của Delphi như: RightStr, AnsiRightStr ... Mình có thử sao nó báo lỗi hay Mình thiếu Uses gì
Mong Các bạn chỉ dùm :D
 
Upvote 0
các Bạn cho Mình hỏi chút trong VBA mình sử dụng Hàm Right ... Thì trong Delphi Mình sử dụng hàm Gì tương đương như thế ???
Mình có tìm hiểu thấy có mấy hàm của Delphi như: RightStr, AnsiRightStr ... Mình có thử sao nó báo lỗi hay Mình thiếu Uses gì
Mong Các bạn chỉ dùm :D
Anh dùng thử hàm SubString nhé.
 
Upvote 0
Anh dùng thử hàm SubString nhé.
Mai rảnh thử xem sao
Mã:
program Project1;
{$APPTYPE CONSOLE}

var
  strA, strB, strC : String;

begin
  strA := '0123456789';
  strB := strA.SubString(5);
  strC := strA.SubString(5, 2);

  Console.WriteLine('strA = ' + strA);
  Console.WriteLine('strB = ' + strB);
  Console.WriteLine('strC = ' + strC);

  Console.ReadLine;
end.
   strA = 0123456789
   strB = 56789
   strC = 56
 
Upvote 0
Anh dùng thử hàm SubString nhé.
Mới thử xong sao nó lấy ko chính Xác
Mã:
xx := Ext.SubString(3);
    ShowMessage('xx  ' + xx);
Lấy 3 mà nó lấy có 2 ... hay Mình chưa biết xài ta ???

Cái sau OK ... Lưu vào đây cho các Bạn sau này cần Cứ thế mà xài
Mã:
System.StrUtils.RightStr
Up to Parent: System.StrUtils
Delphi
function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
function RightStr(const AText: string; const ACount: Integer): string; overload;
 
Lần chỉnh sửa cuối:
Upvote 0
Mới thử xong sao nó lấy ko chính Xác
Mã:
xx := Ext.SubString(3);
    ShowMessage('xx  ' + xx);
Lấy 3 mà nó lấy có 2 ... hay Mình chưa biết xài ta ???
3 có nghĩa là lấy từ ký tự có chỉ số là 3. Chỉ số tính từ 0, vậy lấy từ ký tự thứ 4. Nếu chuỗi là 'abcdef' thì 3 có nghĩa là lấy từ 'd'
Cái sau OK ... Lưu vào đây cho các Bạn sau này cần Cứ thế mà xài
Mã:
System.StrUtils.RightStr
Up to Parent: System.StrUtils
Delphi
function RightStr(const AText: AnsiString; const ACount: Integer): AnsiString; overload;
function RightStr(const AText: string; const ACount: Integer): string; overload;
Nói bao lần nhưng như nước đổ đầu vịt.
Tìm gì thì trước tiên cũng phải tìm trong nhà. Trong nhà không có mới tìm ngoài đường. Đã bảo luôn đọc help mà không chịu. Trong Delphi có nhiều "quyển" help. Nếu "Help -> Delphi help -> System Library help" thì đọc mệt nghỉ. Chả phải tìm ở đâu xa, chả phải lưu ở đâu cả.

help.jpg

Trong Help có bằng này mục.

help2.jpg

Chỉ sợ không đủ thời gian để đọc hết. Cần gì mò mẫm tìm trên mạng, lưu trên mạng?

Có nhìn thấy mục "Examples and Samples" không? Đó là các ví dụ của Delphi có trên mạng, nhưng cũng đồng thời có trong thư mục con cài đặt "Embarcadero\ ... \Samples". Xem lướt qua các ví dụ thôi là khỏi hỏi những câu ngớ ngẩn, thuộc hạng cơ bản ABC.

Tôi từ xưa tới nay cứ bập vào cái gì là tôi lôi help ra đọc nát bươm mới thôi. Delphi, Windows API hay Excel VBA ... Có những cái chỉ cần đọc lướt qua để biết, khi cầm tìm cái gì đó thì biết phạm vi tìm ở đâu.
 
Upvote 0
3 có nghĩa là lấy từ ký tự có chỉ số là 3. Chỉ số tính từ 0, vậy lấy từ ký tự thứ 4. Nếu chuỗi là 'abcdef' thì 3 có nghĩa là lấy từ 'd'

Nói bao lần nhưng như nước đổ đầu vịt.
Tìm gì thì trước tiên cũng phải tìm trong nhà. Trong nhà không có mới tìm ngoài đường. Đã bảo luôn đọc help mà không chịu. Trong Delphi có nhiều "quyển" help. Nếu "Help -> Delphi help -> System Library help" thì đọc mệt nghỉ. Chả phải tìm ở đâu xa, chả phải lưu ở đâu cả.

View attachment 240085

Trong Help có bằng này mục.

View attachment 240086

Chỉ sợ không đủ thời gian để đọc hết. Cần gì mò mẫm tìm trên mạng, lưu trên mạng?

Có nhìn thấy mục "Examples and Samples" không? Đó là các ví dụ của Delphi có trên mạng, nhưng cũng đồng thời có trong thư mục con cài đặt "Embarcadero\ ... \Samples". Xem lướt qua các ví dụ thôi là khỏi hỏi những câu ngớ ngẩn, thuộc hạng cơ bản ABC.

Tôi từ xưa tới nay cứ bập vào cái gì là tôi lôi help ra đọc nát bươm mới thôi. Delphi, Windows API hay Excel VBA ... Có những cái chỉ cần đọc lướt qua để biết, khi cầm tìm cái gì đó thì biết phạm vi tìm ở đâu.
Cái vụ này Em xử xong rồi ... Em cảm ơn
Anh cho Em hỏi chút trên VBA Em tạo 1 cái Form xong Em vẻ 1 cái TextBox1 lên đó hay VB6 cũng vậy xong khi chạy code Em gõ cái gì vào đó cũng được Khi Form Show

vậy trong Delphi Em tìm cái Control gì đại ý nó như cái TextBox1 trên VBA và VB6 vậy ....
Trên Form Delphi Em vẻ cái TEdit mà khi Form Show nó ko cho gõ vào đó hay Em chưa biết sử dụng Anh nhỉ
 
Upvote 0
Cái vụ này Em xử xong rồi ... Em cảm ơn
Anh cho Em hỏi chút trên VBA Em tạo 1 cái Form xong Em vẻ 1 cái TextBox1 lên đó hay VB6 cũng vậy xong khi chạy code Em gõ cái gì vào đó cũng được Khi Form Show

vậy trong Delphi Em tìm cái Control gì đại ý nó như cái TextBox1 trên VBA và VB6 vậy ....
Trên Form Delphi Em vẻ cái TEdit mà khi Form Show nó ko cho gõ vào đó hay Em chưa biết sử dụng Anh nhỉ
Bạn nói cụt lủn thế thì tôi làm sao biết bạn đã làm thế nào. Cũng như hôm trước bạn đính kèm cái ảnh với ListBox rồi bạn than là chỉ chọn được mục đầu tiên. Không một lời giải thích, mô tả.

Về Edit tôi thử thao tác: File -> New -> VLC Forms Application - Delphi -> gõ TEdit vào ô search của Tool Palette -> tìm được ở thẻ Standard -> click vào TEdit -> click vào Form -> trên Form đã có Edit.

Nhấn Run -> có thể nhập gì đó tùy ý trong Edit.

Bạn không mô tả các thao tác của bạn nên tôi chịu.

Mà thôi. Bạn cố gắng đọc help nhé.
 
Upvote 0
Bạn nói cụt lủn thế thì tôi làm sao biết bạn đã làm thế nào. Cũng như hôm trước bạn đính kèm cái ảnh với ListBox rồi bạn than là chỉ chọn được mục đầu tiên. Không một lời giải thích, mô tả.

Về Edit tôi thử thao tác: File -> New -> VLC Forms Application - Delphi -> gõ TEdit vào ô search của Tool Palette -> tìm được ở thẻ Standard -> click vào TEdit -> click vào Form -> trên Form đã có Edit.

Nhấn Run -> có thể nhập gì đó tùy ý trong Edit.

Bạn không mô tả các thao tác của bạn nên tôi chịu.

Mà thôi. Bạn cố gắng đọc help nhé.
Em Úp file Anh giúp Em chút ... Em có tạo 2 File khác nhau

1/ 1 File là Form.exe thì Em vẻ lên đó cái TEdit và Memo khi em chạy File thì gõ cái gì vào đó cũng được

2/ 1 File là cái Add-ins DLL có cái Form khi mở Excel thì nó sẻ load cái Form đó Show lên . trên Form Em cũng tạo 1 cái TEdit và Memo nhưng khi em gõ vào đó thì nó thoát ngay Form xuống và mình gõ cái gì thì nó vào gán vào Cells Excel luôn. Em loay hoay chưa biết xử lý sao và lý do tại sao

3/ Anh chỉ em làm file mục số 2 với ... ( File đó là VD: còn thực tế thì Em làm cái Menu trên Excel khi nào có nhu cầu thì gọi Form lên xong thoát ... xong lại gọi khi có nhu cầu )

Untitled.png)

4/ Hình Ảnh kèm theo Em gõ lên Form thì nó lại gán xuống Cells

Cảm ơn Anh
 

File đính kèm

Upvote 0
Em Úp file Anh giúp Em chút ... Em có tạo 2 File khác nhau

1/ 1 File là Form.exe thì Em vẻ lên đó cái TEdit và Memo khi em chạy File thì gõ cái gì vào đó cũng được

2/ 1 File là cái Add-ins DLL có cái Form khi mở Excel thì nó sẻ load cái Form đó Show lên . trên Form Em cũng tạo 1 cái TEdit và Memo nhưng khi em gõ vào đó thì nó thoát ngay Form xuống và mình gõ cái gì thì nó vào gán vào Cells Excel luôn. Em loay hoay chưa biết xử lý sao và lý do tại sao
Tại sao bạn không nói điều này ngay từ đầu mà chỉ có thói quen nói cụt lủn?

Về EXE + Excel thì dễ hiểu. Cả EXE và Excel đều là những quá trình độc lập, hoạt động trong không gian địa chỉ khác biệt của mình. Về DLL + Excel thì lại khác. DLL không là quá trình độc lập. DLL được load vào không gian địa chỉ của Excel và hoạt động trong không gian địa chỉ ấy. Nhưng quá trình Excel thâu tóm bàn phím. Tức mọi input từ bàn phím sẽ được thâu tóm bởi Excel và xử lý, vd. đưa vào ActiveCell. Vì thế khi gõ vd. "Ngày mai em đi" thì nó sẽ "hạ cánh" ở ô đang active trên sheet. Bạn cứ thử kiểm tra ô đang active mà xem.

Nguyên nhân chắc chắn là thế. Còn khắc phục thế nào thì bạn tìm tòi, thử nghiệm nhé. Tôi không có Delphi để tìm và thử nghiệm thay bạn. Tôi tò mò muốn biết Delphi bây giờ mặt mũi thế nào. Nhưng chỉ là tìm hiểu chay, đọc chay thôi. Máy cà tàng của tôi không cài được Delphi đời mới. Những ảnh mà tôi đính kèm gần đây là tôi nhờ người khác chụp hộ thôi.
 
Upvote 0
Tại sao bạn không nói điều này ngay từ đầu mà chỉ có thói quen nói cụt lủn?

Về EXE + Excel thì dễ hiểu. Cả EXE và Excel đều là những quá trình độc lập, hoạt động trong không gian địa chỉ khác biệt của mình. Về DLL + Excel thì lại khác. DLL không là quá trình độc lập. DLL được load vào không gian địa chỉ của Excel và hoạt động trong không gian địa chỉ ấy. Nhưng quá trình Excel thâu tóm bàn phím. Tức mọi input từ bàn phím sẽ được thâu tóm bởi Excel và xử lý, vd. đưa vào ActiveCell. Vì thế khi gõ vd. "Ngày mai em đi" thì nó sẽ "hạ cánh" ở ô đang active trên sheet. Bạn cứ thử kiểm tra ô đang active mà xem.

Nguyên nhân chắc chắn là thế. Còn khắc phục thế nào thì bạn tìm tòi, thử nghiệm nhé. Tôi không có Delphi để tìm và thử nghiệm thay bạn. Tôi tò mò muốn biết Delphi bây giờ mặt mũi thế nào. Nhưng chỉ là tìm hiểu chay, đọc chay thôi. Máy cà tàng của tôi không cài được Delphi đời mới. Những ảnh mà tôi đính kèm gần đây là tôi nhờ người khác chụp hộ thôi.
chính xác như anh nói ... em giờ chịu hết cách cũng ko biết xử lý sao nữa
 
Upvote 0
chính xác như anh nói ... em giờ chịu hết cách cũng ko biết xử lý sao nữa
Ý tưởng thì tôi có, nhưng tôi không có Delphi để kiểm nghiệm.
Đằng nào bạn cũng show Form từ menu. Vậy trong menu bạn thử code
Mã:
Form1.ShowModal;

1. Tại sao không thể Form1.ShowModal trong OnStartupComplete?
Bởi nếu có code Form1.ShowModal trong OnStartupComplete thì thứ tự sẽ là: hiển thị Form1, và chỉ đến khi đóng Form1 thì sheet (workbook) trong Excel mới hiển thị. Nó giống như trong VBA. Nếu trong VBA sau dòng UserForm1.Show (show modal) có thêm một số dòng code thì chỉ khi đóng UserForm1 thì những dòng code kia mới được thực hiện.

2. Do Form1.ShowModal đặt trong menu nên ở thời điểm chọn menu thì sheet trong Excel đã được hiển thị.

Tuy nhiên tôi tin chắc 200% rằng sẽ có lỗi. Cái ShowModal kia chắc chắn xung đột với code của Excel. Mục đích ShowModal chỉ để bạn mục sở thị là lúc này input từ bàn phím sẽ "đi" vào Edit hoặc Memo. Tức ý tưởng ShowModal hiện thời chỉ là để thỏa chí tò mò, rằng có thể nhập vào Edit. Nhưng ShowModal chắc chắn sẽ gây ra lỗi nếu sau đó code thao tác, tương tác với Excel: tức khi nhấn Button để nhập "Kiều Mạnh" vào ô trên sheet. Nếu không cẩn thận code ngoại lai rất dễ xung đột với code của Excel.
 
Upvote 0
Ý tưởng thì tôi có, nhưng tôi không có Delphi để kiểm nghiệm.
Đằng nào bạn cũng show Form từ menu. Vậy trong menu bạn thử code
Mã:
Form1.ShowModal;

1. Tại sao không thể Form1.ShowModal trong OnStartupComplete?
Bởi nếu có code Form1.ShowModal trong OnStartupComplete thì thứ tự sẽ là: hiển thị Form1, và chỉ đến khi đóng Form1 thì sheet (workbook) trong Excel mới hiển thị. Nó giống như trong VBA. Nếu trong VBA sau dòng UserForm1.Show (show modal) có thêm một số dòng code thì chỉ khi đóng UserForm1 thì những dòng code kia mới được thực hiện.

2. Do Form1.ShowModal đặt trong menu nên ở thời điểm chọn menu thì sheet trong Excel đã được hiển thị.

Tuy nhiên tôi tin chắc 200% rằng sẽ có lỗi. Cái ShowModal kia chắc chắn xung đột với code của Excel. Mục đích ShowModal chỉ để bạn mục sở thị là lúc này input từ bàn phím sẽ "đi" vào Edit hoặc Memo. Tức ý tưởng ShowModal hiện thời chỉ là để thỏa chí tò mò, rằng có thể nhập vào Edit. Nhưng ShowModal chắc chắn sẽ gây ra lỗi nếu sau đó code thao tác, tương tác với Excel: tức khi nhấn Button để nhập "Kiều Mạnh" vào ô trên sheet. Nếu không cẩn thận code ngoại lai rất dễ xung đột với code của Excel.
Em mới thử Form1.ShowModal thì khi gõ nó vẫn trả về Cells ngay lập tức

thử cho Form1.ShowModal vào OnStartupComplete thì nó cũng như thế ... có điều cho vào mục này em thấy bất tiện quá vì mỗi lần mở Excel nó lại Show lên mà nhu cầu xài chưa có hay có vào lúc khác khi cần

( Trên máy Em có 1 File code mẫu Em tải của trang nước ngoài hình như viết trên Delphi 7 thì phải nó cũng là COM Delphi cho Excel ...File này chỉ tham khảo )


Cảm ơn Anh
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em mới thử Form1.ShowModal thì khi gõ nó vẫn trả về Cells ngay lập tức
Thế thì hơi lạ.

Thì thử cách khác.
1. Vẫn để Form1.Show trong On...
2. Đặt CheckBox1 trên Form. Code cho OnClick là
Mã:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  Form1.Hide;
  if CheckBox1.State = cbChecked then
    Form1.ShowModal
  else
    Form1.Show;
end;
3. Thử nghiệm: kích hoạt Excel -> click CheckBox1 để đánh dấu và From1.ShowModal -> click vào Edit và gõ. Trong Edit có đoạn gõ?

Tuy nhiên như tôi đã nói, chỉ là để kiểm tra xem liệu có thể gõ trong Edit không thôi. Còn tôi vẫn tin là nếu sau đó nhấn button để nhập "Kiều Mạnh" vào cell (tương tác với trang tính) thì sẽ có lỗi. Thậm chí sau khi ShowModal mà ta lại click CheckBox để chỉ Show thì khi nhấn button có lẽ vẫn sẽ có lỗi.
 
Upvote 0
Thế thì hơi lạ.

Thì thử cách khác.
1. Vẫn để Form1.Show trong On...
2. Đặt CheckBox1 trên Form. Code cho OnClick là
Mã:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  Form1.Hide;
  if CheckBox1.State = cbChecked then
    Form1.ShowModal
  else
    Form1.Show;
end;
3. Thử nghiệm: kích hoạt Excel -> click CheckBox1 để đánh dấu và From1.ShowModal -> click vào Edit và gõ. Trong Edit có đoạn gõ?

Tuy nhiên như tôi đã nói, chỉ là để kiểm tra xem liệu có thể gõ trong Edit không thôi. Còn tôi vẫn tin là nếu sau đó nhấn button để nhập "Kiều Mạnh" vào cell (tương tác với trang tính) thì sẽ có lỗi. Thậm chí sau khi ShowModal mà ta lại click CheckBox để chỉ Show thì khi nhấn button có lẽ vẫn sẽ có lỗi.
Em mới thử vậy thì gõ Ok đó Anh tuy nhiên lỗi hay phát sinh gì thêm thì em chưa lường hết hay biết trước
Mai chủ nhật Em kẹt ... Thứ 2 Em thử các kiểu xem sao có gì em báo lại Anh

1593265371250.png
Em mới thử bấm Buuton trên Form get Range thấy Ok
1593265713652.png

Nó phát sinh 1 cái khó chịu là cái Form nó làm kẹt cứng lại ko thao tác gì được hết ... trừ khi tắt Form đi
 
Lần chỉnh sửa cuối:
Upvote 0
Em mới thử vậy thì gõ Ok đó Anh tuy nhiên lỗi hay phát sinh gì thêm thì em chưa lường hết hay biết trước
Em mới thử bấm Buuton trên Form get Range thấy Ok
Nó phát sinh 1 cái khó chịu là cái Form nó làm kẹt cứng lại ko thao tác gì được hết ... trừ khi tắt Form đi
Thì tôi đã nói rồi còn gì. Đang có ShowModal mà.

Mà nếu chưa có lỗi thì còn may đấy. Vì tôi đã chắc chắn 200% là sẽ có lỗi vi phạm truy cập - AV (access violation) cơ.

Tôi nói rồi: tôi đề nghị thử ShowModal chẳng qua chỉ để cho bạn mục sở thị, rằng có thể nhập vào Edit. Thế thôi.
 
Upvote 0
Thì tôi đã nói rồi còn gì. Đang có ShowModal mà.

Mà nếu chưa có lỗi thì còn may đấy. Vì tôi đã chắc chắn 200% là sẽ có lỗi vi phạm truy cập - AV (access violation) cơ.

Tôi nói rồi: tôi đề nghị thử ShowModal chẳng qua chỉ để cho bạn mục sở thị, rằng có thể nhập vào Edit. Thế thôi.
Em tìm kiếm Google mà cũng ko biết từ khóa tìm kiếm nó là gì và xử lý sao nữa .... khó quá chắc em tạm gác lại khi nào mò ra hay ai đó giúp cho lại lục lại tính Tiếp
Cảm ơn Anh
 
Upvote 0
Kiên trì mò thêm 1 ngày nữa mà ko ra và cũng ko biết bắt đầu từ đâu ... Bạn nào biết chỉ Mạnh xử lý dùm ... hay từ khóa tìm kiếm Google để Mạnh tìm ... Xin cảm ơn
 
Upvote 0
Tìm thêm 1 ngày nữa thấy tây nó cũng bị như vậy
Trình Delphi của Mạnh thuộc hạng ruồi thì tịt toàn tập ... may ra có ai giúp thì mới Ok
Bạn phải hỏi trực tiếp những người mà bạn chắc chắn là:
1. Có cài Delphi, và có ít nhất cơ bản về Delphi, và về lập trình.
2. Liên tục học hỏi hoặc làm việc hàng ngày với Delphi.
3. Đã có những code ít nhất là chạy được.

Tôi nghĩ có ít nhất là 2 người như thế: tác giả của chủ đề này, và bạn @thuyyeu99. Bạn @thuyyeu99 liên tục trao đổi với bạn, và nhiều lần "khoe" những gì bản thân đã làm được. Mà những cái đó lại trùng hợp với cái bạn định làm.
 
Upvote 0
Bạn phải hỏi trực tiếp những người mà bạn chắc chắn là:
1. Có cài Delphi, và có ít nhất cơ bản về Delphi, và về lập trình.
2. Liên tục học hỏi hoặc làm việc hàng ngày với Delphi.
3. Đã có những code ít nhất là chạy được.

Tôi nghĩ có ít nhất là 2 người như thế: tác giả của chủ đề này, và bạn @thuyyeu99. Bạn @thuyyeu99 liên tục trao đổi với bạn, và nhiều lần "khoe" những gì bản thân đã làm được. Mà những cái đó lại trùng hợp với cái bạn định làm.
Anh giúp Em xử vụ này đi ... Em thua toàn tập rồi đó :D
 
Upvote 0
Tìm cả tối qua vẫn tịt toàn tập , tuy nhiên có Web sau cũng mô tả tình trạng như vậy và cách xử lý mã C
Mã:
protected override void WndProc(ref Message m)
{
  const int WM_PARENTNOTIFY = 528;
  if(m.Msg == WM_PARENTNOTIFY && !this.Focused)
  {
    this.Focus();
  }
  base.WndProc(ref m);
}
Xem code đó càng mù tịt hơn -0-0-0-

Bạn @Nguyễn Duy Tuân Giúp Mạnh xử lý Nhập liệu trên Form của DLL Add-Ins Delphi như mô tả lỗi ở mấy bài trước được ko ???
Trên GPE này Nhờ tới Bạn là hy vọng cuối Cùng :D rất mong giúp Mạnh

Mạnh Cảm Ơn
 
Upvote 0
Cảm ơn Bạn ... Bạn hiểu sai ý Mạnh rồi ... Nhập liệu vào Form DLL của Add-ins ấy chứ ko phải Form.exe
Viết cái Form trong DLL Add-ins COM Delphi ... khi Excel load thì gọi cái Form đó lên xong nhập vào Textbox mà nó ko trả về cells ấy
cái lỗi đó... thay vì gõ trên Textbox của Form thì nó vào đó nhưng nó hạ cánh xuống Cells :D
 
Upvote 0
Bạn @Nguyễn Duy Tuân Giúp Mạnh xử lý Nhập liệu trên Form của DLL Add-Ins Delphi như mô tả lỗi ở mấy bài trước được ko ???
Trên GPE này Nhờ tới Bạn là hy vọng cuối Cùng :D rất mong giúp Mạnh

Mạnh Cảm Ơn

Vấn đề con trỏ soạn thảo trên trên Form nhúng vào TaskPane hoặc hiển thị form bằng thủ tục Show() tạo từ Delphi là gặp rắc rối thực sự trừ việc ShowModal(). Lỗi này không phải của Delphi vì cơ chế Excel nó cản trở như vậy, gần như các ngôn ngữ khác đều sẽ bị vậy ngoại trừ VBA và .NET (.NET khi làm với TaskPane). Để khắc phục việc này có hai cách. Cách dùng thuộc tính Application.Interactive của Excel như trong code tôi đã sửa cho bạn trong bài này, cách thứ hai dùng API để nhận thông điệp bán phím từ cửa sổ cha (cách này rất khó). Trong code tôi gửi lên đây đã sửa và thêm trong Unit1 như sau:

1. Khai báo FExcelApp: ExcelApplication; Đưa ra ngoài phạm phi của class TForm1 để nó có thể dùng chung cho nhiều nơi nhiều form. Cái này tôi đã nhấn mạnh từ comment trước nhưng không biết sao bạn không thể làm theo.

2. Thêm hai thủ tục sự kiện DoDisableInteractive, DoEnableInteractive để hủy và khôi phục chế độ kiểm soát con trỏ của Excel. Các thủ tục này được gán vào các sự kiện của control edit như sau:

Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vấn đề con trỏ soạn thảo trên trên Form nhúng vào TaskPane hoặc hiển thị form bằng thủ tục Show() tạo từ Delphi là gặp rắc rối thực sự trừ việc ShowModal(). Lỗi này không phải của Delphi vì cơ chế Excel nó cản trở như vậy, gần như các ngôn ngữ khác đều sẽ bị vậy ngoại trừ VBA và .NET (.NET khi làm với TaskPane). Để khắc phục việc này có hai cách. Cách dùng thuộc tính Application.Interactive của Excel như trong code tôi đã sửa cho bạn trong bài này, cách thứ hai dùng API để nhận thông điệp bán phím từ cửa sổ cha (cách này rất khó). Trong code tôi gửi lên đây đã sửa và thêm trong Unit1 như sau:

1. Khai báo FExcelApp: ExcelApplication; Đưa ra ngoài phạm phi của class TForm1 để nó có thể dùng chung cho nhiều nơi nhiều form. Cái này tôi đã nhấn mạnh từ comment trước nhưng không biết sao bạn không thể làm theo.

2. Thêm hai thủ tục sự kiện DoDisableInteractive, DoEnableInteractive để hủy và khôi phục chế độ kiểm soát con trỏ của Excel. Các thủ tục này được gán vào các sự kiện của control edit như sau:

Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
Cảm ơn Bạn rất nhiều ... Mai mốt mình thử các kiểu xem nếu có phát sinh lỗi gì mong Bạn trợ Giúp
vậy là Bạn đã giúp Mạnh 1 bước tiến vững chắc và dài trên con đường Phát triển Add-ins COM Delphi cho Excel đấy ...
vì viết Form mà ko xài được thấy khó chịu lắm

Cơ bản cái SQL bên thớt kia Mạnh Viết trên VB6 đã Ok ... Qua đây sang Delphi cũng đã Ok còn kẹt cái gõ trên Form nữa là xong ... vài ngày nữa rảnh làm nốt là xong

Hình sau mới thử thấy Ok

Capture.PNG

cảm ơn Bạn
 
Upvote 0
Có 2 mục mình khoanh đỏ đó Mình chưa biết tạo trên Form khác như thế nào Mình có vào Mục Events tìm mà không thấy
Mong các Bạn chỉ dùm ... Mò cơ bản cái Form + Events + Conltrol nữa mới tạm ok
Lóng ngóng trên Form Delphi quá :D

Untitled.png
 
Upvote 0
Có 2 mục mình khoanh đỏ đó Mình chưa biết tạo trên Form khác như thế nào Mình có vào Mục Events tìm mà không thấy
Mong các Bạn chỉ dùm ... Mò cơ bản cái Form + Events + Conltrol nữa mới tạm ok
Lóng ngóng trên Form Delphi quá :D

View attachment 240257

Bạn nhinf form tôi sửa. Trên đầu unit, bên trong class hãy copy hai cái khai báo thủ tục đó sang form bên kia, phần code bôi đỏ copy sang nữa và đổi tên TForm1 thành tên TForm2 gì đo là được.
 
Upvote 0
Bạn nhinf form tôi sửa. Trên đầu unit, bên trong class hãy copy hai cái khai báo thủ tục đó sang form bên kia, phần code bôi đỏ copy sang nữa và đổi tên TForm1 thành tên TForm2 gì đo là được.
VẬY là cái đó tự làm chứ trong sự kiện của Form ko có hay sao ??? hay nó nằm ở mục nào ? ... hèn chi mình tìm hoài ko thấy
 
Upvote 0
Các Bạn cho Mình hỏi chút

1/ Thường ngày Mình vẫn vẻ Control lên Form Delphi xong Build lại xong từ Menu Excel vẫn gọi Show Form lên Bình thường
Tối qua Mình vẻ thêm vài Cái Control + Edit lại nó chút xong Lưu lại Xong Build nó ko báo lỗi gì hết ... xong thử test chạy trên Excel thì cái Form trong DLL Delphi nó IM RE không thấy nó Show lên

2/ Vậy Mình muốn hỏi đó là lỗi gì và cách xử lý nó ... nếu ko xử lý được giờ ngồi làm lại từ đầu thấy hơi cực

3/ Cũng trong DLL đó mình có tạo cái mới xem sao thì thấy chạy ok

Mong các Bạn chỉ dùm cách khắc phục xử lý như mô tả ở trên
 
Upvote 0
VẬY là cái đó tự làm chứ trong sự kiện của Form ko có hay sao ??? hay nó nằm ở mục nào ? ... hèn chi mình tìm hoài ko thấy

Tôi cố tình không gán sự kiện trong design form mà viết code để bạn nhìn thấy để vận dụng cho nhiều trường hợp khác. Sự kiện nhận chính là chỗ này:
Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
Bài đã được tự động gộp:

Các Bạn cho Mình hỏi chút

1/ Thường ngày Mình vẫn vẻ Control lên Form Delphi xong Build lại xong từ Menu Excel vẫn gọi Show Form lên Bình thường
Tối qua Mình vẻ thêm vài Cái Control + Edit lại nó chút xong Lưu lại Xong Build nó ko báo lỗi gì hết ... xong thử test chạy trên Excel thì cái Form trong DLL Delphi nó IM RE không thấy nó Show lên

2/ Vậy Mình muốn hỏi đó là lỗi gì và cách xử lý nó ... nếu ko xử lý được giờ ngồi làm lại từ đầu thấy hơi cực

3/ Cũng trong DLL đó mình có tạo cái mới xem sao thì thấy chạy ok

Mong các Bạn chỉ dùm cách khắc phục xử lý như mô tả ở trên

Khi gọi form từ lệnh (menu) thì bạn nên dùng ShowModal nhé. Show() là thủ tục hiển thị dạng Modaless mà dạng này phải chỉ ra quan hệ cha con....
Nói tóm lại là từ menu bạn luôn họi Form.ShowModal(); nếu không có vướng mắc gì khác.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi cố tình không gán sự kiện trong design form mà viết code để bạn nhìn thấy để vận dụng cho nhiều trường hợp khác. Sự kiện nhận chính là chỗ này:
Edit1.OnMouseEnter := DoDisableInteractive;
Edit1.OnMouseLeave := DoEnableInteractive;

Memo1.OnMouseEnter := DoDisableInteractive;
Memo1.OnMouseLeave := DoEnableInteractive;
Bài đã được tự động gộp:



Khi gọi form từ lệnh (menu) thì bạn nên dùng ShowModal nhé. Show() là thủ tục hiển thị dạng Modaless mà dạng này phải chỉ ra quan hệ cha con....
Nói tóm lại là từ menu bạn luôn họi Form.ShowModal(); nếu không có vướng mắc gì khác.
Mới thử xong nó vẫn ko Show cái Form lên ... mà khi đó Build lại mới ko báo lỗi gì hết
 
Upvote 0
Bạn gửi code thủ tục show form xem nào?
Mạnh cũng ko biết tại sao nữa .. thường ngày vẫn chạy
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
  end;
end;
 
Upvote 0
Mạnh cũng ko biết tại sao nữa .. thường ngày vẫn chạy
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
  end;
end;

Có hai vấn đề bạn phải giải quyết như sau:
1. Code trên chưa giải phóng biến Form1. Khi sử dụng Form1.Show() thì không free biến Form1 vì nó được tự giải phóng trong sự kiện OnQueryClose. Nhưng khi dùng ShowModal() thì không dùng OnQueryClose mà phải giải phóng nó ở khu vực Create. Vậy sửa nhưa sau
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
    Form1.Free;//RẤT QUAN TRỌNG!
  end;
end;

2. khi không hiển thị form thì có thể lỗi code trong sự kiện FormCreate(). Bạn phải debug trong khu vực này. Có thể gửi đoạn code trong thủ tục sự FormCreate lên đây tôi xem tiếp.
 
Upvote 0
Có hai vấn đề bạn phải giải quyết như sau:
1. Code trên chưa giải phóng biến Form1. Khi sử dụng Form1.Show() thì không free biến Form1 vì nó được tự giải phóng trong sự kiện OnQueryClose. Nhưng khi dùng ShowModal() thì không dùng OnQueryClose mà phải giải phóng nó ở khu vực Create. Vậy sửa nhưa sau
Mã:
procedure TCoMultipleUIThreadsDemo.ShowModelessForm(const Control: IDispatch);
var
  Form1: TForm1;
begin
  Form1 := TForm1.Create(nil);
  try
    Form1.ShowModal
  finally
    Form1.Free;//RẤT QUAN TRỌNG!
  end;
end;

2. khi không hiển thị form thì có thể lỗi code trong sự kiện FormCreate(). Bạn phải debug trong khu vực này. Có thể gửi đoạn code trong thủ tục sự FormCreate lên đây tôi xem tiếp.
Nó vẫn thế ... chỉ là tối qua vẻ thêm vài cái Control + Edit lại nó thôi hay do nhấm nhầm cái Gì trong Properties
 
Upvote 0
Nó vẫn thế ... chỉ là tối qua vẻ thêm vài cái Control + Edit lại nó thôi hay do nhấm nhầm cái Gì trong Properties

Vậy xóa những cái thêm ấu đi rồi thêm lại. Nếu làm vậy vẫn không chạy thì mở code trong FormCreate ra đây sẽ biết ngay.
 
Upvote 0
Vậy xóa những cái thêm ấu đi rồi thêm lại. Nếu làm vậy vẫn không chạy thì mở code trong FormCreate ra đây sẽ biết ngay.
Trên Form lâu nay cũng ko tạo cái đó luôn .. chỉ chèn 1 cái Form xong vẻ cái Control lên xong xài vậy thấy Ok
để tối nay Rảnh mạnh xóa hết đi xem sao ... lỗi do cái gì
 
Upvote 0
Ghét quá trên cái Form đó nó rối tinh hết bỏ luôn tạo cái Mới -0-0-0-

Vậy là SQL Từ VBA Mạnh chuyển Qua VB6 xong từ VB6 Mạnh chuyển vào Delphi thành công ... Học mà có chi sợ mất thời gian

bản test thử sẻ còn lỗi nhiều thứ ... Tạm thời gán dữ liệu lên Cells ... sau đó bổ sung sau nơi Gán dữ liệu và SQL trên Cells sau
@huuduy.duy Rảnh test thử dùm mạnh xem nó có chạy hay ko cái đã còn lỗi hay nọ kia Tính sau

Untitled.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ghét quá trên cái Form đó nó rối tinh hết bỏ luôn tạo cái Mới -0-0-0-

Vậy là SQL Từ VBA Mạnh chuyển Qua VB6 xong từ VB6 Mạnh chuyển vào Delphi thành công ... Học mà có chi sợ mất thời gian

bản test thử sẻ còn lỗi nhiều thứ ... Tạm thời gán dữ liệu lên Cells ... sau đó bổ sung sau nơi Gán dữ liệu và SQL trên Cells sau
@huuduy.duy Rảnh test thử dùm mạnh xem nó có chạy hay ko cái đã còn lỗi hay nọ kia Tính sau

View attachment 240288

Norton kill nhé. Bạn có dung pm nào nén DLL không?
 
Upvote 0
Mình thử thì thấy như sau


1/ Khi bấm Get Files thì Form chọn File nằm dưới Form "SQL For Data Office"
1.png
2/ Khi bấm Get File, xong thoát (không chọn File nào) thì xuất hiện lỗi như hình
2.png


P/s: Bạn thêm tùy chọn Head Column
 
Upvote 0
Mình thử thì thấy như sau


1/ Khi bấm Get Files thì Form chọn File nằm dưới Form "SQL For Data Office"
View attachment 240304
2/ Khi bấm Get File, xong thoát (không chọn File nào) thì xuất hiện lỗi như hình
View attachment 240305


P/s: Bạn thêm tùy chọn Head Column
mấy cái đó mạnh sẻ thêm và Fix sau ... quan trọng có chạy ko cái đã
Files sau Mạnh mới sửa lại code 1 tẹo và cho Form hiện góc trên bên tay Phải
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • 1593682452975.png
    1593682452975.png
    27.4 KB · Đọc: 1
Upvote 0
Sẻ làm thêm như sau:
1/ 1 SQL có trên Form đã làm rồi
2/ Tùy chọn SQL trên Form hay tại Cells
3/ Tùy chọn lấy các FilName Or Cột ( Cái này khó thong thả làm sau )
4/ Tùy chọn Cells gán dữ liệu
5/ Tinh chỉnh code + Fix lỗi
...............
Xong cơ bản mấy cái đó chuyển qua làm cái Server SQL Ms .... xong Tiếp cái TCPIP ( cái này khó đấy VB6 Mạnh có thể qua Delphi Hên và xui )

Cái Quan trọng nhất là gõ trên Form có Tuân làm cho rồi còn lại cứ thế thong thả viết thêm thôi và test các kiểu xem có lỗi hay không

Cơ bản thiết kế sơ bộ như sau

Ok.png
 
Lần chỉnh sửa cuối:
Upvote 0
Các Bạn cho Mình hỏi chút
1/ Trên VBA Mình tạo 1 Cái Form vẻ lên đó cái Textbox mục đích là kiểm tra nhập vào đó xem có phải là địa chỉ Range hay không ... nếu sai thì xóa hay làm gì đó ... code sau chạy tốt đúng Yêu cầu
Mã:
================= VBA
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    On Error GoTo Loi
    Set Rng = ActiveSheet.Range(TextBox1.Value)
    Set Rng = Nothing: Exit Sub
Loi:
    MsgBox "Không phai dia chi o."
    Cancel = True
    Exit Sub
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cơ bản cái SQL cho Excel và Access đã xong như cái VB6 chỉ thêm Tùy chọn SQL trên Form Or Range ( Range là cho người dùng Lưu lại SQL đã tạo khỏi mất công tạo lại thấy Hợp lý )
@huuduy.duy Mạnh thấy có vẻ mê Delphi đấy ... Vọc đi có gì khó khăn vào đây mà hỏi !!!! :D

1593828961677.png
Fix code + thiết kế lại cho nó đẹp lại chút ít ngày nữa là xong ... chuyển sang cái khác
 
Upvote 0
Bạn cho mình hỏi chút
Mình duyệt Rst.Fields.Count để lấy cái Rst.Fields[j].Name ... đưa vào Array
code đại ý như sau sao nó chạy cứ báo lỗi hay Mình khai báo thiếu cái gì ??
Mã:
Rst.Open(SQL, cnn);
...
for j := 0 to (Rst.Fields.Count - 1) do
   begin    
       ShowMessage(Rst.Fields(j).Name);
       ShowMessage(Rst.Fields[j].Name);
       ShowMessage(Rst.Fields(j).asString);        
   end;
 
Lần chỉnh sửa cuối:
Upvote 0
@huuduy.duy rảnh test thử dùm mạnh xem đúng ý Bạn chưa có gì chưa được báo Mình điều chỉnh

1/ đã tạo SQL trên Cells theo như gợi ý của Bạn ( Tùy chon SQL trên Form Or Cells )

2/ Sẻ lỗi code nếu trên Form bạn nhập địa chỉ Range SQL sai hoặc địa chỉ gán dữ liệu sai ( Cái sự kiện này mạnh chưa nghĩ ra cách xử lý nó được ... làm sau)

3/ Còn vài thứ nữa mà chưa làm xong ... ít ngày nữa ko ra lại nhờ sự trợ giúp :D :D

4/ có lỗi hay Bạn có ý gì thì báo nếu được Mạnh sẻ điều chỉnh viết thêm

sql.png

Cuối cùng ko biết tại sao Buil ra DLL x64 check Virus Toltal thì ok mà x32 thì báo có 1 em chắc xài Delphi lậu nên bị vậy quá
Tối qua thử Uses 1 cái Unit xài cho Internet Buil thấy nó báo có Virus ... bỏ cái Unit đó đi thì hết ... có code cũng thế .... xin Chịu toàn tập
 

File đính kèm

Upvote 0
@huuduy.duy rảnh test thử dùm mạnh xem đúng ý Bạn chưa có gì chưa được báo Mình điều chỉnh

1/ đã tạo SQL trên Cells theo như gợi ý của Bạn ( Tùy chon SQL trên Form Or Cells )

2/ Sẻ lỗi code nếu trên Form bạn nhập địa chỉ Range SQL sai hoặc địa chỉ gán dữ liệu sai ( Cái sự kiện này mạnh chưa nghĩ ra cách xử lý nó được ... làm sau)

3/ Còn vài thứ nữa mà chưa làm xong ... ít ngày nữa ko ra lại nhờ sự trợ giúp :D :D

4/ có lỗi hay Bạn có ý gì thì báo nếu được Mạnh sẻ điều chỉnh viết thêm

View attachment 240551

Cuối cùng ko biết tại sao Buil ra DLL x64 check Virus Toltal thì ok mà x32 thì báo có 1 em chắc xài Delphi lậu nên bị vậy quá
Tối qua thử Uses 1 cái Unit xài cho Internet Buil thấy nó báo có Virus ... bỏ cái Unit đó đi thì hết ... có code cũng thế .... xin Chịu toàn tập
Phần trên Cells máy mình không chạy được
 
Upvote 0
Chịu Mạnh xài Office 2016_x32 và x64 chạy tốt

Hay bạn tạo trên Cells sai ... thử Copy SQL Trên Form xuống A1 xong gán địa chỉ SQL trên Form là A1 xem
Bạn thấy lấy tiêu đề và ok Tiêu đề Ok chứ ... xử luôn File là tiếng việt có dấu trong Folder là tiếng việt có dấu đấy

1594015509070.png
 
Upvote 0
Mò ra nhiều thứ rồi đấy
1/ Khi chọn TableName thì nó sẻ Show ra các FiledsName
2/ Khi tích chọn các FiledsName thì làm sao nó gán vào SQL mà chạy code mới U đầu đây
Untitled.png
 
Upvote 0
Chịu Mạnh xài Office 2016_x32 và x64 chạy tốt

Hay bạn tạo trên Cells sai ... thử Copy SQL Trên Form xuống A1 xong gán địa chỉ SQL trên Form là A1 xem
Bạn thấy lấy tiêu đề và ok Tiêu đề Ok chứ ... xử luôn File là tiếng việt có dấu trong Folder là tiếng việt có dấu đấy

View attachment 240609
1. Phần lấy tiều đề: Ok
2. Mình copy cái SQL xuống Cells thì Ok, còn nếu để ở trên Form thì không được

 
Upvote 0
1. Phần lấy tiều đề: Ok
2. Mình copy cái SQL xuống Cells thì Ok, còn nếu để ở trên Form thì không được

Bạn làm sai Rồi ... Copy cái chuỗi SQL đó dán xuống A1 ấy .... SQL lấy trên Cells mà
chỗ checkbox đó là tùy chọn trên Cells ... mặc định là trên Form còn muốn SQL xuống Cells thì phải viết nó vào Cells chứ
A1 đó là SQL đấy ... muốn thêm gì gõ vào đó và phải check trên Form là SQL trên Cells ... Mục Range SQL chọn A1

SQL.png
 
Upvote 0
à thấy bạn làm mới nghĩ ra khi check xong gõ a1 thì SQL nó gán ngay xuống A1 xong tùy chỉnh thêm gì đó thì tùy mình
 
Upvote 0
Upvote 0
Trong dữ liệu tải về có 2 thư mục Win32 và Win64 nhưng tôi dùng Win64 lại chỉ add file .dll ở thư mục Win32, mà không add ở Win64 được.

Vậy cho hỏi bác có nhầm Win32 thay vì là Office32 không, vì tôi dùng Office32, Win64?
Buil nó ra thế còn Office x32 thì Add Win32 còn Officex64 thì Add DLL Win64
nó đang viết tiếp còn lỗi nhiều lắm và chưa hoàn thiện xong
 
Upvote 0
SQL For Database Office có tùy chọn các Cột Or FiledName đã xong

1/ Bấm Get Files ... Chọn File Excel Or Access
2/ Chọn TableName Or SheetName
3/ Tích chọn FildName Or Cột ( Lưu ý Bấm chuột 2 lần nó check màu đen đậm là ok)
4/ Bấm tạo SQL
5/ Bấm Get Data
6/ Thưởng thức ... và có lỗi hay mong muốn gì báo cho Mạnh nếu được Mạnh sẻ điều chỉnh ... thế là vui rồi
...
Delphi lợi hại thật nó cho gán cả chuỗi Unicode trong SQL ... vậy là Unicode có Delphi Lo -0-0-0-

SQL2.png

Unicode như sau mà nó cũng xử luôn

Untitled.png

Xin Cảm ơn các Bạn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom