Помощь - Поиск - Пользователи - Календарь
Полная версия: Массив компонент
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Unconnected
Допустим,нужно много копий одного компонента и возможность обращения к свойствам любого из них. Как это можно реализовать?
volvo
Что именно тебя смущает? Что это массив компонентов? Напрасно: "DRKB -> VCL -> TEdit, TSpinEdit -> Массив Edit-компонентов" приведен пример использования таких массивов.
Unconnected
При использовании такого метода получается, что все Edit'ы уже должны находиться на форме, так? А мне нужно, чтобы было много компонентов без помещения их на форму... Конкретно icqclient.

mas3:array[1..m] of ticqclient;


Я сначала попробовал так, но при обращении к элементу, например mas3[4].login вылетает ошибка Acsess Violation. Хотя просто icqcliet1.login всё нормально..
volvo
Цитата
Я сначала попробовал так, но при обращении к элементу, например mas3[4].login вылетает ошибка Acsess Violation. Хотя просто icqcliet1.login всё нормально..
Просто icqclient1 у тебя лежит на форме, то есть, конструктор его тебе (вручную) вызывать не надо. Если же у тебя массив компонентов, НЕ присутствующих на форме - то перед обращением к методу требуется вызвать конструктор (что там у TIcqClient за конструктор? Create?)... Что-то вроде
mas3[4].Create(nil); // Ну, или как там конструктор называется...
mas3[4].UIN := ...
mas3[4].Password := ...
mas3[4].Login;
Unconnected
Сделал в цикле:

  for z:=1 to i do
begin
mas3[z].create(nil);
mas3[z].uin:=.....;
mas3[z].password:=.....;
mas3[z].login;
end;


И опять Acsess Violation..Показывает на строку с конструктором. Может, не Create, а ещё что-то, как узнать?
Unconnected
Кстати, если просто написать TIcqClient.create(nil), то всё нормально..
volvo
Блин... FPC-шная привычка... Не так, конечно, это не Дельфи-way... Вот так:
mas3[z] := TIcqClient.create(nil);

Unconnected
Спасибо! good.gif good.gif good.gif smile.gif
Unconnected
Ещё проблема... На форме у нас компонента нет. А если, допустим, нужно обработать событие OnMessageRecv, что делать?
volvo
В класс формы добавляешь свой обработчик:
procedure TForm1.myOnMessageRecv(Sender: TObject; Msg, UIN: String);
begin
// делаешь то, что тебе надо
end;


и присваиваешь это событие конкретному экземпляру после Login:
  ...
mas3[z].login;
mas3[z].OnMessageRecv := myOnMessageRecv;
...
Unconnected
Спасибо, работает smile.gif
Unconnected
Теперь возникла небольшая проблема, на коде

Код
mas3[z].Onserverdisconnect:=myOnserverdisconnect;


вылетает Incompatible types: 'Parameter lists differ'..
volvo
Как описывал myOnserverdisconnect покажи...
Unconnected
Код
Procedure MyOnserverdisconnect(sender:TObject);


Эта процедура описана в модуле главной формы, но вызывается из потока..

Код
mas3[z].Onserverdisconnect:=form1.myOnserverdisconnect;


Добавлено через 7 мин.
Всё,я догадался,в чём проблема, описание MyOnServerdisconneсt не совпадало с описанием Onserverdisconnect в TIcqClient. Надо было так:

Код
Procedure MyOnserverdisconnect(sender:TObject;Reason: Integer;  Description: string);
Unconnected
Стала возникать ошибка на строке
Код
Procedure myonlogin(sender:tobject);
в классе формы. Ошибка
Цитата
[Pascal Error] Unit1.pas(95): E2065 Unsatisfied forward or external declaration: 'TForm1.myonlogin'
.

Использую в
Код
mas3[z].OnLogIn := myOnLogIn;


Код
Procedure myonlogin(sender:TObject);
begin
  ...
end;

Попробовал даже объявить новый класс и добавить обработчик туда, ошибка не исчезла.. Причём когда только добавил обработчик на событие - всё работало, а что потом произошло..
volvo
Цитата
Попробовал даже объявить новый класс и добавить обработчик туда, ошибка не исчезла..
Зачем новый класс? У тебя ж в сообщении об ошибке ясно сказано, что должно быть:
Procedure TForm1.myonlogin(sender:TObject);
begin
...
end;
, компилятор тебе говорит, что он не нашел реализации этого метода...
Unconnected
Благодарю,работает(как же блин всё просто оказывается)... good.gif

Ещё один сопутствующий вопрос: в TIcqClient событие "насильственного" отключения от сервера(по инициативе сервера) - это OnServerDisconnect как я понял?
volvo
Цитата
событие "насильственного" отключения от сервера(по инициативе сервера) - это OnServerDisconnect
Да, оно самое...
Unconnected
А вот допустим если мне нужно узнать, находится ли мой номер в онлайне, можно сделать так:
if not(mas3[valid1[ab]].LoggedIn) then ...

