Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2011, 12:28   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Восклицание Изменить в цикле записи ListView в определённых колонках

1. Есть ListView с записями (три колонки: Адресс, Имя, Карта)
2. В цикле берём Caption первой строки (Адрес) и после опроса дописываем в эту же строку SubItems[0] (Имя) и SubItems[1] (Карта) и так для всех колонок в ListView.
Если один из северов не отвечает, то поток заканчивает свою работу, этого не должно быть. Если север выключен, то Delphi указывает на
Код:
Delete(txt, 1, Pos('\hostname\', txt) - 1);

Последний раз редактировалось Shouldercannon; 20.05.2011 в 13:22.
Shouldercannon вне форума Ответить с цитированием
Старый 20.05.2011, 13:00   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Это просто:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  LI: TlistItem;
  i: smallint;
begin
  for i := 1 to 5 do
  begin
    LI := ListView1.Items.Add;
    Li.Caption := IntToStr(i);
    li.SubItems.Add(IntToStr(i));
    li.SubItems.Add(IntToStr(i));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, i2: SmallInt;
begin
  for i := 0 to ListView1.Items.Count - 1 do  //цикл по элементам caption
  begin
    ListView1.Items[i].Caption := 'changed';
    for i2 := 0 to ListView1.Items[i].SubItems.Count - 1 do  //цикл по суб-строкам строки caption
    begin
      ListView1.Items[i].SubItems[i2] := 'Sub changed!';
    end;
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 20.05.2011, 13:20   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Не стал заморачиваться. Просто содержимое ListView заношу в TStringList, потом затираю ListView и заново веду заполнение. Всё бы хорошо, но поток убивается на неотвечающем сервере
Код:
var
  IdUDPClient: TIdUDPClient;
  TSL: TStringList;
  Server: TListItem;
  i: Integer;
  txt, HostName, MapName, GameType, NumPlayers, MaxPlayers, Lock: string;
begin
  FormMain.ListView1.Clear;

  IdUDPClient := TIdUDPClient.Create(nil);
  TSL := TStringList.Create;
  TSL.LoadFromFile(ExtractFilePath(Application.ExeName) + 'test.txt');

  for i := TSL.Count - 1 downto 0 do
  begin
    Server := FormMain.ListView1.Items.Add;
    Server.Caption := TSL.Strings[i];

    IdUDPClient.Host := Copy(TSL.Strings[i], 1, Pos(':', TSL.Strings[i]) - 1);
    IdUDPClient.Port := StrToInt(Copy(TSL.Strings[i], Pos(':', TSL.Strings[i]) + 1, Length(TSL.Strings[i])));
    IdUDPClient.Active := True;
    IdUDPClient.Send('\status\');
    txt := IdUDPClient.ReceiveString(2000);

    Delete(txt, 1, Pos('\hostname\', txt) - 1); // При выключенно севрере тут поток заканчивает свою работу. Этого не должно быть!
    HostName := Copy(txt, Pos('\hostname\', txt) + 10, Pos('\hostport\', txt) - 11);

    Server.SubItems.Add(HostName);
  end;

  IdUDPClient.Free;
  TSL.Free;
Shouldercannon вне форума Ответить с цитированием
Старый 20.05.2011, 13:26   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Этого не должно быть!

Код:
if (0 < Pos('\hostname\', txt)) then begin
  Delete(....);
  Copy(....);
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 20.05.2011, 14:21   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
> Этого не должно быть!

Код:
if (0 < Pos('\hostname\', txt)) then begin
  Delete(....);
  Copy(....);
end;
Не помогает, видимо из-за самой ошибки UDP вылетает поток. Как обойти эту ошибку?
Изображения
Тип файла: gif error.gif (7.2 Кб, 74 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 20.05.2011, 14:59   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Обернуть проблемный код в try ... except end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 20.05.2011 в 15:05.
veniside вне форума Ответить с цитированием
Старый 20.05.2011, 15:26   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Обернуть проблемный код в try ... except end;
Я так с самого начала подумал и обернул
Код:
Delete(txt, 1, Pos('\hostname\', txt) - 1);
дабы Delphi на него указал, а оказалось надо было обернуть
Код:
txt := IdUDPClient.ReceiveString(2000);
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить выделнную запись ListView Shouldercannon Общие вопросы Delphi 5 12.05.2011 22:41
ListView изменить Subitem отпеделённого Items'а Человек_Борща Помощь студентам 5 24.11.2010 13:27
Изменить цвет subitem-а в ListView zver777 Общие вопросы Delphi 4 28.07.2010 00:56
Изменить цвет части строки в ListView zver777 Общие вопросы Delphi 5 21.06.2010 14:07
Удаление записи в ListView Небесный Общие вопросы Delphi 1 14.12.2008 22:22