Wątek przeniesiony 2016-04-22 15:23 z Delphi i Pascal przez olesio.

Wysyłanie maila z załącznikiem

0

Witam, chcę za pomocą delphi wysłać maila z załącznikiem za pomocą programu mailowego. Niestety wyrzuca mi błąd w jednym miejscu i niew iem dlaczeg. Mógłby ktoś zerknąc?

1.png

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, FileCtrl;
 
type
  TForm1 = class(TForm)
    FileListBox1: TFileListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses
  ActiveX, ShlObj, ComObj;
 
{$R *.dfm}
 
function GetFileListDataObject(const Directory: string; Files:
  TStrings):
  IDataObject;
type
  PArrayOfPItemIDList = ^TArrayOfPItemIDList;
  TArrayOfPItemIDList = array[0..0] of PItemIDList;
var
  Malloc: IMalloc;
  Root: IShellFolder;
  FolderPidl: PItemIDList;
  Folder: IShellFolder;
  p: PArrayOfPItemIDList;
  chEaten: ULONG;
  dwAttributes: ULONG;
  FileCount: Integer;
  i: Integer;
begin
  Result := nil;
  if Files.Count = 0 then
    Exit;
  OleCheck(SHGetMalloc(Malloc));
  OleCheck(SHGetDesktopFolder(Root));
  OleCheck(Root.ParseDisplayName(0, nil,
    PWideChar(WideString(Directory)),
    chEaten, FolderPidl, dwAttributes));
  try
    OleCheck(Root.BindToObject(FolderPidl, nil, IShellFolder,
      Pointer(Folder)));
    FileCount := Files.Count;
    p := AllocMem(SizeOf(PItemIDList) * FileCount);
    try
      for i := 0 to FileCount - 1 do
      begin
        OleCheck(Folder.ParseDisplayName(0, nil,
          PWideChar(WideString(Files[i])), chEaten, p^[i],
          dwAttributes));
      end;
      OleCheck(Folder.GetUIObjectOf(0, FileCount, p^[0], IDataObject,
        nil,
        Pointer(Result)));
    finally
      for i := 0 to FileCount - 1 do
      begin
        if p^[i] <> nil then
          Malloc.Free(p^[i]);
      end;
      FreeMem(p);
    end;
  finally
    Malloc.Free(FolderPidl);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  SelFileList: TStrings;
  I: Integer;
  DataObject: IDataObject;
  Effect: Integer;
  CLSID_SendMail: TGUID;
  DT: IDropTarget;
  P: TPoint;
begin
  CLSID_SendMail := StringToGUID('{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}');
 
  with FileListBox1 do
  begin
    SelFileList := TStringList.Create;
    try
      SelFileList.Capacity := SelCount;
      for i := 0 to FileListBox1.Items.Count - 1 do
        if Selected[i] then
          SelFileList.Add(Items[i]);
      DataObject := GetFileListDataObject(Directory, SelFileList);
    finally
      SelFileList.Free;
    end;
    Effect := DROPEFFECT_NONE;
    CoCreateInstance(CLSID_SendMail, nil, CLSCTX_ALL, IDropTarget, DT);
    DT.DragEnter(DataObject, MK_LBUTTON, P, Effect);
    DT.Drop(DataObject, MK_LBUTTON, P, Effect);
  end;
end;
 
end.



3
for i := 0 to FileCount - 1 do
begin
  if p^[i] <> nil then
    Malloc.Free(p^[i]);
end;

Coś Ci się źle kod skopiował do edytora - zamiast tego &lt;&gt; powinno być <>.

1 użytkowników online, w tym zalogowanych: 0, gości: 1