Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.03.2016
Сообщений: 25
1

Уведомление о входящем сообщении в локальном чате Delphi

18.04.2017, 15:00. Просмотров 583. Ответов 1


Такая ситуация. Реализовано клиент-серверное приложение. Пользователь авторизируется и оформляет запрос. По нажатию на кнопку "Запросить" необходимо что бы появилось уведомление серверу о том, что пришел запрос.
Замечу, что клиент это один проект,а сервер другой проект делфи.

Код "Запросить"
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
begin
if (Edit1.Text = '') or (memo1.Text = '') then
begin
MessageBox (Handle, 'Заполните все поля!', 'Ошибка', 0);
end
else   begin
DataModule1.ADOTable2.Insert;
Datamodule1.ADOtable2.FieldByName('data').AsDateTime:=date();
Datamodule1.ADOtable2.FieldByName('opis').AsString:=Memo1.Text;
Datamodule1.ADOtable2.FieldByName('log').AsString:=Datamodule1.ADOtable1.FieldByName('login').AsString  ;
Datamodule1.ADOtable2.FieldByName('par').AsString:=Datamodule1.ADOtable1.FieldByName('parol').AsString  ;
Datamodule1.ADOtable2.FieldByName('srok').AsInteger:=strtoint(Edit1.text);
DataModule1.ADOTable2.Post;
  MessageDLG('Спасибо! Ваш запрос принят',mtInformation,[mbOK],0);
  Form14.show;
  form4.Close;
DataModule1.ADOTable2.Requery;
end;
Код формы "сервера"
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
procedure TForm8.Button2Click(Sender: TObject);
begin
ShellExecute(Handle, 'explore', PChar(ExtractFilePath(ParamStr(0)) + 'Хранилище'), nil, nil, SW_SHOWNORMAL)
end;
procedure TForm8.FormCreate(Sender: TObject);
begin
TextEdit.Clear;
    ChatRichEdit.Lines.Clear;
  PrivateEdit.Text:='Всем';
  Receive := false; 
end;
procedure TForm8.FormShow(Sender: TObject);
var UItems: TListItem;
begin
      Niks:=Form2.NikEdit.Text;   {присваемый ник сервера по его логину}
      SS2.Port:=1313;             {запишем указанный порт в ServerSocket}
      SS2.Active:=True;           {запускаем сервер}
 
      ShowColorMassage('00119['+TimeToStr(Time)+']  Сервер создан.', 2); {}
      SpeedButton4.Tag:=1;{}
      SpeedButton4.Caption:='Закрыть сервер';
  UserListView.Items.Clear;
  UItems:=UserListView.Items.Add;
  UItems.Caption:=Niks;
  UItems.ImageIndex:=1;end;
 
procedure TForm8.SendBitBtnClick(Sender: TObject);
 var
      i:integer;
  begin
    // если сообщение для всех
      If PrivateEdit.Text='Всем'
        then
          Begin
            // отправляем сообщение с сервера всем пользователям
              For i:=0 to SS2.Socket.ActiveConnections-1 do
                  Begin
                      SS2.Socket.Connections[i].SendText('0'+FontName  // 1 байт - шрифт
                                                            +FontSize  // 1 байт - размер
                                                            +FontColor // 2 байта - цвет
                                                            +'['+TimeToStr(Time)
                                                            +']  '+Niks
                                                            +':  '+TextEdit.Text);
                  end;
            // отобразим сообщение в ChatRichEdit
              ShowColorMassage('0'
                           +FontName
                           +FontSize
                           +FontColor
                           +'['+TimeToStr(Time)
                           +']  '+Niks
                           +':  '+TextEdit.Text, 0);
              TextEdit.Clear;
          end
            else
               Begin
                  // если выбран не свой  ник
                  If PrivateEdit.Text<>Niks
                    then
                        Begin
                          // создаем цикл поиска приватного пользователя
                            For i:=0 to SS2.Socket.ActiveConnections-1 do
                                Begin
                                // если пользователь найден
                                    If TUserList(SS2.Socket.Connections[i].Data).Name=PrivateEdit.Text
                                      then
                                        Begin
                                    // отсылаем сообщение в канал приватного пользователя
                                            SS2.Socket.Connections[i].SendText('3'
                                                                  +FontName
                                                                  +FontSize
                                                                  +FontColor
                                                                  +PrivateEdit.Text+Chr(152)
                                                                  +'>> ['+TimeToStr(Time)
                                                                  +']  '+Niks
                                                                  +':  '+TextEdit.Text);
                                  // отобразим сообщение в ChatRichEdit, приват ушел
 
 
                                            TextEdit.Clear;
                                    // сбрасываем цикл
 
                                            break;
                                        end;
                                end;
                        end;
               end;
 
