|
Вопрос # 2 711/ вопрос открыт / |
|
здравствуйте, эксперты!
Я пишу свой icq клиент, с помощью компонента ticqclient
сейчас я пишу уже процедуру, которая загружает с сервера мой контакт лист.
сам кл у меня это listview/
написал процедуру(она ниже), все компилируется..
далее уже в скомпилированном проекте когда уже вышел в сеть посылаю запрос на прием контакт листа.
И на самом контакте уже ноявилась полоса прокрутки, как высвечивается ошибка: List index out of bounds (9) иногда в скобочках 10.
пожалуйста помогите мне... по возможности ответить на zorazo@ric-client.ru
Приложение: Переключить в обычный режим- procedure TMainForm.ICQClient1ServerListRecv(Sender: TObject;
- SrvContactList: TList);
- var
- i: Word;
- UserInfo: TUINEntry;
- ListItem: TListItem;
- begin
- if SrvContactList.Count > 0 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
- begin
- if ICQClient1.AddContact(UserInfo.UIN) then
- begin
- ListItem := ListView1.Items.Add;
- ListItem.ImageIndex := ICON_OFFLINE;
- ListItem.Caption := IntToStr(UserInfo.UIN);
- end;
- end;
- end;
-
- end;
 |
Вопрос задал: Шумов Дмитрий Витальевич (статус: Посетитель)
Вопрос отправлен: 1 мая 2009, 08:54
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 23 мая 2009, 23:10; участников в обсуждении: 2.
|
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™ (статус: Доктор наук), 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™ (статус: Доктор наук), 1 мая 2009, 15:34 [#4]:
Цитата:
что вы хотели от меня в 14 то лет)
Я не писал ICQ-клиентов, ибо знаю, что дело это бесполезное. И я не буду читать твой код и разбираться в нём. Это трудно. Отдели зёрна от плевел, мух от котлет, проблему от ... Короче, воспользуйся отладчиком, найди хоть строку, где вылазит сообщение об ошибке. И напиши об этом сюда. Вот тогда и поглядим.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|