Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 711

Раздел: Delphi » Прочее
/ вопрос открыт /

здравствуйте, эксперты!
Я пишу свой icq клиент, с помощью компонента ticqclient
сейчас я пишу уже процедуру, которая загружает с сервера мой контакт лист.
сам кл у меня это listview/
написал процедуру(она ниже), все компилируется..
далее уже в скомпилированном проекте когда уже вышел в сеть посылаю запрос на прием контакт листа.
И на самом контакте уже ноявилась полоса прокрутки, как высвечивается ошибка: List index out of bounds (9) иногда в скобочках 10.
пожалуйста помогите мне... по возможности ответить на zorazo@ric-client.ru

Приложение:
  1. procedure TMainForm.ICQClient1ServerListRecv(Sender: TObject;
  2. SrvContactList: TList);
  3. var
  4. i: Word;
  5. UserInfo: TUINEntry;
  6. ListItem: TListItem;
  7. begin
  8. if SrvContactList.Count > 0 then
  9. for i := 0 to SrvContactList.Count - 1 do
  10. begin
  11. UserInfo := PUINEntry(SrvContactList.Items[i])^;
  12. if UserInfo.CType = U_VISIBLE_LIST then
  13. ICQClient1.VisibleList.Add(IntToStr(UserInfo.UIN))
  14. else if UserInfo.CType = U_INVISIBLE_LIST then
  15. ICQClient1.InvisibleList.Add(IntToStr(UserInfo.UIN))
  16. else if UserInfo.CType = U_NORMAL then
  17. begin
  18. if ICQClient1.AddContact(UserInfo.UIN) then
  19. begin
  20. ListItem := ListView1.Items.Add;
  21. ListItem.ImageIndex := ICON_OFFLINE;
  22. ListItem.Caption := IntToStr(UserInfo.UIN);
  23. end;
  24. end;
  25. end;
  26.  
  27. end;