end;
procedure TForm8.ShowColorMassage(msg: String; index: Byte);
var i:integer;
begin
// работаем с полем чата
  With ChatRichEdit do
    Begin
// переход на новую строку
      Lines.Add('');
// название шрифта, смотрим соответствие в списке
      SelAttributes.Name:=Form5.FontComboBox.Items.Strings[StrToInt(Copy(msg,2,1))];
// размер шрифта, смотрим соответствие в списке
      SelAttributes.Size:=StrToInt(Form5.SizeComboBox.Items.Strings[StrToInt(Copy(msg,3,1))]);
// цвет текста, смотрим соответствие в списке (не забываем про хитрость с десяткой)
      SelAttributes.Color:=Form5.ColorBox.Colors[StrToInt(Copy(msg,4,2))-10];
// условия применения стиля к тексту
      If index = 0 then SelAttributes.Style := [];        // обычный (сообщения)
      If index = 1 then SelAttributes.Style := [fsBold];  // полужирный (приват)
      If index = 2 then SelAttributes.Style := [fsItalic];  // курсив (системное)
// добавляем текст сообщение в поле чата, только его содержательную часть
      SelText:=Copy(msg,6,Length(msg)-5);
    end;
end;
procedure TForm8.SpeedButton3Click(Sender: TObject);
begin
   PrivateEdit.Text:='Всем';
end;
procedure TForm8.SpeedButton4Click(Sender: TObject);
begin
If SpeedButton4.Tag=1 then
      Begin
// разрешаем обновление
      UpdateUserList;
 
// очищаем список клиентов
      UserListView.Items.Clear;
// закрываем сервер
      SS2.Active:=False;
// выводим сообщение в ChatRichEdit
// сразу зададим параметры шрифта (Arial, 8, красный, курсив)
      ShowColorMassage('00119['+TimeToStr(Time)+']  Сервер закрыт.', 2);
// возвращаем тэгу исходное значение
      SpeedButton4.Tag:=0;
// возвращаем исходную надпись клавиши
      SpeedButton4.Caption:='Включить сервер';
    end
  else
    Begin
// запишем указанный порт в ServerSocket
      SS2.Port:=1313;
// запускаем сервер
      SS2.Active:=True;
      ShowColorMassage('00119['+TimeToStr(Time)+']  Сервер создан.', 2);
      SpeedButton4.Tag:=1;
      SpeedButton4.Caption:='Закрыть сервер';
      UpdateUserList;
    end
end;
 
procedure TForm8.SpeedButton5Click(Sender: TObject);
begin
ChatRichEdit.Clear;
end;
 
procedure TForm8.SS2ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
 var
      d:TUserList;
  begin   
        ShowColorMassage('00119['+TimeToStr(Time)+']  Подключился клиент.', 2); 
        d:=TUserList.Create;
        d.Name:='';
        d.Image:=0;
        Socket.Data:=TObject(d);
        Socket.SendText('1');
end;
 
