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

Программирование (VB,C#,ASP,.NET): новости, советы, примеры



Выпуск # 179


http://www.kbyte.ru/

 

Новый выпуск!

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

 

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

Система ЭКСПЕРТ

    Вопрос #000438: Вопрос по С#

    Вопрос #000437: Содержимое динамически созданных элементов

    Вопрос #000436: Вопрос по C#

    Вопрос #000433: Расширенное воспроизведение звука

    Вопрос #000429: Как узнать IP-адрес?

Последнее на форумах

    У кого из нас странности: у меня или у конрола?

    Управляемый плугин к QIP Infium

    VB6: Звук

    «Укорачивание» строки с тропинкой до файла

    Макрос в Excel

Последние статьи

    Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)

    Работа с SQL – Запросы

    Использование XML.Serialization

    Выбор языка программирования для научных работ (2-я редакция)

    Работаем с MIME

Интересные коды и решения

Юмор на Kbyte.Ru

 

Система ЭКСПЕРТ

 

Система «Эксперт» - уникальная система, которая поможет решить, если не все, то многие Ваши проблемы с программированием и разработкой! Если у Вас есть какой-либо вопрос по программированию или разработке, то Вы всегда можете задать его нашим Экспертам! При этом каких-либо особых действий от Вас не потребуется! Просто отправьте Ваш вопрос на адрес mailto:expert@kbyte.ru, в теме письма укажите тему вопроса, в тексте – сам вопрос, и все! Эксперты дадут Вам ответ в течение 12-24 часов, на тот адрес, с которого Вы отправите вопрос. Все проще простого! Никакой регистрации и заполнение бесконечных форм, никаких наездов, оскорблений и насмешек со стороны гуру, просто спросите и получите ответ ;-)


Вопрос #000438: Вопрос по С#

Автор вопроса: Sergey Guznenkov // 29.08.2007 / 06:13

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

Отвечает: EROS // 29.08.2007 / 20:11

Здравствуйте, Sergey Guznenkov

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


--
С уважением,
EROS mailto:eros@fromru.com

 

Вопрос #000437: Содержимое динамически созданных элементов

Автор вопроса: "Abu Ali" // 29.08.2007 / 06:13

Здравствуйте уважаемые Эксперты. Вопрос: Существует форма с динамечески созданными элеметами управления (ComboBox и TextBox ) frmBox. Из главной формы вызывается метод формы frmBox, который в зависимости от параметра, создает определенное количество ComboBox и TextBox. Потом при вызове из главной формы еще одного метода формы frmBox, который присваивает значения элементов управления переменным, при foreach (Control c in this.Controls) он не видит элементы созданные программно. Заранее благодарен

Отвечает: Алексей Немиро // 29.08.2007 / 07:58

Здравствуйте, Abu Ali!

Полагаю, проблема в том, что Вы создаете новый экземпляр формы frmBox,
который, естественно, не содержит динамически созданных элементов.

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

В будущем, вопросы без указания языка программирования, на рассмотрение приниматься не будут.

ЗЫ: Вы можете воспользоваться нашим
форумом для решения этой проблемы.
Для работы с форумом требуется
регистрация.
После регистрации, Вы можете подписать на Forum Mail Conference – это возможность работы с форумами сайта через E-Mail.
Подробности смотрите тут. (после подписки на FMC и добавления на форум нового сообщения через Web-интерфейс, Вам будет выслан шаблон письма для работы с форумами через E-Mail).




--
С наилучшими пожеланиями,
Немиро Алексей

 

Вопрос #000436: Вопрос по C#

Автор вопроса: Sergey Guznenkov // 29.08.2007 / 06:13

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

Есть главная форма, на ней присутствует несколько довольно больших таблиц,

потом я открываю другую форму (таких форм будет несколько) и там нужно

обработать данные из некоторых таблиц главной формы.

Заранее спасибо.

Отвечает: Алексей Немиро // 29.08.2007 / 07:45

Здравствуйте, Sergey!

Можно в первой форме создать свойство, через которое можно будет
получать и/или изменять параметры элементво формы. Например:

Form1
001:
002:
003:
004:
005:
public string FormTitle
{
 get { return this.Text; }
 set { this.Text = value; }
}


Далее, в Form2 можно написать:
001:
((Form1)Application.OpenForms["Form1"]).FormTitle = "Kbyte.Ru";

таким образом, заголовок Form1 будет изменен на "Kbyte.Ru".
Таким же образом можно сделать с любым другим свойством формы, или элементами формы.

Хотя, более правильней будет передавать второй форме указатель на
родителя, и уже через него работать с первой формой. Думаю, эту тему
будет правильней обсудить на форуме.


--
С наилучшими пожеланиями,
Немиро Алексей

 

Вопрос #000433: Расширенное воспроизведение звука

Автор вопроса: Arcady // 26.08.2007 / 15:00

Здравствуйте эксперт!

Вопрос:
Возможно-ли на Visual Basic 6.0 без использования посторонних библиотек (например, fmod.dll) реализовать воспроизведение звука "на своём канале"? То есть, создать (открыть) свой звуковой канал, чтобы воспроизводить в нём не только WAVE, но и, хотя бы MP3, и задавать для него громкость независимо от Windows? Например, как в Winamp, или в той-же библиотеке fmod.dll.

Заранее благодарен.

--------------------------------------
Категория: --- Visual Basic 5.0/6.0

Отвечает: Алексей Немиро // 26.08.2007 / 15:54

Здравствуйте, Arcady!

Стандартными средствами Visual Basic 6.0, без использования сторонних библиотек и компонентов, это сделать не возможно.

--
С наилучшими пожеланиями,
Немиро Алексей

 

Вопрос #000429: Как узнать IP-адрес?

Автор вопроса: Андрей // 24.08.2007 / 19:28

Как узнать IP-адрес активного интернет-подключения средствами VB6?

--------------------------------------
Категория: --- Visual Basic 5.0/6.0

Отвечает: Алексей Немиро // 26.08.2007 / 04:28

Здравствуйте, Андрей!

Создайте стандартный EXE-проект. Расположите на форме (Form) элемент Winsock (меню: Проект -> Компоненты -> Microsoft Winsock Control 6.0) и добавьте нижеследующий код.

001:
002:
003:
Private Sub Form_Load()
 MsgBox "Ваш IP: " & Winsock1.LocalIP
End Sub


--
С наилучшими пожеланиями,
Немиро Алексей

 


Чтобы задать Ваш вопрос, отправьте его на адрес expert@kbyte.ru

Раздел Эксперт на сайте Kbyte.Ru

Наверх

 

 

Последнее на форумах

У кого из нас странности: у меня или у конрола? | Автор: 5acred Phoenix
Добавлено: 29.08.2007 / 15:35 | ответов: 5 | просмотров: 53

Это опять я :-)

Из статьи MSDN выдрал пример написания собственного Command Prompt (TextBox, который редиректит введенные команды запущенному и скрытому cmd.exe).
Есть некоторые артефакты (в stdout возвращаются введенные команды; при наборе неверной команды — cmd.exe летит). Подскажите, пожалуйста, что не так...

