Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Програмируем в Delphi... (http://forum.oszone.net/showthread.php?t=146883)

MeXXXanik 02-08-2009 12:10 1183509

Програмируем в Delphi...
 
Всем привет! Ладно начинающим програмистам и ламерам посвящяется:
Програмирование в среде Delphi
Ладно сегодня мы поговорим о TICQClient
Своя Ася... (Часть 1)
Первым дело мы возьмем вот этот TICQClient(Нажми сюда )
В нем:
1.FAQ на русике
2.Два примера(Один из них полноценный ICQ клиент)
P.S. Киньте все(Копируйте) в папку lib которая B Delphi
Кидаем на форму 7 Labelов, 4 Edita, 2 ComboBoxa, Кнопку, Memo и TICQClient
Editы:
1.LoginEdit
2.PasswordEdit
3.CountEdit
4.MessageEdit
Labelы
1.UIN
2.Пароль
3.Поисковый параметр
4.Возраст
5.Страна
6.Сколько раз ищем
7.Сообщение
Кнопку Рассылка
Memo очищаем
В TICQClient в поле ICQServer login.icq.com и в ICQPort 5190
Исправим var перед кодом
var
Form1: TForm1;
UinS,NickS: TStringList;

Но на этом я закончу...(не могу дальше...дела)...Так что ждите 2 части...

MeXXXanik 03-08-2009 09:38 1184076

Своя Ася... (Часть 2)
Осталось дошкодить наш ICQ клиент(А у меня в стадии разработки полноценный ICQ клиент под названием ICQ Client.P.S. Он в стадии разработки, а я сам его еще делаю, так что дать вам его скачать НЕМОГУ)
Для поиска:
Код:

function SearchList(SUin:string; SNick:string):string;
var j:integer;
flag: boolean;
begin
flag:=true;
for j:=0 to UinS.Count-1 do
begin
if SUin=UinS.Strings[j] then
begin
flag:=false;
end;
end;
if flag then
UinS.Add(SUin);
NickS.Add(SNick);
end;
Для изменения сообщения:
function Replace(ZNick:string; Repl:string):string;
var Poz:integer;
s:string;
begin
s:=Form1.MessageEdit.Text;
Poz:=Pos(Repl, s);
while Poz>0 do
begin
if Repl='*' then
begin
Delete(s, Poz, Length(Repl));
Insert(' ', s, Poz);
end
else
begin
Delete(s, Poz, Length(Repl));
Insert(ZNick, s, Poz);
end;
Form1.MessageEdit.Text:=s;
Poz:=Pos(Repl, s);
end;
end;
Для возрастной категории
(Допишите в uses ICQWorks)
function TForm1.GetAgeMin: Word;
begin
case ComboBox1.ItemIndex of
1: Result := 18;
2: Result := 23;
3: Result := 30;
4: Result := 40;
5: Result := 50;
6: Result := 60;
else
Result := 0;
end;
end;
function TForm1.GetAgeMax: Word;
begin
case ComboBox1.ItemIndex of
1: Result := 22;
2: Result := 29;
3: Result := 39;
4: Result := 49;
5: Result := 59;
6: Result := $2710;
else
Result := 0;
end;
end;
OnCreate для Form'ы
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin
UinS:=TStringList.Create;
NickS:=TStringList.Create;
ComboBox1.Items.Add('');
ComboBox1.ItemIndex := 0;
ComboBox1.Items.Add('18-22');
ComboBox1.Items.Add('23-29');
ComboBox1.Items.Add('30-39');
ComboBox1.Items.Add('40-49');
ComboBox1.Items.Add('50-59');
ComboBox1.Items.Add('60 and above');
ComboBox2.Items.Add('');
ComboBox2.ItemIndex := 0;
for i := Low(Countries) to High(Countries) do
ComboBox2.Items.Add(Countries[i].Value);
end;
ONClick для кнопки
if LoginEdit.Text='' then
ShowMessage('Error! Enter UIN!')
else
Memo1.Clear;
ICQClient1.UIN:=StrToInt(LoginEdit.Text);
ICQClient1.Password:=PasswordEdit.Text;
ICQClient1.Login(0);
OnLogin для ICQClient
procedure TForm1.ICQClient1Login(Sender: TObject);
var
i:integer;
begin
for i:=0 to StrToInt(CountEdit.TExt) do
begin
ICQClient1.SearchWhitePages('','','','',GetAgeMin,GetAgeMax,0,'','',ComboBox2.Items.Strings[ComboBox2.ItemIndex],'','','','','','','','','',true);
end;
for i:=0 to UinS.Count-1 do
begin
if i=0 then
Replace(NickS.Strings[i],'$Nick')
else
begin
Replace(NickS.Strings[i],NickS.Strings[i-1]);
end;
ICQClient1.SendMessage(StrToInt(UinS.Strings[i]),MessageEdit.Text);
Memo1.Lines.Add('Послано сообщение на '+UinS.Strings[i]+': '+MessageEdit.Text);
end;
ICQClient1.Disconnect;
UinS.Free;
NickS.Free;
end
А вот и все осталось добавить в OnUserFound компонента ICQClient вот этот код
if Nick='' then
SearchList(Uin, '*')
else
SearchList(Uin, Nick);


Вот и все! На следующий раз я может еще че нибудь приделаю и раскажу вам
Но так как это всего лишь пример, я небуду говорить более этого примера...
Ладно ждите продолжение темы "Програмирование в среде Delphi"

Drongo 03-08-2009 10:42 1184121

MeXXXanik, Если не трудно, оформляйте код тегами [code], а так же делайте отступы в самом коде для удобочитаемости. :)