?
volvo
Ну, откуда же я знаю, что такое у тебя valid1, например? Вообще принцип правильный, надо проверять поле LoggedIn...
Unconnected
..при ближайшем знакомстве с компонентом TIcqClient я начал понимать, что местами он ну очень неудобный... Т.е. в него вложено много всего того, что мне вообще не нужно, а это не лучшим образом сказывается на производительности. Есть ли возможность работать с протоколом напрямую, без всяких компонентов, т.е. просто кодом делать то, что нужно? Протокол ICQ закрытый, насколько я знаю..
volvo
Цитата
Протокол ICQ закрытый, насколько я знаю..
Неправда. С 5-го марта 2008 OSCAR открытый (но не свободный !!!) протокол: Wiki: OSCAR (протокол), там же ссылки на спецификацию...
Unconnected
http://dev.aol.com/aim/oscar/

Вот это да.. Мне это только года через 4 читать)) Лучше из компонента всё ненужное попробую выбросить..
Unconnected
В TIcqclient есть процедура смены информации номера. Входные параметры на рисунке:

ScreenShot

Так вот, на скриншоте видно, что параметр Gender, например (это пол, и некоторые другие) типа byte или word.. Какая система обозначений применяется?
volvo
Ну, с Gender-ом все просто:
  FGender := GetInt(Pkt, 1); // The user's gender. 1 = female, 2 = male, 0 = not specified.
, с TimeZone чуть сложнее:
Цитата
Чтобы сконвертировать TimeZone в нормальное представление(типа +2:00), вы должны сделать следующее:
var
S: String;
// ...
S := IntToStr(- ShortInt(TimeZone) div 2) + ':' + IntToStr(Abs(ShortInt(TimeZone) mod 2 * 30));
, а страны представляются вот так:
const
Countries: array[0..242] of record Ident: Word; Value: String end = ...
, где Value представляет название страны, для которой телефонный код хранится в Ident. К примеру, 1 = USA, 7 = Russia, 711 = Uzbekistan, и так далее... Для конвертации кода страны в название есть функция
function CountryToStr(Value: Word): String;
, кстати...
Unconnected
Про TimeZone не совсем понял.. Нормальное представление - это +2:00, к примеру, а входной параметр имеет тип byte, он же такую запись не примет, правильно..?
volvo
Правильно. Именно поэтому чтобы ПРЕОБРАЗОВАТЬ значение TimeZone к привычному, надо произвести вышеописанную процедуру.
Unconnected
Ясно. Ещё про страны: вот, допустим, выбор страны у меня в combobox'е, обязательно руками вбивать все 242 страны или есть какая-то структура специальная для выбора?(обленился я совсем cool.gif ) Есть же ComboBox для шрифтов, где они уже заложены в компонент..

Цитата
const
Countries: array[0..242] of record Ident: Word; Value: String end = ...


Здесь после равно идёт перечисление стран, так ведь?

Всё, я понял, это в icqworks.pas все страны и вбитыsmile.gif
Unconnected
volvo, возможно, я не прав, но тебе не кажется, что это

Цитата
Чтобы сконвертировать TimeZone в нормальное представление(типа +2:00), вы должны сделать следующее:
var
S: String;
// ...
S := IntToStr(- ShortInt(TimeZone) div 2) + ':' + IntToStr(Abs(ShortInt(TimeZone) mod 2 * 30));


преобразует целочисленное значение (которое нужно в качестве входного параметра процедуре) в запись +2:00? А нужно-то наоборот. Или я опять что-то не понял..
volvo
Ну, если я не ошибся, то обратное преобразование (из th и tm в переменную типа byte) будет таким:
b := byte(-2 * shortint(th)) + (tm div 30) * (1 - 2 * (byte(th >= 0)));

Только учти один особый случай... Поскольку 0 знака не имеет, то время -0:30 должно кодироваться при th = 0 и tm = -30.
Unconnected
Мда, вот неудача.. Несколько дней писал интерфейс, а SetSelfInfo возьми да и не заработай.. wacko.gif

Код
  form1.ICQClient1.UIN:=*******;
  form1.icqclient1.Password:='********';
  form1.icqclient1.Login;
  form1.ICQClient1.SetSelfInfo(nickname,firstname,lastname,email,city,state,phone,fax,
   & nbsp;street,cellular,zip,country,timezone,publish,age,gender,homepage,birthyear,
birthmonth,birthday,
    lang1,lang2,lang3,about,autoriz,web);
  form1.icqclient1.logoff;


Логин проходит нормально. После этого если вбить номер в поиске QIP, например, то информация та же самая..
volvo
SetSelfInfo - это что? Нет такого метода в TICQClient, есть SetSelfInfoGeneral, есть SetSelfInfoMore...
Unconnected
А у меня есть smile.gif TIcqClient 1.34

http://xmages.net/out.php/i142119_.JPG

Попробую-ка по частям инфо вбивать...

Добавлено через 17 мин.
setselfinfogeneral(...); - тоже не меняет.. wacko.gif
Unconnected
А ларчик просто открывался.. После логина нужно было ждать около 5 секунд и тогда уже менять информацию..
Unconnected
Ещё одна небольшая неувязка - индекс, передаю в процедуру '123', например, а в номере меняется на '842072068'..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.