Проект VB.NET: http://filehost.net.ru/3150957

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Алексей
Добавлено:29.08.2007 / 16:09
Интересный пример, как раз тут кто-то про консоль недавно спрашивал, но только на VB 6.0 :)

Насчет вылета, посмотрел поверхностно, действительно вылетает, почему
хз, надо более детально смотреть :) Могу предложить проверять процесс и если он отбросил копыта, запускать
заново :)


зы: 5acred Phoenix +unlim file size

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: 5acred Phoenix
Добавлено:29.08.2007 / 16:31
Могу предложить проверять процесс и если он отбросил копыта, запускать
заново :)

Кривое, конечно, решение... :))

зы: 5acred Phoenix +unlim file size

o_0

ЗЫ. Эту консольку, кстати, хочу прикрутить к Visual Studio IDE. Эдакий inline SDK Command Prompt :-)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: EROS
Добавлено:29.08.2007 / 21:02
А чего вы ожидали?? Обработка ошибок отключена! В результате мы имеем следующее: При возникновении ошибки процесс ее обрабатывает и пытается вывести сообщение об ошибке в свое окно ( а его-то нет!!! и при попытке вывести все это дело в ErrorStream все падает), а посколько RedirectStandardError для ProcessStartInfo в примере отключен, то процесс и вылетает с ошибкой.. Включи RedirectStandardError и будет процесс будет жить вечно :-)
А если еще прикрутишь вывод ErrorStream (обязательно через делегата надо делать т.к. это другой поток.. иначе получишь CrossThredException) то вообще будет тебе счастье!

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 4 | Автор: 5acred Phoenix
Добавлено:29.08.2007 / 21:13
Дельно, а главное объяснено :-) Большое спасибо :-)
А что делать с выводящимися cd и пр. командами, предваряемых квадратиком?

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 5 | Автор: EROS
Добавлено:29.08.2007 / 22:20
А что делать с выводящимися cd и пр. командами, предваряемых квадратиком?

Тут все очень просто.. Квадратик в самом начале есть не что иное как символ возврата каретки Chr(13).. потом идет твоя команда и в конце 2 байта это Chr(13) и Chr(10), что равняется переводу строки - vbNewLine ..
Могу предложить следующий вариант решения:
1. Создаешь строковую переменную уровня класса. В неё в процедуре OnKeyDown будешь записывать последнюю введенную команды. Таким образом у тебя всегда будет сохранена последняя команда..
2. В процедуре OnStdOut делаешь следующее:
- С помощью Trim() обрезаешь полученные данные. Эта команда удалит все непечатаемые символы первый квадратик и и последний перевод строки.. В итоге у тебя будет просто полученный текст.
- Делаешь проверку: Если полученные данные равны введенной команде, то заменяешь все эти данные на vbNewLine , либо просто игнорируешь (что больше нравится), а если не равны, то ничего не делаешь и все идет своим чередом

вот, собственно, и все..

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Управляемый плугин к QIP Infium | Автор: 5acred Phoenix
Добавлено: 28.08.2007 / 19:26 | ответов: 0 | просмотров: 23

Доброе время суток!

Задумал я извращенское дело :-)
Хочу написать хотя бы простенький плугин к QIP Infium'у. И всё бы да ничего... только пишу на .NET'е :-)

С этим связаны такие проблемы:
1) Нужно из DLL экспортировать функцию CreateInfiumPLUGIN
2) Смогут ли unmanaged интерфейсы, объявленные в SDK, найти своих управляемых «двойников»?

Пункт 1, как ни странно, решился. С помощью некоторых махинаций была выведена на свет управляемая сборка, экспортирующая(!) функцию CreateInfiumPLUGIN.
Инфа была взята здесь: http://www.blong.com/Conferences/BorConUK2002/Interop1/Win32AndDotNetInterop.htm

Интересует пункт 2.