procedure TForm8.SS2ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
 var
      j,ind:integer;
  begin
    // добавим в ChatRichEdit сообщение с временем отключения клиента
    // сразу зададим параметры шрифта (Arial, 8, красный, курсив)
      ShowColorMassage('00119['+TimeToStr(Time)+']  Клиент отключился.', 2);
    // разрешаем обновление
      ind:=-1;
      For j:=0 to SS2.Socket.ActiveConnections-1 do
          Begin
              if Socket=SS2.Socket.Connections[j]
              then
                ind:=j;
          end;
 
        TUserList(Socket.Data).Free;
        Socket.Data:=nil;
        UpdateUserList;
end;
 
procedure TForm8.SS2ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
      count,i,b,j,ind,z,sz:integer;
      com:Byte;
      FS:TFileStream;
      buf: Pointer;
      tmp,txt:string;
  begin
    Application.ProcessMessages;
 
    txt:=Socket.ReceiveText();
    if Receive
      then                                       // Если клиент в режиме приёма файла, то...
        Writing(Socket,txt)                      // Записываем данные в буфер
          else                                   // Если клиент не в режиме приёма файла, то...
            begin
                If txt<>'' then                  // условие, что пакет не пуст
            Begin
              com:=StrToInt(Copy(txt,1,1));      // получим код комманды
              len:=Length(txt)-1;                // получим длину строки
 
              Case com of                        // определение комманд
// код приема сообщения --------------------------------------------------------
                0: Begin
// добавим в ChatRichEdit сообщение клиента
                     ShowColorMassage(txt, 0);
// разошлем сообщение пользователям (кроме того, кто прислал)
                     For j:=0 to SS2.Socket.ActiveConnections-1 do
                       Begin
                         if Socket<>SS2.Socket.Connections[j] then
                            SS2.Socket.Connections[j].SendText(txt);
                       end;
                   end;
// -----------------------------------------------------------------------------
// код приема ника клиента -----------------------------------------------------
                1: Begin
// запишем в массив полученный ник
                     TUserList(Socket.Data).Name:=Copy(txt,2,len);
// отметим, что пользователь записан в список
                     TUserList(Socket.Data).Image:=0;
// обновляем список
                     UpdateUserList;
 
 
                   end;
// -----------------------------------------------------------------------------
// код приема приватного сообщения ---------------------------------------------
                3: Begin
// укажем начальный символ
                     poss:=6;
// обнулим счетчик символов
                     x:=0;
// пробегаем по длине принятой строки
                     For j:=6 to len+1 do
                       Begin
// записываем в счетчик сдвиг
                         x:=x+1;
// если найден ключ (конец части ника в строке)
                         If Copy(txt,j,1)=Chr(152) then
                           Begin
// сохраняем ник приватного пользователя
                             PrivateUser:=Copy(txt,poss,x-1);
                           end;
                       end;
// если приватный пользователь - "сервер"
                     If PrivateUser=Niks then
                       Begin
// добавим в ChatRichEdit сообщение клиента
                         ShowColorMassage(Copy(txt,1,5)+Copy(txt,7+Length(PrivateUser),len-Length(PrivateUser)-1), 1);
                       end
                     else
                       Begin
// создаем цикл перебора пользователей
                         For b:=0 to SS2.Socket.ActiveConnections-1 do
                           Begin
// если пользователь найден
                             If TUserList(SS2.Socket.Connections[b].Data).Name=PrivateUser then
                               Begin
 
                                // отсылаем сообщение в канал приватного пользователя
                                 SS2.Socket.Connections[b].SendText(txt);
// сбрасываем цикл
                                 break;
                                  end;
                               end;
                           end;
                       end;
 
              4: Begin
              try
                  MS := TMemoryStream.Create;                         // Создаём буфер для файла
                  Delete(txt, 1, Pos('#', txt));                      // Определяем имя файла
                  FName := Copy(txt, 0, Pos('#', txt) -1);            // Определяем имя файла
                  Delete(txt, 1, Pos('#', txt));                      // Определяем размер файла
                  FSize := StrToInt(Copy(txt, 0, Pos('#', txt) -1));  // Определяем размер файла
                  Delete(txt, 1, Pos('#', txt)); // Удаляем последний разделитель
                  Receive := true;                                    // Переводим сервер в режим приёма файла
                  Writing(Socket,txt);                                // Записываем данные в буфер
              except
              end;
 
                   end;
