Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Visual Basic: новости сайтов, советы, примеры кодов. Выпуск 319.


Информационный Канал Subscribe.Ru

Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 319.


VBNet VBMania
Ссылки:

  • GotDotNet
  • Улицы VB
  • Азбука VB
  • VB по русски
  • MDesign
  • DanSoft
  • Хрестоматия VB
  • VBCoder
  • Господа, читайте MSDN!

    Несколько слов от автора:

       Завтра еду на областную олимпиаду по информатике :)
    Читайте!


    Содержание выпуска




    Как сделать, чтобы работала одна копия программы?

    .NET >>> WinForms

    Вопрос:

    Как сделать, чтобы в данный момент работала только одна копия программы?

    Ответ:

    using System;
    using System.Threading;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;

    class MyApplication: Form
    {
        public static void Main()
        {
            if (CheckOneInstance.IsInstanceExist(true))
                return;
            Application.Run(new MyApplication());
        }

        sealed class CheckOneInstance
        {
            static Mutex mutex;
             
            //Создавать экземпляры этого класса нет смысла
            CheckOneInstance()
            {
            }

            public static bool IsInstanceExist(bool activateFirstInstance)
            {
                bool createdNew;
                mutex = new Mutex(false, "My Mutex Name", out createdNew);
                if (!createdNew)
                {
                    if (!activateFirstInstance)
                        return true;
                    //получаем имя нашего процесса (название файла без
    расширения '.exe')
                    string processName =
    Process.GetCurrentProcess().MainModule.ModuleName;
                    processName = processName.Substring(0,
    processName.IndexOf(".exe"));

                    Process currentProcess = Process.GetCurrentProcess();

                    //перебираем все процессы с искомым именем
                    foreach(Process process in
    Process.GetProcessesByName(processName))
                    {
                        //текущий экземпляр нас не интересует
                        if (process.Id == currentProcess.Id)
                            continue;

                        //могут быть разные приложения с одинаковым именем
                        //исполняемого файла. Проверяем что-бы это был 'наш'
    файл
                        if (process.MainModule.FileName !=
    currentProcess.MainModule.FileName)
                            continue;

                        //Активизируем основное окно приложения
                        if (IsIconic(process.MainWindowHandle))
                            ShowWindow(process.MainWindowHandle,
    SW_RESTORE);
                        else
                            SetForegroundWindow(process.MainWindowHandle);

                        break;
                    }
                    return true;
                }
                return false;
            }

            [DllImport("User32.dll")]
            static extern bool SetForegroundWindow(IntPtr hWnd);

            [DllImport("User32.dll")]
            static extern bool IsIconic(IntPtr hWnd);

            [DllImport("User32.dll")]
            static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
         
            const int SW_RESTORE = 9;
        }
    }


    наверх


    Как вызвать Application.DoEvents из Class Library?

    .NET >>> WinForms

    Вопрос:

    В solution 2 проекта: Win application и Class library. Из Win application я вызываю метод класса, расположенного в class library. Этот метод выполняется очень долго (несколько минут). Пока он выполняется, моя прога "висит". Как можно сделать, чтобы во время выполнения метода прога реагировала на действия пользователя? Хотел вызывать из метода System.Windows.Forms.Application.DoEvents(), но System.Windows из class library не виден. Как быть?

    Ответ:

    А что мешает добавить ссылку на Windows.Forms в class library и спокойно пользоваться DoEvents?
    Есть другой вариант: написать Event/Delegate, который вызывался бы в приложении, а в нем, в свою очередь, вызывать DoEvents. Тогда можно и ссылку на Windows.Forms не добавлять.

    наверх


    Как в ListView скрыть столбец?

    .NET >>> WinForms

    Вопрос:

    Как можно в ListView скрыть столбец? То есть не удалить, а именно скрыть, чтобы потом можно было опять показать.

    Ответ:

    Предлагаю такой подход: у соответствующего столбца выставляем Width = 0, и осталось только запретить изменять ширину этого столбца. А когда нужно, опять отображаем столбец, устанавливая его Width, и разрешаем менять ширину.

    наверх


    Как по ip определить hostname?

    .NET

    Вопрос:

    Как по ip определить hostname (на клиентской машине, DNS настроен)?

    Ответ:

    Dns.GetHostByAddress()

    наверх


    Можно ли в ListViewSubItem отобразить картинку?

    .NET >>> WinForms

    Вопрос:

    Можно ли в ListViewSubItem отобразить картинку?

    Ответ:

    Предлагаю сделать наследника от ListView и рисовать в перекрытом методе WndProc() при получении сообщения WM_PAINT. Для простоты примера здесь жестко прописана прорисовка ячейки, находящейся в 1-ом столбце 0-го item'a.

    class MyListView: ListView
    {
        const string imageFile = fileName;
        Image image = Image.FromFile(imageFile);
        const int WM_PAINT = 0x000F;

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_PAINT)
            {
                //Позволяем ListView прорисовать себя полностью
                base.WndProc(ref m);
                //Получаем координаты прямоугольника нужной нам ячейки
                RECT rect = new RECT(1, LVIR_BOUNDS);
                IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(rect));

                Marshal.StructureToPtr(rect, pointer, true);
                SendMessage(m.HWnd, LVM_GETSUBITEMRECT, IntPtr.Zero,
    pointer);
                rect = (RECT)Marshal.PtrToStructure(pointer, typeof(RECT));
                //И прорисовываем нашу картинку
                IntPtr hDC = GetDC(m.HWnd);
                Graphics g = Graphics.FromHdc(hDC);
                g.DrawImage(image, rect.Left, rect.Top, rect.Width,
    rect.Height);
                g.Dispose();
                ReleaseDC(m.HWnd, hDC);
                return;
            }
            base.WndProc(ref m);
        }

        [StructLayout(LayoutKind.Sequential)]
        struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;

            public int Width
            {
                get
                {
                    return Right - Left;
                }
            }

            public int Height
            {
                get
                {
                    return Bottom - Top;
                }
            }

            public RECT(int top, int left)
            {
                Top = top;
                Left = left;
                Bottom = 0;
                Right = 0;
            }
        }

        //Необходимые Win32 функции и константы

        [DllImport("User32.dll")]
        static extern IntPtr GetDC(IntPtr hWnd);

        [DllImport("User32.dll")]
        static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

        [DllImport("User32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr
    wParam, IntPtr lParam);

        const int LVM_FIRST = 0x1000;
        const int LVM_GETSUBITEMRECT = LVM_FIRST + 56;
        const int LVIR_BOUNDS = 0;
    }


    Думаю, этот пример можно использовать как отправную точку - здесь еще нужно усовершенствовать обработчик WM_PAINT, чтобы исключить регион(ы), занимаемый прорисовываемыми ячейками из 'update' региона всего ListView (так мигания не будет заметно при изменении размеров столбца), и, конечно же, реализовать прорисовку изображений во всех нужных ячейках, а не только в одной, как в этом примере.

    наверх


    Вопрос/Ответ

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Вопросы:


    Автор вопроса: Norma

    Ответ ожидается по этому адресу

       Подскажите пожалуйста, как на VB .NET узнать физические границы печати принтера


    Автор вопроса: psinetron

    Ответ ожидается по этому адресу

       Какой ActiveX нужен для получения почты (если можно пришлите исходник)?


    Автор вопроса: psinetron

    Ответ ожидается по этому адресу

       Как позвонить на другой комп, используя телефон (и соответственно установить с ним связь), или есть ли у кого-нибудь исходник чего-нибудь типа HyperTerminal'a?


    Автор вопроса: psinetron

    Ответ ожидается по этому адресу

       Как программа может скопировать сама себя (бея создания bat файла)?


    Автор вопроса: psinetron

    Ответ ожидается по этому адресу

       Помогите написать сканер портов.


    Автор вопроса: NeoN

    Ответ ожидается по этому адресу

       Делаю так:
      
    Dim WordApplication As Word.Application
      
    Private Sub PrintThis_Click()
    Set WordApplication = New Word.Application
    Set AppDoc = WordApplication.Documents.Open("C:\1.doc")
    WordApplication.Quit
    Set WordApplication = Nothing
    End Sub

    Вылетает ошибка автоматизации как раз на строке
    Set WordApplication = New Word.Application
    У меня стоит Word XP. Библиотека подключена. Почему вылетает ошибка и как это исправить?


    Автор вопроса: Сергей

    Ответ ожидается по этому адресу

       Как максимально быстро загрузить очень большое изображение? Как работать с TWAIN?




    Ответы:


    Вопрос:

       Нужно запущенную программу (саму себя) скопировать в папку Windows. Как это сделать?

    Ответ:

    Автор ответа: Neco

    FileCopy App.Path + "\" + App.EXEName + ".exe", "c:\windows\" + App.EXEName + ".exe"



    Ответ:

    Автор ответа: Хатламаджиян

    Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
    Private Function WinDir() As String
         Dim nWD As Integer
         WinDir = String$(255, vbNullChar)
         nWD = GetWindowsDirectory(WinDir, 255)
         WinDir = Left$(WinDir, nWD)
         If Right$(WinDir, 1) <> "\" Then WinDir = WinDir & "\"
    End Function
    Private Sub Form_Load()
         Dim AppPath As String
         AppPath = App.Path
         If Right$(AppPath, 1) <> "\" Then AppPath = AppPath & "\"
         FileCopy AppPath & App.EXEName & ".exe", WinDir & App.EXEName & ".exe"
    End Sub


    Вопрос:

       Как написать сервис на VB?

    Ответ:

    Автор ответа: Neco

    Сразу хочу заметить, что сервис тоже виден в процессах. Просто сам я тоже когда-то всё пытался это замутить, проводя параллели между RegisterServiceProcess в 98-м и её отсутствием в ХР. А когда нашёл, был очень разочарован. Могу и тебя разочаровать, напиши куда выслать. 8) А вообще лучше эту хрень писать в BorlandC++Builder или в делфях, что одно и то же...



    Вопрос:

       Возможнно ли организовать сортировку файлов, отображаемых в FileListBox, по имени файла, по типу файла, по дате создания файла, по дате модификации и т.д.?

    Ответ:

    Автор ответа: Neco

    Гораздо проще использовать стандартные способы сортировок (шелла, пузырьковая, выбором, быстрая) в обычном List'е. Вот сортировка выбором:

    Public Sub SelectionSort(List() As String, Optional ByVal min As Long = -1, Optional ByVal max As Long = -1)
         Dim i As Long ', min As Long
         Dim j As Long ', max As Long
         Dim best_value As String
         Dim best_j As Long
         On Error GoTo WasErr
         If min = -1 Or max = -1 Then
             min = LBound(List)
             max = UBound(List)
         End If

         For i = min To max - 1
             ' Найти наименьший элемент из оставшихся.
             best_value = List(i)
             best_j = i
             For j = i + 1 To max
                 If StrComp(List(j), best_value) = -1 Then
                     best_value = List(j)
                     best_j = j
                 End If
             Next j

             ' Поместить элемент на место.
             List(best_j) = List(i)
         List(i) = best_value
         Next i
    WasErr:
    End Sub

    А для больших массивов надо использовать быструю...



    Ответ:

    Автор ответа: Хатламаджиян

    Но можно написать самому функци(ю,и) сортировки, брать данные из FileListBox'а, сортировать и заносить результат в обычный ListBox.



    Ответ:

    Автор ответа: C...R...a...S...H

    Создай Listview пройдись по списку файлов и получи нужные для сортировки данные при помощи FileDateTime, FileLen. А уж ListView позволит тебе соритировать данные как ты хочешь.


    Вопрос:

       Подскажите пожалуйста, как можно привязать прогу к флешке? Чтобы при копировании на диск или на другую флешку, она не запускалась. Получить серийный номер, как у диска, не удается. Может кто знает выход?

    Ответ:

    Автор ответа: C...R...a...S...H

    Попробуй воспользоваться этой API финукцией:

    Public Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long



    Ответ:

    Автор ответа: Neco

    Просто к флэшке можно, наверное, привязаться через GetDriveType, а вот по вопросу "к конкретной флэшке" идей пока нет.


    Вопрос:

       Помогите на VBScript напечатать каталог. Такой привычный вариант почему-то не работает (несоответствие типа для функции Dir, а тип для переменной dim hrf as string почему-то не описывается):

    <%
    ' выводим весь каталог

    hrf1="http://oly/NewsPages/*.*"
    hrf = dir(hrf1)
    do until hrf=""
       Response.Write ("<P>" & hrf &"</P>")
       hrf = dir
    loop
    %>

    Ответ:

    Автор ответа: Щелканов Александр

    Наверное, нужно указать не
    hrf1="http://oly/NewsPages/*.*"
    , а
    hrf1=Server.MapPath("NewsPages") & "*.*"


    Вопрос:

       С помощью каких API функций можно минимизировать открытые окна? Если можно, кусок кода или ссылку.

    Ответ:

    Автор ответа: Neco

    SetWindowLong hWnd, gwl_style, ws_minimize




    Можете заполнить эту форму, либо отослать вопрос СЮДА

    Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел

    http://subscribe.ru/
    http://subscribe.ru/feedback/
    Подписан адрес:
    Код этой рассылки: comp.soft.prog.vbnewsadvices
    Отписаться

    В избранное