Вот SDK, прилагаемый к кипу. Файл u_plugin_info.pas
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
{*************************************}
{                                     }
{       QIP INFIUM SDK                }
{       Copyright(c) Ilham Z.         }
{       ilham@qip.ru                  }
{       http://www.qip.im             }
{                                     }
{*************************************}

unit u_plugin_info;

interface

uses Windows, u_plugin_msg;

const
  QIP_SDK_VER_MAJOR = 1;
  QIP_SDK_VER_MINOR = 2;  

type
  {Plugin info}
  TPluginInfo = record
    DllHandle         : DWord;      //dll instance/handle will be updated by QIP after successful loading of plugin library
    DllPath           : PWideChar;  //this should be updated by plugin library after receiving PM_PLUGIN_LOAD_SUCCESS from QIP
    QipSdkVerMajor    : Word;       //major version of sdk for core compatibility check
    QipSdkVerMinor    : Word;       //minor version of sdk for core compatibility check
    PlugVerMajor      : Word;
    PlugVerMinor      : Word;
    PluginName        : PWideChar;
    PluginAuthor      : PWideChar;
  end;
  pPluginInfo = ^TPluginInfo;

  {Plugin specific options which will be saved in profile}
  TPluginSpecific = record
    Bool1       : Boolean;
    Bool2       : Boolean;
    Bool3       : Boolean;
    Bool4       : Boolean;
    Bool5       : Boolean;
    Bool6       : Boolean;
    Bool7       : Boolean;
    Bool8       : Boolean;
    Bool9       : Boolean;
    Bool10      : Boolean;
    Param1      : DWord;
    Param2      : DWord;
    Param3      : DWord;
    Param4      : DWord;
    Param5      : DWord;
    Param6      : DWord;
    Param7      : DWord;
    Param8      : DWord;
    Param9      : DWord;
    Param10     : DWord;
    Wstr1       : WideString;
    Wstr2       : WideString;
    Wstr3       : WideString;
    Wstr4       : WideString;
    Wstr5       : WideString;
    Wstr6       : WideString;
    Wstr7       : WideString;
    Wstr8       : WideString;
    Wstr9       : WideString;
    Wstr10      : WideString;
  end;
  pPluginSpecific = ^TPluginSpecific;    

  {QIP2Plugin instant message record}
  TQipMsgPlugin = record
    MsgType    : Byte;        //see below, MSG_TYPE_....
    MsgTime    : DWord;       //unix datetime, local time
    ProtoName  : PWideChar;
    SenderAcc  : PWideChar;
    SenderNick : PWideChar;
    RcvrAcc    : PWideChar;
    RcvrNick   : PWideChar;
    MsgText    : PWideChar;
    Blocked    : Boolean;     //received msg blocked by antispam
  end;
  pQipMsgPlugin = ^TQipMsgPlugin;
  
  {QIP gives to plugin this interface}
  IQIPPluginService = interface
    function  PluginOptions(DllHandle: LongInt): pPluginSpecific; stdcall;
    procedure OnPluginMessage(var PlugMsg: TPluginMessage); stdcall;
  end;
  pIQIPPluginService = ^IQIPPluginService;


  {Plugin gives to QIP this interface}
  IQIPPlugin = interface
    function  GetPluginInfo: pPluginInfo; stdcall;
    procedure OnQipMessage(var PlugMsg: TPluginMessage); stdcall;
  end;
  pIQIPPlugin = ^IQIPPlugin;


const
  {Messages qip <-> plugin}
  {All messages "plugin -> qip" have to be with actual PluginMsg.DllHandle parameter}
  {=== Plugin main messages =======}
  PM_PLUGIN_LOAD_SUCCESS    =  1; //qip -> plugin
  PM_PLUGIN_RUN             =  2; //qip -> plugin
  PM_PLUGIN_QUIT            =  3; //qip -> plugin
  PM_PLUGIN_ENABLE          =  4; //qip -> plugin
  PM_PLUGIN_DISABLE         =  5; //qip -> plugin
  PM_PLUGIN_OPTIONS         =  6; //qip -> plugin
  {=== Plugin specific messages ===}
  PM_PLUGIN_SPELL_CHECK     =  7; //qip -> plugin, WParam = PWideChar to checking word, LParam = MissSpelledColor (delphi TColor). Return LParam with own color if needed and Result = True if word misspelled.
  PM_PLUGIN_SPELL_POPUP     =  8; //qip -> plugin, WParam = PWideChar to misspelled word, LParam is PPoint where PopupMenu should be popuped (screen coordinates). Return Result = True to ignore qip default menu popup.
  PM_PLUGIN_SPELL_REPLACE   =  9; //plugin -> qip, WParam = PWideChar to right word which will replace old misspelled word. Qip will return Result = True if misspelled word was successfully replaced.
  PM_PLUGIN_XSTATUS_UPD     = 10; //plugin -> qip, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture will be removed.
  PM_PLUGIN_XSTATUS_GET     = 11; //plugin -> qip, core will return WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture not set by user.
  PM_PLUGIN_XSTATUS_CHANGED = 12; //qip -> plugin, user manually changed custom status picture/text, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture was removed by user.
  PM_PLUGIN_SOUND_GET       = 13; //plugin -> qip, if core returned WParam = True then qip sound enabled else sound disabled.
  PM_PLUGIN_SOUND_SET       = 14; //plugin -> qip, if WParam = True then qip will enable sound else will disable.
  PM_PLUGIN_SOUND_CHANGED   = 15; //qip -> plugin, user manually switched sound On/Off. if WParam = True the sound enabled.
  PM_PLUGIN_MSG_RCVD        = 16; //qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow core accept this msg else message will be IGNORED, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
  PM_PLUGIN_MSG_SEND        = 17; //qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow send this msg else user will not be able to send this message, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
  PM_PLUGIN_SPELL_RECHECK   = 18; //plugin -> qip, rechecks spelling for all message editing boxes
  PM_PLUGIN_MSG_RCVD_NEW    = 19; //qip -> plugin, notifier, qip received new message and its still not read by user. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message periodically (~400 msec) until user will open msg window and read this msg.
  PM_PLUGIN_MSG_RCVD_READ   = 20; //qip -> plugin, notifier, new received message has been read by user and qip core will stop notifing with PM_PLUGIN_MSG_RCVD_NEW message. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message only once after message or event will be read by user.
  //to be continued ...


  {QIP msg types}
  MSG_TYPE_UNK        = $00; //unknown msg type
  MSG_TYPE_TEXT       = $01;
  MSG_TYPE_CHAT       = $02;
  MSG_TYPE_FILE       = $03;
  MSG_TYPE_URL        = $04;
  MSG_TYPE_AUTH       = $05;
  MSG_TYPE_ADDED      = $06;
  MSG_TYPE_SERVER     = $07;
  MSG_TYPE_WEB        = $08;
  MSG_TYPE_CONTACTS   = $09;
  MSG_TYPE_AUTO       = $0A;
  MSG_TYPE_SERVICE    = $0B;
  MSG_TYPE_EMAIL      = $0C;
  MSG_TYPE_OFFMSG     = $0D;
  MSG_TYPE_AUTHREPLY  = $0E;



implementation

end.
Файл u_plugin_msg.pas
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
{*************************************}
{                                     }
{       QIP INFIUM SDK                }
{       Copyright(c) Ilham Z.         }
{       ilham@qip.ru                  }
{       http://www.qip.im             }
{                                     }
{*************************************}

unit u_plugin_msg;

interface

uses Windows;

type
  TPluginMessage = record
    Msg       : DWord;
    WParam    : Integer;
    LParam    : Integer;
    NParam    : Integer;
    Result    : Integer;
    DllHandle : DWord;   //Plugin dll handle, this value have to be always actual if plugin sending msg to qip core!
  end;

implementation

end.
Моя реализация. Stuff.QIP.Infium.SDK.vb
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
Imports System.Runtime.InteropServices

Namespace SacredPhoenix.Stuff.QIP.Infium.SDK

  Public Enum QIP_SDK_VER As Short
   MAJOR = 1
   MINOR = 2
  End Enum

  ' Plugin info
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TPluginInfo
   Public DllHandle As Integer ' dll instance/handle will be updated by QIP after successful loading of plugin library
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public DllPath As String ' this should be updated by plugin library after receiving PM_PLUGIN_LOAD_SUCCESS from QIP
   Public QipSdkVerMajor As Short ' major version of sdk for core compatibility check
   Public QipSdkVerMinor As Short ' minor version of sdk for core compatibility check
   Public PlugVerMajor As Short
   Public PlugVerMinor As Short
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public PluginName As String
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public PluginAuthor As String
  End Structure

  ' Plugin specific options which will be saved in profile
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TPluginSpecific
   Public Bool1, Bool2, Bool3, Bool4, Bool5, Bool6, Bool7, Bool8, Bool9, Bool10 As Boolean
   Public Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10 As Integer
   <MarshalAs(UnmanagedType.LPWStr)> _
   Public Wstr1, Wstr2, Wstr3, Wstr4, Wstr5, Wstr6, Wstr7, Wstr8, Wstr9, Wstr10 As String
  End Structure

  ' QIP2Plugin instant message record
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TQipMsgPlugin
   Public MsgType As MSG_TYPE
   Public MsgTime As Integer ' unix datetime, local time
   Public ProtoName As String
   Public SenderAcc As String
   Public SenderNick As String
   Public RcvrAcc As String
   Public RcvrNick As String
   Public MsgText As String
   Public Blocked As Boolean ' received msg blocked by antispam
  End Structure

  ' QIP msg types
  Public Enum MSG_TYPE As Byte
   UNK = &H0
   Text = &H1
   CHAT = &H2
   FILE = &H3
   URL = &H4
   AUTH = &H5
   ADDED = &H6
   SERVER = &H7
   WEB = &H8
   CONTACTS = &H9
   Auto = &HA
   SERVICE = &HB
   EMAIL = &HC
   OFFMSG = &HD
   AUTHREPLY = &HE
  End Enum

  ' QIP gives to plugin this interface
  Public Interface IQIPPluginService
   Function PluginOptions(ByVal DllHandle As Long) As TPluginSpecific
   Sub OnPluginMessage(ByVal PlugMsg As TPluginMessage)
  End Interface

  ' Plugin gives to QIP this interface
  Public Interface IQIPPlugin
   Function GetPluginInfo() As TPluginInfo
   Sub OnQipMessage(ByVal PlugMsg As TPluginMessage)
  End Interface

  <StructLayout(LayoutKind.Sequential)> _
  Public Structure TPluginMessage
   Public Msg As PM_PLUGIN
   Public WParam As Integer
   Public LParam As Integer
   Public NParam As Integer
   Public Result As Integer
   Public DllHandle As Integer ' Plugin dll handle, this value have to be always actual if plugin sending msg to qip core!
  End Structure

  ' Messages qip <-> plugin
  ' All messages "plugin -> qip" have to be with actual TPluginMessage.DllHandle parameter
  Public Enum PM_PLUGIN As Integer
   ' ======= Plugin main messages =======
   LOAD_SUCCESS = 1 ' qip -> plugin
   RUN = 2 ' qip -> plugin
   QUIT = 3 ' qip -> plugin
   ENABLE = 4 ' qip -> plugin
   DISABLE = 5 ' qip -> plugin
   OPTIONS = 6 ' qip -> plugin
   ' ======= Plugin specific messages =======
   SPELL_CHECK = 7 ' qip -> plugin, WParam = PWideChar to checking word, LParam = MissSpelledColor (delphi TColor). Return LParam with own color if needed and Result = True if word misspelled.
   SPELL_POPUP = 8 ' qip -> plugin, WParam = PWideChar to misspelled word, LParam is PPoint where PopupMenu should be popuped (screen coordinates). Return Result = True to ignore qip default menu popup.
   SPELL_REPLACE = 9 ' plugin -> qip, WParam = PWideChar to right word which will replace old misspelled word. Qip will return Result = True if misspelled word was successfully replaced.
   XSTATUS_UPD = 10 ' plugin -> qip, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture will be removed.
   XSTATUS_GET = 11 ' plugin -> qip, core will return WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture not set by user.
   XSTATUS_CHANGED = 12 ' qip -> plugin, user manually changed custom status picture/text, WParam = custom status picture number (from 0 to 35 or more if new custom status pics added), LParam = PWideChar of Status text (max 20 chars), NParam = PWideChar of status description text (max 512 chars). If WParam = 0 then custom status picture was removed by user.
   SOUND_GET = 13 ' plugin -> qip, if core returned WParam = True then qip sound enabled else sound disabled.
   SOUND_SET = 14 ' plugin -> qip, if WParam = True then qip will enable sound else will disable.
   SOUND_CHANGED = 15 ' qip -> plugin, user manually switched sound On/Off. if WParam = True the sound enabled.
   MSG_RCVD = 16 ' qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow core accept this msg else message will be IGNORED, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
   MSG_SEND = 17 ' qip -> plugin, WParam = pQipMsgPlugin, return result = True to allow send this msg else user will not be able to send this message, CAREFUL here! If you will add to LParam pointer to own widestring then original msg text will be replaced by yours own text.
   SPELL_RECHECK = 18 ' plugin -> qip, rechecks spelling for all message editing boxes
   MSG_RCVD_NEW = 19 ' qip -> plugin, notifier, qip received new message and its still not read by user. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message periodically (~400 msec) until user will open msg window and read this msg.
   MSG_RCVD_READ = 20 ' qip -> plugin, notifier, new received message has been read by user and qip core will stop notifing with PM_PLUGIN_MSG_RCVD_NEW message. WParam = PWideChar to accountname of sender, LParam = PWideChar to nickname of sender. Plugin will receive this message only once after message or event will be read by user.
   ' To be continued...
  End Enum

End Namespace

Colorized by: Eros.CodeSyntaxColor Engine
И файл ExamplePlugin.vb
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
Imports SacredPhoenix.Stuff.QIP.Infium.SDK

Public Class Main
  Public Shared Function CreateInfiumPLUGIN(ByVal PluginService As IQIPPluginService) As IQIPPlugin
   Return New ExampleQIPInfiumPlugin(PluginService)
  End Function
End Class

Public Class ExampleQIPInfiumPlugin
  Implements IQIPPlugin

  Public Const PLUGIN_VER_MAJOR As Short = 1
  Public Const PLUGIN_VER_MINOR As Short = 0
  Public Const PLUGIN_NAME As String = "My QIP Infium Plugin"
  Public Const PLUGIN_AUTHOR As String = "5acred Phoenix"

  Private m_PluginSvc As IQIPPluginService
  Private m_PluginInfo As TPluginInfo
  Private m_DllPath As String
  Private m_UpdatedMsgText As String
  Private m_wStr As String
  Private m_wStatus As String
  Private m_wDescription As String
  Private m_OptionBool1 As Boolean
  Private m_OptionParam2 As Integer

  Public Sub New(ByVal PluginService As IQIPPluginService)
   m_PluginSvc = PluginService
  End Sub

  Public Function GetPluginInfo() As TPluginInfo Implements IQIPPlugin.GetPluginInfo
   Return m_PluginInfo
  End Function

  Public Sub OnQipMessage(ByVal PlugMsg As TPluginMessage) Implements IQIPPlugin.OnQipMessage
   Select Case PlugMsg.Msg
     Case PM_PLUGIN.LOAD_SUCCESS
      ' Dll library was successfuly loaded and FProtoInfo.DllHandle was updated by qip core.
      ' This msg sent always on qip start, even if plugin is disabled in options.

      ' Updating m_PluginInfo only!
      LoadSuccess()

     Case PM_PLUGIN.RUN
      ' Here you can start plugin work, create any forms, objects etc.
      ' Note that if plugin is disabled, it will not receive this message.
      ' Instead of this msg it will receive PM_PLUGIN_ENABLE if user will enable this plugin in options.

      ' Using:
      ' CreateControls()
      ' LoadPluginOptions()

     Case PM_PLUGIN.QUIT
      ' QIP closing, free plugin resources and finish plugin work.

      ' Using:
      ' SavePluginOptions()
      ' FreeControls()

     Case PM_PLUGIN.DISABLE
      ' Plugin was disabled in qip options, after this, this plugin will not receive
      ' any QIP messages (excepting PM_PLUGIN_ENABLE and PM_PLUGIN_QUIT) and
      ' any plugin message to qip core will be ignored, but plugin will stay loaded into memory.
      ' Any connections and forms have to be closed.

      ' Using:
      ' FreeControls()

     Case PM_PLUGIN.ENABLE
      ' The same message like PM_PLUGIN_RUN but when plugin was enabled in
      ' options and after that plugin will start receive messages from QIP.

      ' Using:
      ' CreateControls()
      ' LoadPluginOptions()

     Case PM_PLUGIN.OPTIONS
      ' Open plugin options window if needed.
      ' Hint: You can save 30 different parameters in qip profile dedicated to your plugin using
      '    interface function PluginOptions. For example how to get access to your plugin
      '    options parameters:
      '    var aPluginSpecific: pPluginSpecific;
      '    aPluginSpecific := FPluginSvc.PluginOptions(FPluginInfo.DllHandle);
      '    if Assigned(aPluginSpecific) then aPluginSpecific^.Bool1 := True;

      ' Show messagebox, for example.
      System.Windows.Forms.MessageBox.Show("PM_PLUGIN_OPTIONS message was received.", PLUGIN_NAME, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information)

     Case PM_PLUGIN.SPELL_CHECK
      ' This message is just to test different plugin purposes.

      ' Using:
      ' SpellCheck(PlugMsg)

     Case PM_PLUGIN.SPELL_POPUP
      ' This message is just to test different plugin purposes.

      ' Using:
      ' SpellCheck(PlugMsg)

     Case PM_PLUGIN.XSTATUS_CHANGED
      ' This message is just to test different plugin purposes.
      ' Qip core notifies that xstatus picture/text was changed by user.
      ' Note that this msg will NOT be sent after plugin set own xstatus using PM_PLUGIN_XSTATUS_UPD.

      ' Using:
      ' XStatusChangedByUser(PlugMsg)

     Case PM_PLUGIN.SOUND_CHANGED
      ' This message is just to test different plugin purposes.
      ' Qip core notifies that sound on/of switcher was changed by user.
      ' Note that this msg will NOT be sent after plugin enable/disable sound using PM_PLUGIN_SOUND_SET.

      ' Using:
      ' QipSoundChanged(PlugMsg)

     Case PM_PLUGIN.MSG_RCVD
      ' This message is just to test different plugin purposes.
      ' Message received notifier.

      ' Using:
      ' InstantMsgRcvd(PlugMsg)

     Case PM_PLUGIN.MSG_SEND
      ' This message is just to test different plugin purposes.
      ' Message is going to be sent notifier.

      ' Using:
      ' InstantMsgSend(PlugMsg)

     Case PM_PLUGIN.MSG_RCVD_NEW
      ' This message is just to test different plugin purposes.
      ' New instant message received and its not read by user, its still flashing.
      ' This message will be send periodically (~400 msec) until user will read new message.

      ' Using:
      ' NewMessageFlashing(PlugMsg)

     Case PM_PLUGIN.MSG_RCVD_READ
      ' This message is just to test different plugin purposes.
      ' New instant message has been read by user, flashing stopped.

      ' Using:
      ' NewMessageStopFlashing(PlugMsg)

   End Select

   ' Simple messages logging
   ' if Assigned(FfrmTest) then FfrmTest.Memo1.Lines.Add('Plugin MsgID: ' + IntToStr(PlugMsg.Msg));
  End Sub

  Private Sub LoadSuccess()
   With m_PluginInfo
     .DllPath = System.Reflection.Assembly.GetExecutingAssembly().Location
     .QipSdkVerMajor = QIP_SDK_VER.MAJOR
     .QipSdkVerMinor = QIP_SDK_VER.MINOR
     .PlugVerMajor = PLUGIN_VER_MAJOR
     .PlugVerMinor = PLUGIN_VER_MINOR
     .PluginName = PLUGIN_NAME
     .PluginAuthor = PLUGIN_AUTHOR
   End With
  End Sub
End Class

Colorized by: Eros.CodeSyntaxColor Engine
Реально ли заставить всё это пахать? :-)

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


VB6: Звук | Автор: Arcady
Добавлено: 28.08.2007 / 00:38 | ответов: 5 | просмотров: 55

Всем привет!
Вопрос: как на VB6 (SP5) воспроизводить звук "на своём канале"? То есть, создать (открыть) звуковой канал, воспроизводить в нём музыку в формате WAVE, MP3, и, задавать ему громкость отдельно от Windows? Желательно без использования ocx и нестандартных dll. Например, как в библиотеке fmod.dll или в программе Winamp.

P.S.: Заранее благодарен за ответы.

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Алексей
Добавлено:28.08.2007 / 03:35
Я уже отвечал на этот вопрос в системе Эксперт :)
Желательно без использования ocx и нестандартных dll.