DillerInc 03-08-2009 12:57 1184275

MeXXXanik, то, что вы предлагаете здесь - это моветон.Не надо воспитывать псевдо-программистов,которые умеют только размещать кнопочки на форме и использовать чужие компоненты.
И насчёт компонента.Если это тот самый от coban2k, то он скорее всего устарел,ибо давно не обновлялся,а протокол ICQ не так давно был сменён.
Так что выкиньте свой Дельфи вместе с его VCL.

MeXXXanik 05-08-2009 14:27 1186225

Ойй После Новой Винды(И нетолько!)Пришло время рассказать снова о Delphi. А почему? С помощью Дельфи может создать прогу с кодом ____(Сюда Компонент(Имя)).Visible:=True что позволит тебе спрятать ,например тайное послание. Но сегодня не об этом... Сегодня будем писать себе проигрыватель музыки
Сам Себе Музыкант (О компоненте BASS_._)
И так начнем с нужного:
1.BASS _._(Любой версии, а лучше последний)Вот он
2.Знание
3.Прямые руки :yes:

Код:

1) function BASS_Init(device: Integer; freq, flags: DWORD; win: HWND): BOOL;
Инициализирует BASS. Здесь:
device: 0 - первое устройство, -1 - по умолчанию, -2 - без звука.
freq - частота. Обычно - 44100.
flags - флаги. Например, BASS_DEVICE_MONO даст моно, а BASS_DEVICE_VOL1000 позволит тебе измерять громкость по шкале от 0 до 1000, по умолчанию - до 100. Если такие настройки тебе не нужны, ставь 0.

2) function BASS_CDInit(drive: PChar; flags: DWORD): BOOL;
Инициализирует CD функции.
drive - ставь 0.
flags - флаги - опции для громкости. Один ты уже видел выше (который 1000), а второй выглядит так: BASS_DEVICE_LEAVEVOL. Это громкость по умолчанию.

3) function BASS_Start: BOOL;
Открытие звукового выхода или resume после паузы.

Функции для работы с CD(Так как в новых версия я  не нашел)

1) function BASS_CDDoor(open:BOOL): BOOL; Выдвигает лоток сидюка, если ты передал ей TRUE. Если false, то лоток втягивается обратно.

2) function BASS_CDInDrive: BOOL;
Выясняет, есть ли аудио-CD в сидюке. Если есть, то возвращает TRUE.

3) function BASS_CDGetTracks:DWORD;
Получает количество треков на диске. Его, соответственно, и возвращает.

4) function BASS_CDGetTrackLength(track:DWORD):DWORD;
Возвращает длину трека в миллисекундах.
track - номер трека.

5) function BASS_CDPlay(track: DWORD; loop: BOOL; wait: BOOL): BOOL;
Играет заданный трек.
track - номер трека.
loop - если true, то играем циклически, наоборот - один раз.
wait - ждать или нет перед проигрышем.

6) procedure BASS_CDFree;
Освобождает ресурсы, занятые CD-аудио.

Функции для работы со звуковыми файлами

1) function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length, flags: DWORD): HSTREAM;
Создает звуковой поток из локального файла, к каковым относятся mp3, mp2, mp1, OGG и WAV. Файл может быть как на диске, так и в оперативке.
mem - если TRUE, то файл в оперативке. Если FALSE - то на диске. f - имя файла (если он на диске).
offset - смещение, с которого надо начинать. Обычно я начинаю с начала, но если у тебя другое мнение - сообщи его этому аргументу.
length - необходимое количество данных. Если ты хочешь использовать все до конца файла, то просто ставь 0.
flags - ставь 0.
Функция возвращает переменную типа HSTREAM, которая и есть хэндл новорожденного потока.

2) function BASS_StreamCreateURL(URL: PChar; offset: DWORD; flags: DWORD; save: PChar):HSTREAM;
То же, что и предыдущая функция, но поток создается не из локального, а из удаленного файла. Откуда и следуют новые аргументы:
URL - урл к файлу. Может начинаться либо с http://, либо с ftp://.
save - путь, куда класть закачанный файл. Если здесь null, значит не надо никуда сохранять.

