Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Снова проблемы с аськой


Автор: Coderr 26.3.2007, 22:01
Доброго времени суток. Использую компонент TICQClient Есть такой код.
Код

procedure TMainForm.ICQClientServerListRecv(Sender: TObject;
  SrvContactList: TList);
var i        : Word;
    j        : integer;
    UserInfo : TUINEntry;
    b        : boolean;
    Empty    : boolean; //если контакт-лист был пуст
    U        : string;
begin

//Узнаём пуст список контактов или нет
//Empty = false - список не пуст
//Empty = true  - список пуст
 Empty:=false;
 if ContactList.Items.Count=0 then Empty:=true;


 if SrvContactList.Count>0 then
  for i:=0 to SrvContactList.Count-1 do begin
   UserInfo:=PUINEntry(SrvContactList.Items[i])^;
   if UserInfo.CGroupID<>UserInfo.UIN then begin
    b:=false;
    U:=IntToStr(UserInfo.UIN);

//Если контакты были не пусты, то ищем контакт в листе
    if not Empty then
     for j:=0 to ContactList.Items.Count-1 do
      if not (InInvisible(ContactList.Items[i].SubItems[0]) and
        InVisible(ContactList.Items[i].SubItems[0])) and
         (U=ContactList.Items[j].SubItems[0]) then begin
       b:=true;
       exit;
      end;

//Если такой контакт не встречается в списке, то добавляем его
    if not b then begin
     with ContactList.Items.Add do begin
      if UserInfo.Nick<>'' then
       Caption:=UserInfo.Nick //Если ник есть, то пишем его
      else
       Caption:=U;            //Если нет ника, то пишем УИН
      ImageIndex:=7;
      SubItems.Add(U);
     end
    end;
   end;
  end;
 ICQClient.DestroyUINList(SrvContactList);

 Application.ProcessMessages;


 //Добавляем контакт в лист
 for i:=0 to ContactList.Items.Count-1 do
  ICQClient.AddContact(strtoint(ContactList.Items[i].SubItems[0]));

end;


Вот эта функция подвешивает прогу. Скажите, что здесь может подвешивать?

ЗЫ Выкладываю ещё код обработки процедуры смены статуса. На всякий случай. =)
Код

procedure TMainForm.ICQClientStatusChange(Sender: TObject; UIN: String;
  Status: Cardinal);
var i,j : integer;
    img : byte;
    s   : string;
begin
 if ContactList.Items.Count>0 then
  for i:=0 to ContactList.Items.Count-1 do
   if ContactList.Items[i].SubItems[0]=UIN then begin
    s:=StatusToStr(Status);
    if s='В сети' then img:=0 else
    if s='Готов поболтать' then img:=1 else
    if s='Отошёл' then img:=2 else
    if s='Не беспокоить' then img:=3 else
    if s='Занят' then img:=4 else
    if s='Недоступен' then img:=5 else
    if s='Невидимый' then img:=6 else
    if s='Злой' then img:=12 else
    if s='Дома' then img:=13 else
    if s='На работе' then img:=14 else
    if s='Депрессия' then img:=15 else
    if s='Кушаю' then img:=16 else
     img:=7;
    for j:=0 to MessForm.Messages.PageCount-1 do
     if MessPages[j].UIN=UIN then
      MessForm.Messages.Pages[j].ImageIndex:=img;
    ContactList.Items[i].ImageIndex:=img;
    Exit;
   end;
end;

Автор: Yanis 27.3.2007, 09:05
Цитата(Coderr @  26.3.2007,  23:01 Найти цитируемый пост)
Вот эта функция подвешивает прогу. Скажите, что здесь может подвешивать?

А для чего нам IDDE дана то? На то, что бы удобно было писать и отлаживать код. Вот и воспользуйся клавишами F4, F5, F7 и F8!

Добавлено через 4 минуты и 24 секунды
Цитата(Coderr @  26.3.2007,  23:01 Найти цитируемый пост)
    if s='В сети' then img:=0 else
    if s='Готов поболтать' then img:=1 else
    if s='Отошёл' then img:=2 else
    if s='Не беспокоить' then img:=3 else
    if s='Занят' then img:=4 else
    if s='Недоступен' then img:=5 else
    if s='Невидимый' then img:=6 else
    if s='Злой' then img:=12 else
    if s='Дома' then img:=13 else
    if s='На работе' then img:=14 else
    if s='Депрессия' then img:=15 else
    if s='Кушаю' then img:=16 else
     img:=7;

