VBA имеет Структуру Словаря?

Вот как я отправляю электронное письмо с вложениями (доказано, что оно работает с вложениями различных типов MIME, даже в одном и том же письме) и разрешает только приложения электронной почты (также есть решение для случаев, когда ни одно приложение не поддерживает «mailto»). Сначала мы пытаемся получить действия, которые поддерживают формат mailto:. Если ничего не найдено, мы получаем все действия, которые поддерживают тип MIME message/rfc822. Мы выбираем приложение по умолчанию (если есть по умолчанию) или разрешаем пользователю выбирать из доступных приложений. Если ни одно приложение не поддерживает mailto: и message/rfc822, то мы используем средство выбора по умолчанию.

public static void sendEmail(final Context p_context, final String p_subject, final String p_body, final ArrayList<String> p_attachments)
{
    try
    {
        PackageManager pm = p_context.getPackageManager();
        ResolveInfo selectedEmailActivity = null;

        Intent emailDummyIntent = new Intent(Intent.ACTION_SENDTO);
        emailDummyIntent.setData(Uri.parse("mailto:some@emaildomain.com"));

        List<ResolveInfo> emailActivities = pm.queryIntentActivities(emailDummyIntent, 0);

        if (null == emailActivities || emailActivities.size() == 0)
        {
            Intent emailDummyIntentRFC822 = new Intent(Intent.ACTION_SEND_MULTIPLE);
            emailDummyIntentRFC822.setType("message/rfc822");

            emailActivities = pm.queryIntentActivities(emailDummyIntentRFC822, 0);
        }

        if (null != emailActivities)
        {
            if (emailActivities.size() == 1)
            {
                selectedEmailActivity = emailActivities.get(0);
            }
            else
            {
                for (ResolveInfo currAvailableEmailActivity : emailActivities)
                {
                    if (true == currAvailableEmailActivity.isDefault)
                    {
                        selectedEmailActivity = currAvailableEmailActivity;
                    }
                }
            }

            if (null != selectedEmailActivity)
            {
                // Send email using the only/default email activity
                sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, selectedEmailActivity);
            }
            else
            {
                final List<ResolveInfo> emailActivitiesForDialog = emailActivities;

                String[] availableEmailAppsName = new String[emailActivitiesForDialog.size()];
                for (int i = 0; i < emailActivitiesForDialog.size(); i++)
                {
                    availableEmailAppsName[i] = emailActivitiesForDialog.get(i).activityInfo.applicationInfo.loadLabel(pm).toString();
                }

                AlertDialog.Builder builder = new AlertDialog.Builder(p_context);
                builder.setTitle(R.string.select_mail_application_title);
                builder.setItems(availableEmailAppsName, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, emailActivitiesForDialog.get(which));
                    }
                });

                builder.create().show();
            }
        }
        else
        {
            sendEmailUsingSelectedEmailApp(p_context, p_subject, p_body, p_attachments, null);
        }
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Can't send email", ex);
    }
}

protected static void sendEmailUsingSelectedEmailApp(Context p_context, String p_subject, String p_body, ArrayList<String> p_attachments, ResolveInfo p_selectedEmailApp)
{
    try
    {
        Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);

        String aEmailList[] = { "some@emaildomain.com"};

        emailIntent.putExtra(Intent.EXTRA_EMAIL, aEmailList);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, null != p_subject ? p_subject : "");
        emailIntent.putExtra(Intent.EXTRA_TEXT, null != p_body ? p_body : "");

        if (null != p_attachments && p_attachments.size() > 0)
        {
            ArrayList<Uri> attachmentsUris = new ArrayList<Uri>();

            // Convert from paths to Android friendly Parcelable Uri's
            for (String currAttachemntPath : p_attachments)
            {
                File fileIn = new File(currAttachemntPath);
                Uri currAttachemntUri = Uri.fromFile(fileIn);
                attachmentsUris.add(currAttachemntUri);
            }
            emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachmentsUris);
        }

        if (null != p_selectedEmailApp)
        {
            Log.d(TAG, "Sending email using " + p_selectedEmailApp);
            emailIntent.setComponent(new ComponentName(p_selectedEmailApp.activityInfo.packageName, p_selectedEmailApp.activityInfo.name));

            p_context.startActivity(emailIntent);
        }
        else
        {
            Intent emailAppChooser = Intent.createChooser(emailIntent, "Select Email app");

            p_context.startActivity(emailAppChooser);
        }
    }
    catch (Exception ex)
    {
        Log.e(TAG, "Error sending email", ex);
    }
}
257
задан DaveInCaz 18 June 2015 в 02:32
поделиться

3 ответа

Да

Установить ссылку на среду выполнения сценариев MS («Среда выполнения сценариев Microsoft»). В соответствии с комментарием @ regjo перейдите в Инструменты-> Ссылки и установите флажок «Microsoft Scripting Runtime».

References Window

Создайте экземпляр словаря, используя приведенный ниже код:

Set dict = CreateObject("Scripting.Dictionary")

или

Dim dict As New Scripting.Dictionary 

Пример использования:

If Not dict.Exists(key) Then 
    dict.Add key, value
End If 

Дон не забудьте установить для словаря значение Nothing , когда вы закончите его использовать.

Set dict = Nothing 
332
ответ дан 23 November 2019 в 02:43
поделиться

VBA не имеет внутренней реализации словаря, но из VBA вы все равно можете использовать объект словаря из библиотеки времени выполнения сценариев MS.

Dim d
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "aaa"
d.Add "b", "bbb"
d.Add "c", "ccc"

If d.Exists("c") Then
    MsgBox d("c")
End If
43
ответ дан 23 November 2019 в 02:43
поделиться

Да. Для VB6 , VBA (Excel) и VB.NET

6
ответ дан 23 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: