![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ну не получается блин....
Supreme © (2002-12-25 14:22:00)Я когда-то задавал воспрос про то как назначить компанентам TICQClient свойство UIN и Password,
если неизвестно сколько строк может быть в Listbox. Т.е. надо было посчитать строки и выбрать
такое же количество ICQClient"ов и назначить каждому своё.
Код был такой:
procedure TForm.Timer1Timer(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TICQClient then
with TICQClient(Components[i]), ListBox1.Items do
begin
UIN := StrToInt(Names[Tag]);
Password := Values[IntToStr(UIN)];
end;
Timer1.Enabled:=False;
end;
Но почему то на этой строке "UIN := StrToInt(Names[Tag]);" Delphi выдаёт ошибку,
что, мол, не Integer Value "", хотя на 100% проверено, что в Listbox"e только цифры.
Я уже и c memo Пробовал такое делать - тоже нифига. Я вот чё думаю, может всё из-за того,
что "переход" на новую строчку в ListBox"e или memo не считается за Integer (ну т.е. то же самое,
что и если нажать Enter и осуществится переход на новую строчку).
Что у меня не так?? Не понимаю...
gsu (2002-12-28 11:00:00) [1]Возможно, но их надо выделять синхронно и соответственно инициировать
Supreme (2002-12-27 20:03:00) [2]Так что, получается невозможно сделать чтобы в зависимости от того сколько у меня в ListBox1 строк, чтобы и столько же компанент ICQClient использовалось?
Digitman (2002-12-27 17:25:00) [3]))
Да никак !
Ты вникни :
> Если значение св-ва Tag (понятия не имею, что у тебя там Tag находится - сам смотри) используется как индекс элемента
> списка ListBox1.Items, то оно (ЗНАЧЕНИЕ СВ-ВА TAG !!!!) должно лежать в диапазоне
>
> [0 .. ListBox1.Items.Count - 1]
>
Supreme (2002-12-27 16:35:00) [4]Так а как уменьшить на 1 значение ListBox1.Items в моём коде?
Digitman (2002-12-27 08:12:00) [5]Если значение св-ва Tag используется как индекс элемента списка ListBox1.Items, то оно должно лежать в диапазоне
[0 .. ListBox1.Items.Count - 1]
Проверяй и принимай меры , если это не так.
Supreme (2002-12-26 21:36:00) [6]Так а что делать?
gsu (2002-12-26 19:53:00) [7]Никуда, это он пишет что у тя нету такого индекса, н-р, Tag = -1 или 1 000 000
Supreme (2002-12-26 19:24:00) [8]Попробовал вот так:
procedure TForm.Timer1Timer(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ComponentCount - 1 do
if Components[i] is TICQClient then
with TICQClient(Components[i]), ListBox1.Items do
begin
UIN := StrToInt(ListBox1.Items[Tag]);
Password := Values[IntToStr(UIN)];
end;
end;
А Delphi теперь говорит, что "List Index out of bounds..."
Вобщем куда-то надо поставить ListBox1.Items-1. А куда?
Digitman (2002-12-26 14:42:00) [9]Это
> with ListBox1.Items.Strings do
даже скомпилировано не будет, ибо Strings - не объектное свойство, а строковое (к тому же требует указание индекса возвращаемой из списка строки)
gsu (2002-12-26 14:08:00) [10]>> да как ? оч просто :
Я имел ввиду: with ListBox1.Items.Strings do
Digitman (2002-12-26 13:55:00) [11]да как ? оч просто :
with ListBox1.Items do
for i:= 0 to Count - 1 do
Strings[i] := IntToStr(i);
gsu (2002-12-26 13:14:00) [12]>> либо меняй формат каждой строки
не хорошо - это, лучше вообще LB выбросить, раз значения числа, максимум использовать stringlist, а конструкция with do у него items и съела, вот.
Интересно как в with ListBox1.Items do задать, н-р, items[1]:=1, но не явно, типа self[1]:=1 ???
Digitman (2002-12-26 13:01:00) [13]Вот ты заладил про свой ICQClient)
У тебя до ICQ даже дело еше не доходит.
Все упирается в то, что не Names[] нужно использовать, а Items[] !
Для того, чтобы использовать св-во Names[], нужно чтобы каждый строковый эл-т списка ListBox имел формат
NAME = VALUE
где "NAME" и знак "=" - обязательные элементы строки, а VALUE - необязательный
Пойми, что Names[] не просто берет целиком строчку из списка, а производит парсинг строчки на предмет наличия знака "=" после непустого множества символов ДО этого знака. Если это условие не соблюдено тобой, то Names[] вернет пустую строку, и результат преобразования к Integer вызовет исключение EConvertError. Что ты, собственно, и наблюдаешь.
Одним словом - либо используй StrToInt(Items[i]) либо меняй формат каждой строки в ListBox"е на
1435143 =
87277544 =
28546436 =
2487567 =
54667654 =
5466657 =
gsu (2002-12-26 12:58:00) [14]>> программа должна из database.ini найти ЭТОТ UIN
А причем здесь LB ?
Если берешь число из LB, то так:
UIN := StrToInt(LB.items[ICQClient.tag]), а Names здесь не причем
Supreme (2002-12-26 12:42:00) [15]Чё то не понял...
Я вам опишу, что мне необходимо сделать полностью:
В ListBox1 при создании форму у меня заносятся UINы, которые берутся из database.ini. В итоге получается ListBox1 примерно с таким содержанием:
1435143
87277544
28546436
2487567
54667654
5466657
т.е. только одни цифры.
Ещё у меня на форме имеется множество компанент TICQClient.
И в зависимости от того сколько UINов содержится в ListBox1, стольким ICQClient и будут ставится значения. Но, как только ICQClient будет получать значение "UIN", программа должна из database.ini найти ЭТОТ UIN и глянуть его значение. В данном случае это пароль. И поставить пароль в свойство Password компаненты ICQClient.
Вот вся проблема.
Не знаю что у меня не получается, сколько уже не пробовал... :(
Кто поможет кодом, буду благодарен.
gsu (2002-12-26 11:47:00) [16]Если 1= ппвваы, то все работает и в Names будет 1 !!!
Digitman (2002-12-26 10:09:00) [17]
> gsu
Тогда уж (для твоего примера) наоборот :
Names[i] - это "1"
Values[i] - это "ппвваы"
Тут как раз Names[i] допустит конвертацию, а Values[i] даст EConvertError
Скорей всего, у автора наоборот : строки в списке имеют формат
NICKNAME = 12345678 (коль скоро речь об ICQ идет)
И, пытаясь преобразовать Names[i] = "NICKNAME" в Integer человек с завидной регулярностью получает граблями по лбу))
Если так, то "ларчик просто открывался" - не Names[i], а Values[i] нужно приводить к Integer
gsu (2002-12-25 21:15:00) [18]Names[Index: Integer] String
Применяется для списков, имеющих структуру "Имя = Значение". Такую структуру имеют, например, файлы .ini. Свойство Names возвращает Имя, использованное в строке с указанным индексом. Если строка не имеет форму "Имя = Значение", возвращается пустая строка. Свойство только для чтения.
Дело в том, что Имя выдается в виде втроки и если у тя 1 = ппвваы,
то Имя будет "1 ", что в int не переводится
Supreme (2002-12-25 19:43:00) [19]Всё равно не получается :((
myor (2002-12-25 14:33:00) [20]>UIN := StrToInt(Names[Tag]);
еще тут tag должен быть integer.
попробуй в лоб:
UIN := StrToInt(Names[1]);