Шумов Дмитрий Витальевич Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Шумов Дмитрий Витальевич (статус: Посетитель)
Вопрос отправлен: 1 мая 2009, 08:54
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 23 мая 2009, 23:10; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 1 мая 2009, 14:55 [#1]:

За такое форматирование исходника надо бить ногами, причём сильно... И по лицу... Если пишешь так свои программы, то лучше никому не показывай код. Поверь мне: прецеденты БЫЛИ, и не 1 раз.

Я не знаю (пока) ответа на твой вопрос, но я переформатировал твой код и понаставил кое-каких комментов с дополнительными вопросами.

procedure TMainForm.ICQClient1ServerListRecv(Sender: TObject;
  SrvContactList: TList);
var
  i: Word;
  UserInfo: TUINEntry;
  ListItem: TListItem;
begin
  if SrvContactList.Count > 0  // Это условие нафиг не нужно, только сделай i: Integer
    then for i:= 0 to SrvContactList.Count - 1 do
           begin
             UserInfo:= PUINEntry(SrvContactList.Items[i])^; // <-- Истина где-то рядом. Ошибка вылезает тут?
 
             if UserInfo.CType = U_VISIBLE_LIST
               then ICQClient1.VisibleList.Add(IntToStr(UserInfo.UIN))
               else if UserInfo.CType = U_INVISIBLE_LIST
                      then ICQClient1.InvisibleList.Add(IntToStr(UserInfo.UIN))
                      else if UserInfo.CType = U_NORMAL
                             then if ICQClient1.AddContact(UserInfo.UIN)
                                    then begin
                                           ListItem := ListView1.Items.Add;
                                           ListItem.ImageIndex := ICON_OFFLINE;
                                           ListItem.Caption := IntToStr(UserInfo.UIN);
                                         end;
           end; // for
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 1 мая 2009, 14:57 [#2]:

Для начала попробуй воспользоваться конструкцией CASE вместо if if if if..
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Шумов Дмитрий Витальевич

Шумов Дмитрий Витальевич (статус: Посетитель), 1 мая 2009, 15:18 [#3]:

procedure TICQClient.HSnac1306(Flap: TFlapHdr; Snac: TSnacHdr; Pkt: PRawPkt);
var
UINList: TList;
procedure ReadChunk;
var
Len: Word;
FGroup: ShortString;
CTag, CId, CType: Word;
TLen: Word;
TType: Word;
FNick, FCellular: ShortString;
lpEntry: PUINEntry;
FAuthorized: Boolean;
begin
FGroup := GetWStr(Pkt); //The name of the group.
CTag := GetInt(Pkt, 2); //This field seems to be a tag or marker associating different groups together into a larger group such as the Ignore List or 'General' contact list group, etc.
CId := GetInt(Pkt, 2); //This is a random number generated when the user is added to the contact list, or when the user is ignored.
CType := GetInt(Pkt, 2); //This field seems to indicate what type of group this is.
Len := GetInt(Pkt, 2); //The length in bytes of the following TLVs.
if CType = $14 then
FAvatarId := CId;
FNick := '';
FCellular:='';
FAuthorized:=true;
while Integer(Len) > 0 do
begin
TType := GetInt(Pkt, 2); //TLV Type
TLen := GetInt(Pkt, 2); //TLV Len
if TType = $0131 then
FNick := UTF8ToStrSmart(GetStr(Pkt, TLen))
else if TType=314 then
FCellular:=UTF8ToStrSmart(GetStr(Pkt, TLen))
else begin // Support for authorization by yegor
if TType=102
then FAuthorized:=false;
Inc(Pkt^.Len, TLen); //Skip this TLV
end;
Dec(len, TLen + 4); //TLV length + 2 bytes type + 2 bytes length
end;

//Group header

//UIN entry
if (CType=BUDDY_NORMAL) or (CType=BUDDY_GROUP) or (CType=BUDDY_IGNORE) or (CType=BUDDY_INVISIBLE) or (CType=BUDDY_VISIBLE) then
begin
GetMem(lpEntry, SizeOf(lpEntry^));
if CType=BUDDY_GROUP
then begin
lpEntry^.UIN:=CTag;
lpEntry^.Nick:=UTF8ToStrSmart (FGroup);
end
else begin
lpEntry^.UIN:=StrToIntDef (FGroup, 0); // Fixed by yegor thx to Jeka
lpEntry^.Nick:=FNick;
end;
lpEntry^.CType:=CType;
lpEntry^.CTag:=CId;
lpEntry^.CGroupID:=CTag;
lpEntry^.Cellular:=FCellular;
lpEntry^.Authorized:=FAuthorized;
UINList.Add(lpEntry);
end;
end;
var
count, T: Word;
i: Word;
begin
GetTLVInt(Pkt, T); if T <> 6 then Exit;
Inc(Pkt^.Len, 4); //02 00 02 00 - UNKNOWNs
count := GetInt(Pkt, 2); //Total count of following groups. This is the size of the server side contact list and should be saved and sent with CLI_CHECKROSTER.
if count < 1 then Exit;
UINList := TList.Create;
for i := 0 to count - 1 do
ReadChunk;

if Assigned(OnServerListRecv) then
FOnServerListRecv(Self, UINList)//Вот тут эта ошибка вылазиет, но ето в самом компоненте
else
DestroyUINList(UINList);
end;
min@y™

min@y™ (статус: Доктор наук), 1 мая 2009, 15:34 [#4]:

Цитата:


что вы хотели от меня в 14 то лет)


Я не писал ICQ-клиентов, ибо знаю, что дело это бесполезное. И я не буду читать твой код и разбираться в нём. Это трудно. Отдели зёрна от плевел, мух от котлет, проблему от ... Короче, воспользуйся отладчиком, найди хоть строку, где вылазит сообщение об ошибке. И напиши об этом сюда. Вот тогда и поглядим.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Шумов Дмитрий Витальевич

Шумов Дмитрий Витальевич (статус: Посетитель), 23 мая 2009, 23:09 [#5]:

пардон 19 лет быстро набирал
Шумов Дмитрий Витальевич

Шумов Дмитрий Витальевич (статус: Посетитель), 23 мая 2009, 23:10 [#6]:

вообще удалите тему

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 сентября 2020, 04:36
Выполнено за 0.02 сек.
Рейтинг@Mail.ru