Стандартными средствами VB 6.0 это сделать не возможно.
Примеры воспроизведения звука с использованием сторонних библиотек и
компонентов можно посмотреть тут

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: Arcady
Добавлено:28.08.2007 / 09:03
Я знаю :)
Стандартными средствами VB 6.0 это сделать не возможно.
Хотелось бы услышать что-то вроде: вот пример... :)

Спасибо за примеры воспроизведения звука с использованием сторонних библиотек.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: Алексей
Добавлено:28.08.2007 / 09:22
Я знаю :)
Стандартными средствами VB 6.0 это сделать не возможно.

Хотелось бы услышать что-то вроде: вот пример... :)

не понимаю чего вы хотите. Если это сделать стандартными средствами не
возможно, то это означает что это сделать не возможно :) Вот пример:
001:
002:
003:
004:
MsgBox "Слышно звук в отдельном канале? Нет?! Конечно же, ведь VB 6.0 сам по себе это сделать не может, подключай ocx или dll, и будет тебе звук!"

_______________________
Colorized by: Eros.CodeSyntaxColor Engine

Какой еще пример нужен?

Если вы хотите создать клон библиотеки fmod.dll, то учите какой-нибудь C++..
Без API на VB ничего подобного сделать не получится..

_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 4 | Автор: Алексей
Добавлено:29.08.2007 / 16:24
Если все же передумаешь, и решишь выйти за пределы VB, то вот пример(ы):
001:
002:
003:
004:
005:
006:
007:
008:
Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Private Sub Form_Click()
 Dim res Variant
 res = mciExecute("Play ПутьДоФайла")