3) function BASS_StreamGetLength(handle: HSTREAM): QWORD;
Получает приблизительную длину потока в байтах.
handle - получаем с помощью двух предыдущих функций.
Если размер в байтах тебя не удовлетворяет, воспользуйся функцией BASS_ChannelSeconds2Bytes. В ней нет ничего сложного, но она возвратит тебе уже секунды.

4) function BASS_StreamPlay(handle: HSTREAM; flush: BOOL; flags: DWORD): BOOL;
Играет заданный поток.
handle - хэндл потока.
flush - если false, поток можно приостанавливать, затем играть с места остановки. Если true, то остановка грозит возвращением к началу.
flags - если здесь будет стоять BASS_SAMPLE_LOOP, то поток будет играть ВЕЧНО.

5) function BASS_ChannelPause(handle: DWORD): BOOL;
Ставит паузу в воспроизведении чего угодно - CD, потока, сэмпла. Главное - скормить ей хэндл, который и является единственным аргументом.

6) function BASS_ChannelResume(handle: DWORD): BOOL;
Функция, обратная предыдущей.

7) function BASS_ChannelSetAttributes(handle: DWORD; freq, volume, pan: Integer): BOOL;
Функция, устанавливающая атрибуты воспроизведения заданного канала. Под термином "канал" разработчики понимают все воспроизводимое и записываемое: HCHANNEL/HMUSIC/HSTREAM или CDCHANNEL/RECORDCHAN. Короче, годится для всего, поскольку свойства эти общие:
handle - хэндл канала (см. 2 строчки выше).
freq - частота в герцах. Если здесь -1, останется текущая.
volume - громкость - от 0 до 100. -1 оставляет дефолтовую.
pan - баланс - (-101) - текущий, (-100) - влево, 0 - центр, 100 - вправо.

8) function BASS_ChannelGetAttributes(handle: DWORD; var freq, volume: DWORD; var pan: Integer): BOOL;
Получает атрибуты канала. Переменные такие же, как и в предыдущей функции. Если не хочешь получать какое-нибудь свойство, ставь null.

9) function BASS_ChannelSetPosition(handle: DWORD; pos: QWORD): BOOL;
Сдвигает позицию проигрывания на pos вперед. А это самое pos имеет разные значения в зависимости от хэндла; например, для CDCHANNEL - это количество в миллисекундах, считая от начала трека, а для HSTREAM - позиция в байтах. Получить позицию можно, соответственно, с помощью функции BASS_ChannelGetPosition.


Вот на этом я пожалуй закончу... А в продолжение сделаем форму и дошкодим

Admiral 05-08-2009 14:48 1186243

MeXXXanik, источник лучше указывать сразу Delphi: Свой WinAMP в подарочной упаковке - Лозовский Александр, журнал Xakep, номер 57 (сентябрь 2003го года), стр 86.
Но не будем на этом останавливаться, у меня практический вопрос: как ловится конец песни и переход на следующую если нужно организовать проигрывание по плей листу? В Хакере на этом моменте не остановились.
Спасибо.
P.S. Сам-то я эту библиотеку давно как не использую и по части использования "готовых кирпичей" согласен с DillerInc, но вот нерешенный в прошлом вопрос остался.

MeXXXanik 05-08-2009 15:47 1186302

1,Я Небрал с журнала Хакер! я брал из своей книги (Подарили на днюху)
2.Некоторые компоненты уменя были на диске в месте с местом их скачивания

MeXXXanik 05-08-2009 19:47 1186466

Сам Себе Музыкант( :help: Торжественная доделка :help: )
С BASS'ом разобрались. Приступим к выресовки формы.
На форму Edit/TImage(Может добавите картинку?)/TrackBar/6 Buttons/ListBox/Label/OpenDialog/2 RadioButton
Называем(Caption):
2 RadioButton-В CD
1 RadioBUtton-В Файле
1 Button-Воспр.
2 Button-Стоп
3 Button-Пауза
4 Button-Добавить
5 Button-Показать инфу
6 Button-Удалить из списка
Label-Громкость
Придется мне завершить на этом. Остался кодинг.Ждите!

un1qum 05-07-2012 07:25 1946162

Извините, честно я не знаю как принято у вас на форуме, но имхо это полный бред.
во первых - запах плагиата ужасающий
во вторых - смысл статьи теряется..научить людей использовать чужие компоненты заточенные под Tmyplayer.play?
Если так то лучше напишите статью о правильной установке этих компонентов на русском + ссылки на официальную документацию.
Было бы полезно выложить реализации функции для работы с этими компонентами.

Iska 05-07-2012 08:42 1946182

un1qum, Вас не смутило, что:

читать дальше »
1) к форуму автор имеет ровно то же отношение — «участник», что и я, и Вы, не более;
2) в незаконченной теме никто ничего не писал почти три года;
3) сам автор и вовсе не появлялся на форуме уже больше года;

?!

P.S. Если посмотрите внимательно в его профиль — поймёте, что требовать от него какие-либо «статьи» что в том возрасте, что сейчас — пока бессмысленно.


Время: 05:37.

Время: 05:37.
© OSzone.net 2001-