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

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


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

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


VBNet VBMania
Ссылки:

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

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

       Сегодня опять с интернетом проблемы: где-то телефонную линию переглючивает, когда на улице снег идет :(
    Читайте!


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




    Как при копировании файла, отобразить прогрессбар?

    .NET >>> WinForms

    Вопрос:

    Как при копировании файла, отобразить индикатор копирования?

    Ответ:

    Вариант с потоками позволит не "морозить" UI (user interface). Примерно так - создается поток который считывает и записывает файл кусками , уведомляя основной поток UI, который и обновляет индикатор. Если создать два потока - один считывает, другой записывает, т можно выиграть в скорости в случае когда источник и приемник файла не одно и тоже устройство. Но при этом нужна будет синхронизация чтения и записи. Наверно есть еще варианты

    Реализовать эфективное копирование не так просто. Поэтому если вы не очень хорошо знакомы с потоками то лучше положиться в этом на Shell

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shfileoperation.asp

    или скриптуtмые объекты

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/objects/folder/copyhere.asp?frame=true

    Пример копирования файла "C:\Install\some.rar" в корень G:
    Нужно добавить ссылку на shell32.dll

    Shell32.Shell shell = new Shell32.ShellClass();
    Shell32.Folder folder = shell.NameSpace(@"G:\");
    folder.CopyHere(@"C:\Install\some.rar",null);


    наверх


    Можно ли использовать под FW 1.0 DLL для FW 1.1?

    .NET

    Вопрос:

    Я написал dll на Framework 1.1. Можно ли её использовать под Framework 1.0?

    Ответ:

    Посмотрите официальную информацию о совместимости версий.

    Compatibility Considerations and Version Changes

    наверх


    Как вписать комментарий в пользовательский метод?

    .NET

    Вопрос:

    Как вписать комментарий в пользовательский метод?
    Родные классы\методы включают в себя комментарии, которые при наведении мыши показываются в строке подсказки. Можно ли вставить мои комментарии в метод\класс\тип?

    Ответ:

    Для С# и C++ модель такая:
    В коде перед объявлением методов, классов или, там переменных, вставляются комментарии вида:

    ///<summary>
    /// This method bails user off the system or ensures
    /// that he(she) not going to get there anymore.
    ///</summary>
    ///<param name=userID>Delinquent user ID</param>
    public void BailOff(int userID) {...}


    С момента создания этого комментария VS уже с готовностью демонстрирует подсказки в подсказках IntelliSense в любом месте решения (Solution). Если же надо, чтобы подсказки были видны и далее, когда сборка уже собрана и используется в готовом виде из других сборок, то все эти комментарии экспортируются в xml с помощью специальной опции компилятора /doc (напомню, речь идет о С#). В результате создается xml со структурой вида:

    <?xml version="1.0"?>
    <doc>
    <assembly>
    <name>organismbase</name>
    </assembly>
    <members>
    <member name="T:Action">
    <summary>
    <para>
    This class defines common properties for all commands/actions that can
    be assigned to a creature. These actions include movement, reproduction,

    eating, attacking, etc...
    </para>
    </summary>
    </member>
    <member name="P:Action.OrganismID">
    <summary>
    <para>
    The ID of the creature requesting the action. This will always be the
    GUID/ID for your creature.
    </para>
    </summary>
    <returns>
    System.String of the GUID/ID for the organism requesting the action.
    </returns>
    </member>
    ...


    И теперь достаточно положить этот xml рядом со сборкой, чтобы IntelliSense начал показывать подсказки по всем описанным элементам.

    Теоретически поведение сборки не зависит от того, на каком языке были исходники, так что можно предположить, что если рядом со сборокой, написанной на vb, положить правильный xml, то IntelliSense будет все равно, из какого языка она произошла. Проблема только в том, что xml придется писать ручками, либо с помощью add-in'ов сторонних фирм.
    Но в VB 2005 уже имеется встроенная поддержка XML-комментариев.

    наверх


    Как изменить ориентацию координат в .NET?

    .NET

    Вопрос:

    Как изменить ориентацию координат в .NET? В VB6 было так:

    pict.Scale (0, pict.ScaleHeight) - (pict.ScaleWidth, 0)

    Ответ:

    Свойство Transform класса Graphics.

    наверх


    Проблема с событиями в .NET Remoting

    .NET

    Вопрос:

    Есть проблема с генерацией событий для клиентов удаленного объекта в VB .NET.

    При вызове метода на сервере, инициируется событие, например так:

    public sub Submit()
        raiseevent MySubmitEvent( me, new eventargs() )
    end sub


    А клиенты, которые имеют ссылку на удаленный объект, получают это событие. Проблема в том, что если один из клиентов отключается аварийно (без соответствующего вызова RemoveHandler), то остальные клиенты при последующей генерации этого события получают исключение.

    Я видел пример на C#, как избежать такой ситуации. Там на сервере событие инициировалось для каждого клиента отдельно в блоке try...catch:

    public void Submit(){
        if( mysubmitEventHandler != null ){
            delegate[] invList = mysubmitEventHandler.GetInvocationList()
            for each delegate d in invList{
                try
                    d.Invoke( this, new eventargs )
                catch
            }
        }
    }


    Можно ли как-нибудь проделать такое же и в VB.NET?

    Ответ:

    Yадо объявлять переменную без ключевого слова Еvent. Только клиенты теперь подписываются на событие сервера, при помощи метода Delegate.Combine( ... ), а не AddHandler. По крайней мере, это работает.

    Сервер:

    public class CMyRemote
    inherits MarshalByRefObject

    public delegate sub mysubmitEventHandler( sender as Object, e as EventArgs )
    public MySubmitEvent as mysubmitEventHandler

    public sub Submit()
    if not( MySubmitEvent is nothing ) then
    dim aInvList() as [delegate] = MySubmitEvent.GetInvocationList()
    dim d as [delegate]
    for each d in aInvList
    try
    ' вызывается для каждого клиента, подписавшегося на событие
    ' если один из клиентов аварийно завершит свою работу, то будет
    инициировано исключение...
    d.DynamicInvoke( new Object(){ me, new eventargs() } )
    catch e as Exception
    MySubmitEvent = system.Delegate.Remove( MySubmitEvent, d )
    end try
    next
    end if
    end sub
    End Class


    Клиент:

    public class MyClient
    inherits MarshalByRefObject

    public shared sub Main()
    ConfigureRemoteServer()

    dim ro as New MyRemoteAssm.CMyRemote
    dim d as MyRemoteAssm.CMyRemote.mysubmitEventHandler = AddressOf me.MyCallbackFunc

    ro.MySubmitEvent = system.Delegate.Combine( ro.MySubmitEvent, d )
    console.WriteLine( "подключение к удаленному объекту прошло успешно!...")
    ro.Submit()
    console.ReadLine()
    ro.MySubmitEvent = system.Delegate.Remove( ro.MySubmitEvent, d )
    End Sub

    public sub ConfigureRemoteServer()
    RemotingConfiguration.Configure( "..\ClientConsole.exe.config" )
    End Sub

    public sub MyCallbackFunc( o as Object, e as EventArgs )
    console.WriteLine( "событие получено..." )
    End Sub

    End Class


    наверх


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

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

    Вопросы:


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

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

       Как найти CRC файла?


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

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

       Есть чужая форма, на которой находятся объекты (меня интересуют Labels). Как мне получить название надписи или другого объекта или записать данные в текстовое поле?


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

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

       Можно ли как-нибудь принудительно заставить программу работать в файле подкачки?


    Автор вопроса: Андрей Чуднов

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

       Подскажите пожалуйста, как средствами VB определить наличие в системе кодеков и какие установлены.


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

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

       Как можно иямени расстояние между штришами при рисовании в PictureBox например, окружности, при Fillstyle="vbHorizontal" или других способах яаливки?
    Т.к. при выводе на печать расстояние сильно уменьшается :(


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

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

       Помогите заставить прогу выглядеть по XP-шному (под XP разумеется).
    Слыхал о редакторах ресурсов, о каких-то манифестах, но что и к чему, совсем не понимаю.
    Чувствую, что во всем этом скрыто много интереснейших возможностей ;-)


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

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

       Люди, у кого-нибудь есть какая-нибудь информация, как стать сертифицированным специалистом по VB, VB.NET?


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

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

       Какая программа, включает все dll и ocx в exe'шник, чтобы на других компьютерах всё работало? Пробовал использовать VB-PowerWrap Version 1.7 - не работает. Если можно, ссылку.


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

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

       При изменении размеров формы сам меняю размеры всех объектов и их координаты, может есть другой, более рациональный (автоматический) способ?




    Ответы:


    Вопрос:

       Как лучше всего проверить, поменял ли пользователь время и дату? (Нужно для написания shareware).

    Ответ:

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

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


    Вопрос:

       Нужно сделать программу, которая открывала бы документ Word, заменяла символы, печатала всё это в 3-х экземплярах и завершала свою работу.

    Ответ:

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

    Dim aa As New Word.Application
    Dim aa2 As New Word.Document
    Set aa2 = aa.Documents.Open("c:\1.doc")
    aa.Visible = True
    aa2.Words.First.Text = "asdasd"
    aa.PrintOut , , , , , , , 3

    Подключи ссылку MS word 11.


    Вопрос:

       Хотелось бы высказать несколько мыслей по поводу следующего вопроса:
    Есть N чисел. Как найти 3 числа, произведение которых максимальное?

    В рассылке было дано пять ответов, но, к сожалению, ни один из них не является правильным.

    Во-первых, произведение трёх максимальных чисел не обязательно будет максимальным. Например:

    1, 5, 8, -10, 6, -4

    Очевидно, что максимальное произведение дадут числа 8, -10, -4, а не 5, 8, 6.

    Во-вторых, ответы, предложенные "Ольга" и "C...R...a...S...H" находят максимальное произведение, но не находят самих чисел.

    Так что, делаем выводы...

    Ответ:

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

    dim m(n) as integer

    max=m(0)
    for i=0 to n
       for j=i+1 to n
         for k=j+1 to n
           if m(i)*m(j)*m(k)>max then max=m(i)*m(j)*m(k)
         next
       next
    next

    Если ты уже сам не в состоянии переделать данный тебе алгоритм то смотри как это надо сделать:

    dim m(n) as integer
    dim MaxI,MaxJ,MaxK
    max=m(0)
    for i=0 to n
       for j=i+1 to n
         for k=j+1 to n
           if m(i)*m(j)*m(k)>max then
              max=m(i)*m(j)*m(k)
                   MaxI=m(i)
                   MaxJ= m(j)
                   MaxK = m(k)
           end if
         next
       next
    next

    Выражаю свое недовольство таким ответом, на предоставленную тебе Пащенко А. помощь. В рассылке не проводится тест, а ответы, которые тут даются, публикуются только ради того чтобы помочь (если это возможно). И писать ответ типа: «че вы тут мне впариваете» меня, по крайней мере, обескуражил. И ты бы, Пащенко А., просто попросил бы исправить ответы (т.к. это сделать не составляет большого труда). А «Так что, делаем выводы...» - считаю эту фразу неуместной!



    Ответ:

    Автор ответа: Ольга

    Если максимум найден, то и числа определить не трудно, достаточно просто их запомнить.
    Это очевидно и понятно каждому.
      
    А вы что, экзаменируете нас на внимательность прочтения вопроса?


    Вопрос:

       Как сделать неограниченный Undo/Redo для текста?

    Ответ:

    Автор ответа: Тоша

    Используем динамический список :)


    Вопрос:

       Est printer Barcode ya pisal takoye code:

    Private Sub Command1_Click()
    Open "lpt1" For Output As #1
      Print #1, " " & Me![ITEM#]
      Print #1, " " & Me![DESC]
      Print #1, " " & Me![LIST_PRICE]
      Close #1
    End Sub

    Ya hotel pechatat kakoye-to text tolka ne na angliskom naprimer russki ili arabski,to dayot zakalaki
    Kak ya Magu vibrat font chtobi pechatal provel'na?
    Printer imeet svoye software i pechataet arabski normal'no, a cherez moye code ne poluchitsa.

    Ответ:

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

    Вывод на LPT1 сдесь явно не поможет. А вот объект Printer, думаю то, что надо.

    'устанавливаешь название и размер шрифта,
    'которым будешь выводить на печать
    Printer.Font.Name = "Courier New"
    Printer.Font.Size = 12
    'УСТАНАВЛИВАЕШЬ КОДИРОВКУ (ЯЗЫК ШРИФТА)
    'в данном случаи русскую
    Printer.Font.Charset = 204
    'И выводи себе на принтер все, что надо
    Printer.Print "Русский текст"
    Printer.EndDoc

    Такой пример подходит не только к LPT-принтеру. Выводит на принтер по умолчанию.
    Чтоб выбрать, на какой принтер печатать, используй CommonDialog

    CommonDialog1.ShowPrinter


    Вопрос:

       Как отправить почту на ящик незаметно для пользователя?

    Ответ:

    Автор ответа: Михаил

    Писал уже в рассылке, но повторюсь.

    Создаем на форме объект Winsock1.

    Public Const mail_server_ip = "127.0.0.1", mail_server_port = 25
    Public connected as boolean
    Sub Form1_Load()
    src = inputbox("Please, enter source mail-box")
                 rcpt = inputbox("Please, enter recipient mail-box")
                 msg=inputbox("Please enter your message")
      
    1 connected=false
    ws.connect mail_server_ip, mail_server_port
    if wait (0.1)=false then
    ws.close
    k=k+1
    if k>5 then msgbox ("Cann't connected mail server " + mail_server_ip + ":" +
    ltrim(str(mail_server_port))): exit sub
    goto 1
                 end if
                 k=0
    2 connected=false
    ws.senddata "HELO 127.0.0.1"+vbcrlf
                 if wait(0.1)=false then
                             k=k+1
                             if k>5 then msgbox("Data send error"):exit sub
                             goto 2
                 end if
                 3 k=0
    connected=false
                 ws.senddata "MAIL FROM:"+ src+vbcrlf
                 if wait (0.1) = false then
                             k=k+1
                             if k>5 then msgbox("Data send error"): exit sub
                             goto 3
                 end if
                 4 k=0
                 connected=false
                 ws.senddata "PASS "+rcpt + vbcrlf
                 if wait(0.1)=false then
                             k=k+1
                             if k>5 then msgbox("Data send error"):exit sub
                             goto 4
                 end if
                 5 k=0
    connected=false
    ws.senddata "DATA"+vbcrlf
                 if wait(0.1)=false then
                             k=k+1
                             if k>5 then msgbox("Data send error"):exit sub
                             goto 5
                 end if
                 6 k=0
    Connected=false
    ws.senddata msg+vblf+"."+vbcrlf+"QUIT"+vbcrlf
                 if wait(0.3)=false then
                             k=k+1
                             if k>5 then msgbox("Data send error"):exit sub
                             goto 6
                 endif
    msgbox("Ready!")

    End Sub

    Function wait (sec) as boolean
    wait=false
    x=timer
    do
    if connected=true then wait=true: exit function
    doevents
    loop while timer-x End Function

    Sub ws_connect()
    Connected = true
    End Sub

    Sub ws_SendComplete()
    Connected=true
    End sub


    Вопрос:

       Программируя под VB столкнулся с проблемой: если в теле программы
    попадается большой цикл, программа использует чуть ли не все системные
    ресурсы (что тормозит комп). Может можно сделать как-нибудь небольшое
    прерывание в самом коде программы, не прибегая к GoTo, чтобы хотя бы снизить
    торможение?

    Ответ:

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

    Вызывай команду DoEvents.
    Но лучше счделай примерно так:

    For i = 0 To 1000000
    If i Mod 100 = 0 Then
         DoEvents
    End If
    Next i

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



    Ответ:

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

    Используйте DoEvents. Например:

    For a=1 to 100000
    DoEvents
    ...
    ...
    next a



    Ответ:

    Автор ответа: Ольга

    Вставьте в цикл DoEvents, тогда компьютер будет обрабатывать всякие другие события в цикле, а не ждать его завершения.



    Ответ:

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

    Да такое часто бывает, особенно если в длинном цикле есть еще
    встроенные более маленькие циклы. Проще всего сделать:
    - поставить внутри маленького цикла, который находится в длинном цикле оператор DoEvents и программа встретив его будет отдавать ресурсы на время системе, которая в свою очередь сама ими и распорядится, после чего снова вернется в твою программу :)

    Посложнее:
    - пользоваться переключением приоритета процесса (перед циклом на низкий, после на нормальный - напиши мне на мыло я тебе скину, как это делается (на WinAPI)
    - если у тебя тормозится потому что есть вывод на экран большой текстовой информации, напр. в RTF, и ты просто ее печатаешь (но в принципе она тебе нужна только для отображения, а не для обработки), то проще остановить вывод на экран во время цикла, а в конце цикла его включить, и покажется уже готовая текстовая информация (если не знаешь как, сбрось мне вопрос на мыло с уточнением какой способ тебе нужен или более конкретно, что цикл выполняет).




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

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

    наверх


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

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

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

    В избранное