End Sub

_______________________
Colorized by: Eros.CodeSyntaxColor Engine

001:
002:
003:
004:
005:
006:
007:
008:
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Private Sub Form_Load()
 Dim x As Long
 x = PlaySound("C:\ПутьДоФайла", 0, &H1 Or &H10)
End Sub

_______________________
Colorized by: Eros.CodeSyntaxColor Engine

001:
002:
003:
004:
005:
006:
007:
008:
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Private Sub Form_Load()
 Dim x As Long
 x = sndPlaySound("C:\ПутьДоФайла", &H1 Or &H10)
End Sub

_______________________
Colorized by: Eros.CodeSyntaxColor Engine

Воспроизведение MP3


Для работы этого примера нужно добавить в проект Active Movie Control Type Library (Проект (Project) -> Ссылки (Reference))
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
025:
026:
027:
028:
029:
030:
031:
032:
033:
034:
035:
036:
037:
038:
039:
040:
041:
042:
043:
044:
045:
046:
047:
048:
049:
050:
051:
052:
053:
054:
055:
056:
057:
058:
059:
060:
061:
062:
063:
064:
065:
066:
067:
068:
069:
070:
071:
072:
073:
074:
075:
076:
077:
078:
079:
080:
081:
082:
083:
084:
085:
086:
087:
088:
089:
090:
091:
092:
093:
094:
095:
096:
097:
098:
099:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
Option Explicit