// -----------------------------------------------------------------------------
 
               end;
            end;
        end;
end;
 
procedure TForm8.TextEditKeyPress(Sender: TObject; var Key: Char);
begin
 If Key=#13 then SendBitBtn.Click;
end;
 
procedure TForm8.UpdateUserList;
var i:integer;
    UItems: TListItem;
    StrUserList:string;
begin
  UserListView.Items.Clear;
  UItems:=UserListView.Items.Add;
  UItems.Caption:=Niks;
  UItems.ImageIndex:=1;
  StrUserList:=Niks+Chr(152);
  For i:=0 to SS2.Socket.ActiveConnections-1 do
  Begin
    if SS2.Socket.Connections[i].data<>nil then
    begin
      UItems:=UserListView.Items.Add;
      UItems.Caption:=TUserList(SS2.Socket.Connections[i].data).Name;
      UItems.ImageIndex:=TUserList(SS2.Socket.Connections[i].data).Image;
      StrUserList:=StrUserList+TUserList(SS2.Socket.Connections[i].data).Name+Chr(152);
    end;
  end;
  For i:=0 to SS2.Socket.ActiveConnections-1 do
  begin  
    SS2.Socket.Connections[i].SendText('2'+StrUserList);
  end;
end;
  procedure TForm8.Writing(Sock:TCustomWinSocket;Text: string);
begin
  if MS.Size < FSize then             // Если принято байт меньше размера файла, то...
  MS.Write(Text[1], Length(Text));    // Записываем в буфер
  // Выводим прогресс закачки файла
  PB.Position:= MS.Size*100 div fSize;
 //SB.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
  if MS.Size = FSize then            // Если файл принят, то...
  begin
    Receive :=false;                 
    MS.Position := 0;               
    if not(DirectoryExists(ExtractFilePath(ParamStr(0)) + '\' + 'Хранилище Файлов'))
        then
          CreateDir(ExtractFilePath(ParamStr(0)) + '\' + 'Хранилище Файлов');
    MS.SaveToFile(ExtractFilePath(ParamStr(0)) + '\' + 'Хранилище Файлов\' + fName); // Сохраняем файл
 
    Sock.SendText('4');            
    MS.Free;                          
    SB.SimpleText:= 'Файл принят';
  end;
end;
end.
Объясните как реализовать, куда вставить какой код, можно скинуть примеры. Уведомление должно быть текстовым, типа "вам пришел новый запрос"
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2017, 15:00
Ответы с готовыми решениями:

Уведомление о новом входящем сообщении
Ребят, подкиньте идеи, как организовать уведомление о новом входящем сообщении в виде: Мои...

Оповещение о входящем сообщении
Всем привет. Интересует такой вопрос. outlook 2010 Есть 2 ящика и на оба поступают входящие...

Нажатие по ссылке во входящем сообщении
Добрый день! Ко мне приходят сообщения со ссылками, по нажатию которых скачивается файл. Вот код: ...

Уведомление о сообщении
И снова привет, ребят. Хочу получить красивое уведомление о сообщении как в Skype, Steam, ICQ и...

1
-17 / 1 / 0
Регистрация: 14.05.2017
Сообщений: 38
16.05.2017, 18:44 2
Совет, посмотрите пример, по вашей теме в готовых проектах.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2017, 18:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Уведомление о сообщении
Привет, ребят. Хочу получить красивое уведомление о сообщении как в Skype, Steam, ICQ и т.д. Буду...

Уведомление о новом сообщении
Всем доброго времени суток! Никак не могу найти варианта где я бы мог видеть свои новые сообщения....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.