Прикольно smile

Автор: Coderr 27.3.2007, 16:11
На счёт "прикольно" - я старался, но так не тока у меня. Такой метод я из экзампла взял.

На счёт клавиш - трейсил я! Причём заметил такую закономерность. Утром всё работает как часы, а вот днём и ночью ни в какую... Мистика. Именно трассировкой я нашёл, что тормоза именно в этом событии.
Ещё трассировка показала, что если убрать вот эту строчку:
Код

//Добавляем контакт в лист
 for i:=0 to ContactList.Items.Count-1 do
  ICQClient.AddContact(strtoint(ContactList.Items[i].SubItems[0]));

то всё работает нормально, но зато событие OnStatusChange не будет вызываться...

Автор: Coderr 31.3.2007, 20:48
Трассировка показала, что вышеперечисленные события не виноваты. Эта ошибка появляется после них...
Вот только не отображается строка, после которой вылетает ошибка. Может опять проблема в компоненте?
В аттаче скрин ошибки.

Автор: bems 31.3.2007, 23:36
Код

for i:=0 to ContactList.Items.Count-1 do
  ICQClient.AddContact(strtoint(ContactList.Items[i].SubItems[0]));

Ты уверен, что метод ICQClient.AddContact не увеличивает список ContactList.Items?

Автор: ivan219 1.4.2007, 00:00
Поповоду прикольно: возникнут проблемы в нерускоязычной Windows помойму тут лучше подумать и циферками это дело оргинизовать.

Вот так будет по симпатичнее.
Код

case S of
     0: img:=0;
     1:;
     2:;
     3:;
     4:;
     5:;
     6:;     
     7:;
     8:;
     9:;
     10:;
     11:;
     12: img:=7;;
end;

А вот по поводу того как S присвоить номер это надо весь код смотреть там скорей всего массив есть где 'В сети' 'Кушаю' прописанны вот от туда и бери если нет то организуй так проще да и надёжнее будет.

Автор: Coderr 1.4.2007, 20:25
Цитата(bems @ 31.3.2007,  23:36)
Код

for i:=0 to ContactList.Items.Count-1 do
  ICQClient.AddContact(strtoint(ContactList.Items[i].SubItems[0]));

Ты уверен, что метод ICQClient.AddContact не увеличивает список ContactList.Items?

Нет. ContactList - это компонент TListView...  smile 
В http://mandarinsoft.ucoz.ru/Thumbelina/chat.rar компонент и исходник главной формы.

Автор: ivan219 1.4.2007, 23:13
Там нехватает одного файла и Class TRxTrayIcon

Автор: Coderr 2.4.2007, 20:12
Какого именно файла?
TRxTrayIcon - это компонент из rxLib 2.75

Автор: ivan219 3.4.2007, 16:22
.dpr .cfg .dof .res но восновном .dpr
rxLib 2.75 отдельно компонент можно или придётся всю библ. скачиват?

Автор: Coderr 3.4.2007, 21:52
dpr в аттаче.
rxLib всю качать. Но с трейиконом вроде проблем нет...  smile 

Автор: Yanis 3.4.2007, 22:07
Цитата(Coderr @  31.3.2007,  21:48 Найти цитируемый пост)
Трассировка показала, что вышеперечисленные события не виноваты. Эта ошибка появляется после них...
Вот только не отображается строка, после которой вылетает ошибка. Может опять проблема в компоненте?
В аттаче скрин ошибки. 

Кстати, а галочка «Use Debug DCUIL/DCUs» стоит в настройках проекта?

Автор: Coderr 4.4.2007, 19:29
"Use Debug DCUs"? Стоит!
У меня появилась мысль, что неправильно добавляются элементы в TListView... Я испытываю на своём номере, которым пользуюсь постоянно. Контакт-лист = 106 юзеров...  smile 

Автор: Yanis 4.4.2007, 20:00
Coderr
Ну раз уж такой сложный случай, то либо досконально дебаж код пополнения ListView, либо выводи это пока что в TStringList какой-нибудь. Мона и в Memo.

Автор: Coderr 16.4.2007, 23:53
Вопрос исчерпан... Спасибо всем за внимание!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)