Private Const MAX_VOLUME As Long = 100
Private Const MAX_BALANCE As Long = 100
Private Const MAX_SPEED As Long = 226

Public DirectShow_Event As IMediaEvent
Public DirectShow_Control As IMediaControl
Public DirectShow_Position As IMediaPosition
Public DirectShow_Audio As IBasicAudio

Public Function DirectShow_Load_Media(File_Name As String) As Boolean
 On Error GoTo Error_Handler
 If Right(File_Name, 4) = ".mp3" Then
  Set DirectShow_Control = New FilgraphManager
  DirectShow_Control.RenderFile (File_Name)
  Set DirectShow_Audio = DirectShow_Control
  DirectShow_Audio.Volume = 0
  DirectShow_Audio.Balance = 0
  Set DirectShow_Event = DirectShow_Control
  Set DirectShow_Position = DirectShow_Control
  DirectShow_Position.Rate = 1
  DirectShow_Position.CurrentPosition = 0
 Else
  GoTo Error_Handler
 End If
 DirectShow_Load_Media = True
 Exit Function
Error_Handler:
 DirectShow_Load_Media = False
End Function

Public Function DirectShow_Play() As Boolean
 On Error GoTo Error_Handler
 DirectShow_Control.Run
 DirectShow_Play = True
 Exit Function
Error_Handler:
 DirectShow_Play = False
End Function

Public Function DirectShow_Stop() As Boolean
 On Error GoTo Error_Handler
 DirectShow_Control.Stop
 DirectShow_Position.CurrentPosition = 0
 DirectShow_Stop = True
 Exit Function
Error_Handler:
 DirectShow_Stop = False
End Function

Public Function DirectShow_Pause() As Boolean
 On Error GoTo Error_Handler
 DirectShow_Control.Stop
 DirectShow_Pause = True
 Exit Function
Error_Handler:
 DirectShow_Pause = False
End Function

Public Function DirectShow_Volume(ByVal Volume As Long) As Boolean
 On Error GoTo Error_Handler
 If Volume >= MAX_VOLUME Then Volume = MAX_VOLUME
 If Volume <= 0 Then Volume = 0
 DirectShow_Audio.Volume = (Volume * MAX_VOLUME) - 10000
 DirectShow_Volume = True
 Exit Function
Error_Handler:
 DirectShow_Volume = False
End Function

Public Function DirectShow_Balance(ByVal Balance As Long) As Boolean
 On Error GoTo Error_Handler
 If Balance >= MAX_BALANCE Then Balance = MAX_BALANCE
 If Balance <= -MAX_BALANCE Then Balance = -MAX_BALANCE
 DirectShow_Audio.Balance = Balance * MAX_BALANCE
 DirectShow_Balance = True
 Exit Function
Error_Handler:
 DirectShow_Balance = False
End Function


Public Function DirectShow_Speed(ByVal Speed As Single) As Boolean
 On Error GoTo Error_Handler

 If Speed >= MAX_SPEED Then Speed = MAX_SPEED
 If Speed <= 0 Then Speed = 0
 
 DirectShow_Position.Rate = Speed / 100
 DirectShow_Speed = True
 Exit Function
Error_Handler:
 DirectShow_Speed = False
End Function

Public Function DirectShow_Set_Position(ByVal Hours As Long, ByVal Minutes As Long, ByVal Seconds As Long, Milliseconds As Single) As Boolean
 On Error GoTo Error_Handler
 Dim Max_Position As Single
 Dim Position As Double
 Dim Decimal_Milliseconds As Single

 'Keep minutes within range
 Minutes = Minutes Mod 60

 'Keep seconds within range
 Seconds = Seconds Mod 60

 'Keep milliseconds within range and keep decimal
 Decimal_Milliseconds = Milliseconds - Int(Milliseconds)
 Milliseconds = Milliseconds Mod 1000
 Milliseconds = Milliseconds + Decimal_Milliseconds

 'Convert Minutes & Seconds to Position time
 Position = (Hours * 3600) + (Minutes * 60) + Seconds + (Milliseconds * 0.001)
 Max_Position = DirectShow_Position.StopTime

 If Position >= Max_Position Then
  Position = 0
  GoTo Error_Handler
 End If

 If Position <= 0 Then
  Position = 0
  GoTo Error_Handler
 End If
 DirectShow_Position.CurrentPosition = Position
 DirectShow_Set_Position = True
 Exit Function
Error_Handler:
 DirectShow_Set_Position = False
End Function


Public Function DirectShow_End() As Boolean
 On Error GoTo Error_Handler
 If DirectShow_Loop = False Then
  If DirectShow_Position.CurrentPosition >= DirectShow_Position.StopTime Then DirectShow_Stop
 End If
 
 DirectShow_End = True
 Exit Function
 
Error_Handler:
 
 DirectShow_End = False
End Function

Public Function DirectShow_Loop() As Boolean
 On Error GoTo Error_Handler

 If DirectShow_Position.CurrentPosition >= DirectShow_Position.StopTime Then
  DirectShow_Position.CurrentPosition = 0
 End If
 DirectShow_Loop = True
 Exit Function
Error_Handler:
 DirectShow_Loop = False
End Function

Public Sub DirectShow_Shutdown()
 Set DirectShow_Audio = Nothing
 Set DirectShow_Event = Nothing
 Set DirectShow_Control = Nothing
 Set DirectShow_Position = Nothing
End Sub

_______________________
Colorized by: Eros.CodeSyntaxColor Engine

001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
Option Explicit

Private Sub Form_Activate()
  'Change the file path of your mp3 in here.
  DirectShow_Load_Media "C:\Jacob's Stuff\Music\Mp3's\Black Metal\Dimmu Borgir - Enthrone Darkness Triumphant - 10 - A Succubus In Rapture.mp3"
  'You don't need to do this part, but it's nice to be
  'able to control it.
  '------------------------------------------------
  DirectShow_Volume 100
  DirectShow_Balance 0
  DirectShow_Speed 100
  DirectShow_Set_Position 0, 0, 0, 0
  '------------------------------------------------

  DirectShow_Play
End Sub

Private Sub Form_Unload(Cancel As Integer)
  DirectShow_Shutdown
End Sub


_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 5 | Автор: Arcady
Добавлено:29.08.2007 / 22:34
Ё-МАЁ!!!!! THE BEST!!!!!!!!!!!! Я неправильно выразился, но ты меня понял! :) Мне главным было воспоизведение звука (MP3, WAVE) с возможностью регулирования громкости! Кстати, quartz.dll стандартная. Я имел ввиду не для VB стандартная, а для Windows. Спасибо за пример! Супер!

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


«Укорачивание» строки с тропинкой до файла | Автор: 5acred Phoenix
Добавлено: 27.08.2007 / 23:08 | ответов: 3 | просмотров: 40

Доброе время суток!

Меня мучает такой вопрос: есть ли в .NET стандартные средства для «укорачивания» слишком длинных строк?

