Наверняка всякому обладателю домашней странички хотелось бы иметь свой чат. Есть три способа его заполучить. Первый: можно просто взять готовый чат с какого-нибудь сайта типа http://chatland.ru. Нам это не подходит, потому что в таких чатах фактически нельзя ничего добавить или удалить, да и небезглючны они. Второй вариант: сделать чат самому, полагаясь на знания PHP. Есть еще и третий: создать чат в Delphi, а потом импортировать его в web-страницу с помощью ActiveX. Этим мы сегодня и займемся, использовав максимально простое строение чата, не требующее глубоких знаний программирования.
Компоненты, становись!
Итак, начнем. Для начала запускаем Delphi. Сразу же закрываем автоматически созданный новый проект и в главном меню выбираем File > New > Other. В открывшемся окошке под закладкой ActiveX находим Active Form и щелкаем ОК. Появится окошко Active Form Wizard. В нем изменяем нужные нам параметры, а именно: вместо ActiveFormX в поле New ActiveX Name ставим название нашего проекта —Chat, внизу ставим галочку напротив Include Version Information (тем самым мы включаем в наш чат информацию о его версии). Щелкаем ОК. Может появится окно, предупреждающее нас, что мы не можем добавить наш ActiveX в запущенный проект, потому что он пока не является библиотекой ActiveX. Нажимаем OK, чтобы создать новый проект библиотеки ActiveX. Дальше нас спросят, сохранить ли изменения в проекте Project1 — кликаем No. После всех этих нехитрых манипуляций откроется форма, похожая на стандартную. Здесь мы и будем создавать наш чат. У себя я сделал так: ListBox1 и Panel3 поместил на большой панели Panel2, align у Panel1 сделал alBottom, после чего у Panel2 это же свойство поменял на alClient. Свойство Visible у Panel1 и Panel2 нужно сделать равным false. Самое главное —Panel4 не должна находится на Panel2 — она будет появляться в самом начале и просить пользователя ввести его ник и частоту обновления чата. Теперь еще немного о конфигурации свойств: Caption у Button1 —Сказать, у Button3 —Выход, у BitBtn1 —OK, у BitBtn2 —Войти.
Немного принципиальности
Перед тем как непосредственно начать программировать, поговорим о принципе работы чата. На сервере в той же директории, где будет храниться чат, должны лежать три обычных пустых текстовых файла с именами chat.txt, users.txt, allusers.txt (названия можно придумать и свои, но дальнейшие пояснения я буду давать исходя из этих). Для чего нужен каждый из этих файлов? В файле chat.txt хранится весь разговор из чата. В users.txt записывается информация обо всех пользователях, находящихся на данный момент в «болталке». Файл же allusers.txt служит для хранения информации о том, кто в какой день и в котором часу заходил в чат (при желании можно обойтись из без этого). Теперь о самой программе. При запуске чат просит пользователя ввести ник и частоту обновления разговора. После того как вы нажимаете кнопку Войти, программа в ListBox2 открывает файл users.txt, добавляет туда строчку, содержащую ваш ник, затем сохраняет всю информацию из ListBox2 обратно в users.txt. При входе ListBox1 загружает информацию из chat.txt. После этого Timer1 выполняет обновление ListBox1 из chat.txt и ListBox2 из users.txt. Обновление это выполняется каждые S секунд, где S — время, указанное пользователем в edit4 или измененное в edit2. При нажатии на кнопку Войти, перед загрузкой users.txt в ListBox2, в него грузится allusers.txt. В этот файл добавляется, и сохраняется строчка формата name заходил в чат date в time, где name — ник пользователя, взятый из edit3, а date и time — дата и время входа соответственно. Теперь о самом общении. Как только пользователю станет скучно сидеть сложа руки и захочется что-то сказать, он вводит какую-то информацию в edit1. При нажатии на кнопку Сказать в Listbox1 добавляются и сохраняются 4 строчки, имеющие такой формат:
<здесь должна быть первая отделительная линия> time name сказал: text <здесь должна быть вторая отделительная линия>
В данном случае time — время, когда пользователь сказал эту фразу, name — ник пользователя, text — сама реплика. При выходе запись никнейма из listbox2 удаляется. С принципами работы на этом закончим. Теперь можно со спокойной душой приступить к программированию.
Делаем чат
Начнем с самого начала — с обработки события при нажатии на BitBtn2:
procedure TForm1.BitBtn2Click(Sender: TObject); begin if edit3.Text:=(('admin')or('Admin')or('ADMIN')) then {Если кто-то захочет зайти под ником администратора} begin edit3.text:=''; MessageBox(Handle, 'Ник admin может использовать только администратор чата.', 'Ошибка', MB_OK); {Покажем нарушителю, кто здесь хозяин :-).} end; listbox3.Items.LoadFromFile('users.txt'); {Грузим users.txt.} listbox2.Items.LoadFromFile('allusers.txt'); {Грузим allusers.txt.} listbox2.Items.insert(0,edit3.text + ' заходил '+datetostr(now)+' в '+timetostr(now) ); {Добавляем запись о том, когда заходил этот пользователь в allusers.txt...} listbox2.Items.SaveToFile('allusers.txt'); {...и сохраняем.} listbox2.Items.LoadFromFile('users.txt'); {Загружаем users.txt в listbox2.} listbox2.Items.Add(edit3.text); {Добавляем туда ник пользователя...} listbox2.Items.SaveToFile('users.txt'); {...и сохраняем в users.txt.} panel4.visible:=false; {Ну, тут без комментариев.} panel2.Visible:=true; panel1.Visible:=true; panel2.align:= alclient; if edit3.Text='' then edit3.text:='guest'; {Это на тот случай, если пользователь не соизволит ввести свой ник...} if edit4.Text='' then edit4.text:='5'; {...и частоту обновления чата.} edit2.text:=edit4.Text; {Тут все понятно.} timer1.Interval:=((strtoint(edit4.text))*1000); {Задаем интервал, с которым таймер будет обновлять чат.} timer1.Enabled:=true; {Включаем таймер.} listbox1.Items.LoadFromFile('chat.txt'); {Грузим файл чата в listbox1.} end;
Стандартные действия при входе сделаны. Что будет, если человек нажмет на bitbtn1? Пока что ничего, но сейчас мы добавим событие для клика на эту кнопку:
procedure TForm1.BitBtn1Click(Sender: TObject); begin timer1.Interval:=((strtoint(edit2.text))*1000); end;
Здесь мы просто заставили таймер сменить свойство interval на величину, записанную пользователем в edit2 и умноженную на 1000 (тем самым мы миллисекунды переводим в секунды). Следующее событие — событие для таймера. Вот что оно из себя представляет:
procedure TForm1.Timer1Timer(Sender: TObject); begin listbox1.Items.LoadFromFile('chat.txt'); listbox3.Items.LoadFromFile('users.txt'); end;
Попросту загружаем файлы чата и пользователей. Как чатланину что-то сказать? Очень просто:
procedure TForm1.Button1Click(Sender: TObject); begin listbox1.Items.Insert(0,'________'); listbox1.Items.Insert(0,edit1.text); {Вставили реплику.} listbox1.Items.Insert(0,edit3.Text+' сказал:'); listbox1.Items.Insert(0,timetostr(now)); {Записали время.} listbox1.Items.Insert(0,'________'); listbox1.Items.SaveToFile('chat.txt'); {Сохранили в файл.} edit1.text:=''; {} end;
Я снова использую процедуру Insert вместо Add затем, чтобы более новые сообщения отображались сверху. Осталось описать всего два события. Для button3:
procedure TForm1.Button3Click(Sender: TObject); begin close; {Закрываем все.} end;
Для onclose:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin listbox2.Items.Delete((listbox2.Items.IndexOf(edit3.text))); {Удаляем уходящего пользователя из users.txt} listbox2.Items.SaveToFile('users.txt'); end;
Ники и пароли зарегистрированных пользователей можно хранить в еще одном файле —registr.txt, например. Хранится информация в таком виде:
<здесь должна быть первая отделяющая линия> login password <здесь должна быть вторая отделяющая линия>
Соответственно, login — ник пользователя (edit3), password — его пароль (можно добавить еще один edit при входе, например edit4).
Правильность пароля проверяется процедурой indexof(‘name’ ) в listbox, где name — введенный логин в edit3. Пароль можно назвать правильным, если edit4.text=listbox.Items.Strings[(listbox.Items.IndexOf(edit3.text)+1)], где listbox — listbox, в который мы загрузили registr.txt. Разработку регистрации пользователя оставляю для вас.
Вот, в принципе, и все. Осталось только опубликовать наше творение в Сети.
Внедряемся в WEB
Пришло время заняться импортированием нашего чата в HTML. Сохраняем наш проект в какую-нибудь папку, в ней создаем пустые файлы chat.txt, users.txt, allusers.txt. В главном меню Delphi выбираем Project > Build name, где name — имя вашего проекта. Затем выбираем Run > Register ActiveX Server. После этого идем в Project > Web Deployment Options. Выставляем там требуемые значения:
TargetDir — полное название директории, где будет хранится cab-файл (директория на сервере, например /chat);
TargetURL — url директории, где будет хранится cab-файл, например http://www.petya.com/chat/);
HTML dir — совпадает с TargetDir.
Устанавливаем галочку напротив Use CAB file compression (файлы формата .cab весят гораздо меньше, чем их коллеги .ocx). Теперь выбираем Project > Web Deploy. В директории dir/chat, где dir — каталог, в который вы сохранили проект. Появятся два файла с расширениями .html и .cab. Чтобы это все работало, необходимо скопировать на сервер в папку chat-файлы с расширением .cab, с расширением .html и три (четыре) файла с расширением .txt.