Поясню. Допустим, у нас есть строка (не вдаваясь в фантазию, пишу как есть) "C:\Documents and Settings\<USER_NAME>\Application Data\QIP\Profiles\<PROFILE_NAME>\History\InfICQ_<UIN>.qhf". Нужно в зависимости от располагаемого свободного места на контроле представлять её как "C:\Documents and Settings\<USER_NAME>\Application Data\QIP\...\InfICQ_<UIN>.qhf", "C:\Documents and Settings\...\InfICQ_<UIN>.qhf" и т. д.

Заранее спасибо.

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Алексей
Добавлено:28.08.2007 / 03:58

С использованием API


001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
Private Declare Function GetShortPathName Lib "kernel32" Alias _
  "GetShortPathNameA" (ByVal lpszLongPath As String, _
  ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

Const MAX_PATH = 260

Public Function ShortPathName(ByVal FileName As String) As String
  Dim length As Long, res As String
  res = String$(MAX_PATH, 0)
  length = GetShortPathName(FileName, res, Len(res))
  If length Then
    ShortPathName = Left$(res, length)
  End If
End Function

_______________________
Colorized by: Eros.CodeSyntaxColor Engine


и еще


001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
024:
Imports System.Text
Imports System.Runtime.InteropServices

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Public Shared Function GetShortPathName(ByVal lpszLongPath As String, _
    ByVal lpszShortPath As StringBuilder, ByVal cchBuffer As Integer) As Integer
End Function

Private Function ConvertLongPathToShort(ByVal longPathName As String) As String
  Dim shortNameBuffer = New StringBuilder

  Dim size As Integer = Me.GetShortPathName(longPathName, shortNameBuffer, _
                   shortNameBuffer.Capacity)
  If (size >= shortNameBuffer.Capacity) Then
   shortNameBuffer.Capacity = size + 1
   GetShortPathName(longPathName, shortNameBuffer, shortNameBuffer.Capacity)
  End If

  Return shortNameBuffer.ToString()

End Function

_______________________
Colorized by: Eros.CodeSyntaxColor Engine


и еще один


001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020:
021:
022:
023:
Private Declare Auto Function GetShortPathName Lib "kernel32.dll" (ByVal strLongPath As String, ByVal objStringBuilder As System.Text.StringBuilder, ByVal intBufferSize As Integer) As Integer
Private Declare Auto Function GetLongPathName Lib "kernel32.dll" (ByVal strShortPath As String, ByVal objStringBuilder As System.Text.StringBuilder, ByVal intBufferSize As Integer) As Integer

Public Enum DirectoryPathLength
 WindowsXP = 256
End Enum

Public Function GetShortPathName(ByVal strPath As String, Optional ByVal enumDirectoryPathLength As DirectoryPathLength = DirectoryPathLength.WindowsXP) As String
 Dim strStringBuilder As New System.Text.StringBuilder(enumDirectoryPathLength)
 Dim intNewStringLength As Integer
 intNewStringLength = GetShortPathName(strPath, strStringBuilder, enumDirectoryPathLength)
 Return strStringBuilder.ToString
End Function

Public Function GetLongPathName(ByVal strPath As String, Optional ByVal enumDirectoryPathLength As DirectoryPathLength = DirectoryPathLength.WindowsXP) As String
 Dim strStringBuilder As New System.Text.StringBuilder(enumDirectoryPathLength)
 Dim intNewStringLength As Integer
 intNewStringLength = GetLongPathName(strPath, strStringBuilder, enumDirectoryPathLength)
 Return strStringBuilder.ToString
End Function

_______________________
Colorized by: Eros.CodeSyntaxColor Engine


_________________
Это сообщение добавлено через Kbyte.Ru Forum Mail Conference (FMC)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: 5acred Phoenix
Добавлено:28.08.2007 / 11:39
Алексей, спасибо, конечно, за кучу примероф :-)

Но это не то немного... Примеры переводят путь в досовский формат 8.3 ("C:\DOCUME~1\ADMIN\LOCALS~1..."), а нужно, чтобы часть пути заменялась троеточием, в зависимости от того, сколько выделено места (н-р, 200 пикселей). Т.е. из "C:\Documents and Settings\Admin\Local Settins\Some.file" сделать, например, "C:\Documents and Settings\...\Some.file".

Видимо придётся путь бить по слэшам и заменять части на троеточие, пока ширина строки не войдёт в нужный диапазон...

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: 5acred Phoenix
Добавлено:28.08.2007 / 12:23
О! Чудо моей инженерной мысли :-)

001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
Private Function GetShortPath(ByVal path As String, ByVal width As Integer) As String
  Dim m As System.Drawing.Graphics = System.Drawing.Graphics.FromHwnd(Me.Handle)
  Dim p As String = path

  Do While (m.MeasureString(p, Me.Font).Width > width AndAlso p.Split("\"c).Length > 2)
   Dim b As Integer = p.LastIndexOf("\"c)
   Dim a As Integer = p.LastIndexOf("\"c, b - 1)

   p = p.Substring(0, a) & "|..." & p.Substring(b)
  Loop

  Return p.Replace("|"c, "\"c)
End Function

Colorized by: Eros.CodeSyntaxColor Engine


Режет либо пока ширина строки не войдёт в заданный предел, либо до «максимума» — "C:\...\Some.file". Мишн комплит :-)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Макрос в Excel | Автор: Gera
Добавлено: 27.08.2007 / 17:09 | ответов: 3 | просмотров: 52

Здраствуйте.
Возникла такая небольшая проблемка. Суть проблемы заключается в следующем: в книге Excel находится некоторая информация, которая занимает несколько страниц (больше 2). Необходимо написать макрос, который будет в каждой первой ячейке новой страницы вставлять заданный текст и окрашывать ячейку определенным цветов. До этого как написать сюда я пробовол поймать ячейку находящуюся после разрыва страницы , но у меня ничего не получилось.
Заранее спасибо

Ответить на это сообщение | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 1 | Автор: Edlin
Добавлено:28.08.2007 / 09:54
Предлагаю следующее решение:

1) Получаешь количество рядов (строк) в твоем документе, используя Worksheet.UsedRange.Rows.Count.
2) Устраиваешь цикл по всем этим строкам. У строки, стоящей в начале страницы, свойство PageBreak не равно XlPageBreak.xlPageBreakNone:

ActiveSheet.UsedRange.Rows( i ).PageBreak <> XlPageBreak.xlPageBreakNone.

В первую ячейку этого ряда и записываешь то, что тебе нужно.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 2 | Автор: EROS
Добавлено:28.08.2007 / 11:04
Если выводимая инфа одинакова для всех страниц, то целесообразней будет использовать так называемые "сквозные строки" (имхо)

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Ответ # 3 | Автор: Gera
Добавлено:28.08.2007 / 16:22
Спасибо за ответ. Проблема решена.

Добавить ответ | Посмотреть эту тему на сайте | Форум Kbyte.Ru


Наверх

 

Последние статьи

Взаимодействие с другими сайтами через HTTP (HttpWebRequest и HttpWebResponse)
Автор: Немиро Алексей | добавлено: 27.07.2007 / 14:01 | просмотров: 563

В данной статье речь пойдет о том, как можно программно заполнить и отправить Web-форму, а также получить результат с использованием довольно простых классов - HttpWebRequest и HttpWebResponse.

Работа с SQL – Запросы
Автор: Хабибулин А. (aka Bille Gates) | добавлено: 22.07.2007 / 04:43 | просмотров: 953

В данной статье рассмотрены часто используемые SQL-запросы и приведены примеры их использования.

Использование XML.Serialization
Автор: Немиро Алексей | добавлено: 19.07.2007 / 15:38 | просмотров: 237

В данном обзоре речь пойдет об использование XML.Serialization в .NET и ее применении на примере сохранения и считывания настроек программы с использованием синтаксиса языка Visual Basic .NET.

Выбор языка программирования для научных работ (2-я редакция)
Автор: Юдин С. Ю. | добавлено: 15.03.2007 / 02:49 | просмотров: 2003

Идея написания этой статьи возникла после того, как на одном из сайтов по физике http://physics.nad.ru/aniboard/messages/291.html я обнаружил интересный алгоритм моделирования движения тела в поле постоянной напряженности по различным направляющим. Вернее, меня заинтересовал не весь алгоритм, т.к. основа их всех одна (принцип Даламбера, если не считать квазиалгоритма с применением уравнений Лагранжа 2-го рода) и различаются они только способом определения реакций в месте соприкосновения тел. ...

Работаем с MIME
Автор: Немиро Алексей | добавлено: 29.11.2006 / 14:46 | просмотров: 1938

Не так давно мне пришлось немного поработать MIME (Multipurpose Internet Mail Extension) - это стандарт почтовых сообщений, в РуНете (Russian Internet) я не нашел нормального описания спецификации MIME, и посему решил написать небольшую статейку на эту тему. В данной статье вы узнаете об основных особенностях и стандартах MIME, а также научитесь «читать» MIME с использованием синтаксиса языка Visual Basic .NET 2005.

 

Статьи на Kbyte.Ru

Наверх

 

Интересные коды и решения

Как отправить E-Mail?
Дата добавления: 01.08.2006 / 11:52 | просмотров: 1386 | платформа: ASP

Как запретить пользователю закрыть форму?
Дата добавления: 31.07.2006 / 12:10 | просмотров: 543 | платформа: VB

Как получить строку параметров текущего запроса?
Дата добавления: 31.07.2006 / 15:38 | просмотров: 891 | платформа: ASP .NET (VB)

Получение многоразрядного числа2
Дата добавления: 31.07.2006 / 12:33 | просмотров: 490 | платформа: VB

Как сделать часы?
Дата добавления: 16.08.2006 / 23:30 | просмотров: 929 | платформа: VB

Запись данных в файл
Дата добавления: 31.07.2006 / 17:20 | просмотров: 586 | платформа: ASP .NET (VB)

Как перевести посетителя на другую страницу?
Дата добавления: 31.07.2006 / 14:37 | просмотров: 465 | платформа: ASP .NET (VB)

Как добавить сайт в избранное?
Дата добавления: 24.03.2007 / 12:36 | просмотров: 399 | платформа: VB .NET

Как запретить запуск двух копий программы?
Дата добавления: 04.08.2006 / 08:53 | просмотров: 638 | платформа: VB

Как программно вызвать окно свойств (Properties) файла?
Дата добавления: 31.07.2006 / 12:42 | просмотров: 640 | платформа: VB

 

Универсальные коды на Kbyte.Ru

Наверх

 

Юмор на Kbyte.Ru

Звонок в компьютерную контору:
- С моим компьютером проблемы, он не включается...
- Как не включается?
- Да пишет все время: "Вставьте дискету, вставьте дискету..."
- А вы вставляли?
- Hет... Как-то не догадался

 

Рейтинг: 60
Всего голосов: 95
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Пришел в новую контору работать. У всех юзверей выясняю пароли на вход в сетку. Один из них отвечает: пароль две звездочки. Ну это, говорю, я понял, а пароль-то какой? Две звездочки. Ну ясно, что на экране вы видите две звездочки, а пароль-то какой? Ну какой же вы непонятливый, вот смотрите: и жмет shift+8, shift+8. Я упал. Людям надо верить. :)

 

Рейтинг: 100
Всего голосов: 121
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Идет Илья Муромец по полю. Видит - Змей Горыныч сидит. Ну, тот подкрался к нему и срубил ему голову. У Змея Горыныча две
выросло. Срубил Илья ему две - четыре выросло! Срубил четыре - выросло восемь!!! И так далее... И вот когда Илья Муромец
срубил 65535 голов, Змей Горыныч помер...
Потому что был он 16-ти битным.

 

Рейтинг: 52
Всего голосов: 93
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Скупой платит дважды. Поехал поездом Кишинев-Владивосток. Решил на авиабилете сэкономить, придурок. Два месяца потом от белой горячки лечился.

 

Рейтинг: 94
Всего голосов: 139
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Просыпается программер с бодуна. Поворачивает голову и видит рядом с собой девушку.
"Обнаружено неизвестное устройство" - подумал он.

 

Рейтинг: 374
Всего голосов: 500
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

- Правда ли, что если проиграть назад диск с Windows'NT, то можно услышать сатанинское послание?
- Это пустяки, вот если проиграть его вперед, он установит вам Windows'NT!

 

Рейтинг: 84
Всего голосов: 134
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Пpогpаммеpы квасят на пpиpоде. Идут pазговоpы, тpали-вали... Один рассказывает:
- Познакомился тут с девушкой на дискотеке! Бесподобная деваха! И фигуpка, и мозги есть, и танцует хоpошо!
Так вот, pешил pickup'нуть ее к себе домой. Пpигласил, она согласилась. Пpишли, выпили винца, поговоpили о том, о сем, музыку послушали. Потом я ее поцеловал, пpиподнял аккуpатно, посадил задницей на клавиатуpу, поднял юбку...
Остальные:
- Так у тебя компутеp дома стоит?!?! А какой???

 

Рейтинг: 116
Всего голосов: 167
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Беседуют два программиста.
- Чем программист отличается от обычного смертного?
- А тем, что в состоянии ответить на вопрос, в котором уже заключен ответ.
- Это как же?
- Ну, например, ответь на вопрос: сколько будет 2х2=4?
- Естественно TRUE!

 

Рейтинг: 77
Всего голосов: 114
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

На международных соревнованиях американские вооруженные силы совершили больше всех промахов при прицельной стрельбе, а российские - больше всего попаданий при предупредительной.

 

Рейтинг: 101
Всего голосов: 160
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Парень берет девушку на руки и несет в кровать.
— Дорогой, а может лучше после свадьбы?
— Ты что, а вдруг муж ревнивый попадется!

 

Рейтинг: 731
Всего голосов: 1073
Оцените этот анекдот через E-Mail:
Выберите оценку: 5 | 4 | 3 | 2 | 1

 

Весь юмор на Kbyte.Ru

Наверх


Выпуск подготовил: R-KDR-19826

Редактор: Немиро Алексей

Copyright (c) Nemiro AS, 2005-2007


В избранное