Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как в ListBox записать в определеную строчку?


Автор: Homer12 3.1.2007, 23:12
Проблема мне надо записать текст в определеную строчку ListBox например в 0 строку 
вот код берет текст 
Edit1.text:=ListBox1.Items[0];
а вторая проблема я не могу проверить есть одинаковый текст в ListBox
например:
я вожу два раза одно и тоже слово и он должен выдать что такоу слово есть в списки 
Зарание блогодарен. smile 

Автор: anwe 3.1.2007, 23:19
Цитата(Homer12 @  3.1.2007,  22:12 Найти цитируемый пост)
Edit1.text:=ListBox1.Items[0];

занесет в edit строчку из листа. Надо наоборот:
Код
ListBox1.Items[0]:=Edit1.text
Ну а второе - обычное сравнение строк.

Автор: Sunvas 4.1.2007, 00:21
http://forum.vingrad.ru/topic-124897/0.html

Автор: alf138 15.11.2009, 12:59
BoxТакая проблема нужно сравнить две строчки в ListBox, т.е 2и4, 5и7, 8и10 срочки находятся и выводятся в ListBox 
Код

var S:String; I:integer; b:Char; l:integer; c:String;
begin
 S:=IntToStr(Socket.SocketHandle)+'>'+Socket.ReceiveText;
 l:=Length(S);
 b:=S[l];     
 c:=S[5];    
 ListBox1.Items.Add(S);
 ListBox1.Items.Add(b);
 ListBox1.Items.Add(c);
if ListBox1.Items[2]=ListBox1.Items[4] then   <=== Вот в этом месте ругается как по другому сравнить срочки в ListBox ???
for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
ServerSocket1.Socket.Connections[i].SendText('ok');  


Автор: Данкинг 15.11.2009, 13:08
if ListBox1.Items.Strings[2]=ListBox1.Items.Strings[4] ........

Автор: alf138 15.11.2009, 13:18
Большое спасибо. Осталось придумать алгоритм проверки.

Автор: Данкинг 15.11.2009, 13:56
А какой алгоритм может быть: проходишь в цикле по строчкам и сравниваешь.

Автор: alf138 15.11.2009, 14:05
Так у меня получилось что например в строчке 2 есть что то а вот в 4 еще нету так вот еще, обьясню подробнее у меня задание создать подобие игры в города на технологии socket, т.е один игрок посылает название вот у меня получается 

1 строчка = само название города
2 строчка =  последний эллемент в этом слове
3 строчка = первый эллемент.
 
Теперь мне на сервере нужно придумать цикл чтобы при ошибки он еще и отправлял сообщение клиент о неправильном слове .

Автор: Данкинг 15.11.2009, 14:49
Цитата(alf138 @  15.11.2009,  14:05 Найти цитируемый пост)
Так у меня получилось что например в строчке 2 есть что то а вот в 4 еще нету 

Есть такое свойство: ListBox1.Items.Count. smile Оно возвращает число строк в ListBox'е.

Автор: alf138 15.11.2009, 15:21
Спасибо огромное, получилось. Теперь алгоритм остался 
Код
if ListBox1.Items.Count>3 then
if ListBox1.Items.Strings[2]=ListBox1.Items.Strings[4] then   
for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
ServerSocket1.Socket.Connections[i].SendText('OK '+ ' next '+'"'+ b +'"');  

И какой тут алгорим ... Что то на ум не чего не приходит. 
При том нужно заменить одну строчку  smile 
Код

if ListBox1.Items.Strings[2]=ListBox1.Items.Strings[4] then 

2=>4
5=>7
8=>10

Автор: amsoft 15.11.2009, 16:44
чтобы пробежаться по всему списку, можно сделать так

Код

for X := 0 to (ListBox1.Items.Count div 3) - 2 do
     if ListBox1.Items.Strings[X*3+2] = ListBox1.Items.Strings[X*3+4] 
     then for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
                  ServerSocket1.Socket.Connections[i].SendText('OK '+ ' next '+'"'+ b +'"');


PS 
Код

(ListBox1.Items.Count div 3) - 2
    
делим на 3, т.к. в списке кол-во строк всегда кратно 3, а отнимаем 2, чтобы цикл начал работать, когда в списке кол-во строк не меньше 6
     

Автор: alf138 15.11.2009, 17:38
Не работает, первый раз отрабатывает потом затухает. 
Код

276>авыаыв
в
а
276>аывх
х
а
276>хххл
л
х

Притом первый раз отрабатывает не отправляя сообщения а потмо на все шлет безразлично какие буквы  первая или последняя.

Автор: amsoft 15.11.2009, 18:22
все работает
у тебя же должны быть равны строки с индексами 2 и 4, 5 и 7
а в твоем примере строка с индексом 2 равна а, 4 строка - х, 5 - а, 7 - л
поэтому и не работает

Автор: alf138 21.11.2009, 11:27
Мучил неделю не чего сдвинуть не могу все как было так и осталось 
Код

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var S:String; I:integer; b:Char; l:integer; c:String; j:integer; X:integer;
begin
 S:=IntToStr(Socket.SocketHandle)+'>'+Socket.ReceiveText;
 l:=Length(S); // Находим длину строки
 b:=S[l];      // выводим последний элемент строки
 c:=S[5];      // выводим первый элемент строки
 ListBox1.Items.Add(S);
 ListBox1.Items.Add(b);
 ListBox1.Items.Add(c);
if ListBox1.Items.Count>3 then
if ListBox1.Items.Strings[2]=ListBox1.Items.Strings[4] then     // если последняя буква одинакова с первой то отправляем "ОК"
for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
ServerSocket1.Socket.Connections[i].SendText('OK '+ ' next '+'"'+ b +'"');   // ServerSocket1.Socket.Connections[i].SendText('OK');
 if b<>c then
 for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
   ServerSocket1.Socket.Connections[i].SendText('FAIL');
 For I:=0 to ServerSocket1.Socket.ActiveConnections-2 do begin
 if ServerSocket1.Socket.Connections[i].SocketHandle<>Socket.SocketHandle then
  ServerSocket1.Socket.Connections[i].SendText(S);
 end;
end;

Все циклы котрые писали выше впихнуть не удалось, или ошибка или работает один раз. Подскажите пожалуйста где неправильно ?

Автор: amsoft 21.11.2009, 14:14
мне не понятна структура твоего списка
у тебя список имеет такой вид:

0: название города1
1: последняя буква
2: первая буква
3: название города2
4: последняя буква
5: первая буква

теперь ты сравниваешь строку 2 со строкой 4 (т.е. первую букву в названии города1 с последней буквой в названии города2)  smile 
По-моему последняя буква в названии города1 должна совпадать с первой буквой в названии города2

Поменяй список на такой вид:

0: название города1
1: первая буква
2: последняя буква
3: название города2
4: первая буква
5: последняя буква

теперь можешь сравнивать строку 2 со строкой 4, 5 с 7, 8 с 10 с помощью следующего кода

Код

X := ListBox1.Items.Count div 3;
if X > 1
then if ListBox1.Items.Strings[(X-2)*3+2] = ListBox1.Items.Strings[(X-2)*3+4]
         then begin                                                                                                                                                                  
                 //делаешь что тебе надо при совпадении (слово правильное)
                 end
         else begin                                                                                                                                                                  
                 //делаешь что тебе надо если нет совпадения (слово неправильное)
                 end;


в этом коде всегда проверяются только последние строки в списке (по-моему тебе это и надо)

Автор: alf138 21.11.2009, 17:24
Спасибо большое, просто огромное. Неделю бился, и ваше пытался передлать. Эххх хотел плюсик нажать а не активно. Если вам будет не трудно может подскажите как сохранить букву если следующее слово не на ту букву, массив придется придумывать ? Т.е. написал город а следующий город не на ту букву, что бы сохранялась буква слова которое правильно написанно.

Автор: alf138 21.11.2009, 20:03
Всем спасибо огромное все сделал. Теперь все номалек просто дописал 
Код

else begin
for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
  ServerSocket1.Socket.Connections[i].SendText('FAIL');
    ListBox1.Items.Strings[(X-2)*3+5]:= ListBox1.Items.Strings[(X-2)*3+2];

Во останется вопрос с регистром вот не знаю, делать его или нет если да то как...
Но все равно всем большое спасибо, особено "amsoft".

Автор: amsoft 21.11.2009, 20:25
насчет регистра:

AnsiUpperCase - перевод текста в верхний регистр
AnsiLowerCase - перевод текста в нижний регистр

PS

Цитата(alf138 @  21.11.2009,  20:03 Найти цитируемый пост)
Но все равно всем большое спасибо, особено "amsoft"


Не за что  smile 

Автор: kami 21.11.2009, 22:11
Цитата(alf138 @  21.11.2009,  11:27 Найти цитируемый пост)
 S:=IntToStr(Socket.SocketHandle)+'>'+Socket.ReceiveText;

Код действителен до момента, когда начнет действовать алгоритм Нагла, ибо разбиение и склейку пакетов никто не отменял.

Автор: alf138 26.11.2009, 04:21
Опять вас побеспокою, вопрос такой. Нужно сделать два цикла первый который будет проходить по алфавиту от "а до я" а второй будет считать кол-во каждый символов. Задание звучит так Подсчитать частоту появления каждого символа в поллученном сообщение.  На сколько  понимаю нужно сделать два массива первый для букв, второй для кол-во раз их повления. Но остается вопрос а как выводить все это ?

Автор: amsoft 26.11.2009, 15:40
alf138, по-хорошему надо было начать новую тему

А теперь о главном:
Каждому символу соответствует свой код, поэтому можно обойтись и с одним массивом, в ячейки которого будем записывать кол-во вхожений определенной буквы, а индекс записываемой ячейки будем определять по коду буквы.
Резултат можно вывести в компоненте TListBox, который я использую в примере:

Код

procedure CharCount(S: string);
var
MyArray: array [0..31] of integer;
X,Y: integer;
begin
for X := 1 to Length(MyArray) do
    MyArray[X-1] := 0;
for X := 1 to Length(S) do
    begin
    Y := Ord(S[X]);
    if Y in [192..223] then MyArray[Y-192] := MyArray[Y-192] + 1;
    if Y in [224..255] then MyArray[Y-224] := MyArray[Y-224] + 1;
    end;
ListBox1.Clear;
for X := 1 to Length(MyArray) do
    ListBox1.Items.Add('Буква ' + Char((X-1) + 192) + ' встречается в тексте ' + IntToStr(MyArray[X-1]) + ' раз');
end;


PS диапозон [192..223] - коды заглавных букв русского алфавита
     ,а диапозон [224..255] - коды прописных букв русского алфавита

Автор: alf138 27.11.2009, 20:49
Перекопал интернет на предмет подключение новой формы, нужно что бы при запуске программы выскакива окно настройки 
Код

procedure Button1Click(Sender: TObject);
begin
  ClientSocket1.Host := Edit1.Text;   // Присваиваем свойствам Host и Port нужные значения
  ClientSocket1.Port := StrToInt(Edit2.Text); //  Пытаемся открыть сокет и установить соединение
  ClientSocket1.Open;
end;

Если нужно создать новую тему подскажите куда. 
P.S. Вот думаю насчет корректности, но нужно чтобы при запуске выскакивало окно ip адреса и желательно порта подключения. Насчет алфавита 
Код

ListBox1.Clear;
  for X := 1 to Length(MyArray) do
  for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
 ServerSocket1.Socket.Connections[i].SendText('Áóêâà ' + Char((X-1) + 192) + ' âñòðå÷àåòñÿ â òåêñòå ' + IntToStr(MyArray[X-1]) + ' ðàç');
 end;

Но по приходу на клиента получается все в строчку, думаю как разделить на столбики.

Автор: alf138 28.11.2009, 20:48
Все прихотдящие сообщения пишет в одну строчку, как разделить на строчки ? 
Код
or X := 1 to Length(MyArray) do
  for i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
 ServerSocket1.Socket.Connections[i].SendText('Буква ' + Char((X-1) + 192) + ' встречается в тексте ' + IntToStr(MyArray[X-1]) + 'раз.');

Думал дописать в конце строчки запятую и разделять по строчно но как то замудренно получается 
Код

procedure TForm1.Button1Click(Sender: TObject);
const DelSym = ' .,!?';
var Text,Word: string; i: integer;
begin
  Text:=Memo1.Lines.Text;
  for i := 1 to Length(Text) do
    if Pos(Text[i],DelSym) > 0 then
      Text[i]:=',';
 
  if Text[1] = ',' then
    Delete(Text,1,1);
  while Pos(',,',Text) > 0 do
    Delete(Text,Pos(',,',Text),1);
    
  repeat
    Word:=Copy(Text,1,Pos(',',Text)-1);
    Delete(Text,1,Length(Word)+1);
    ListBox1.Items.Add(Word);
  until Length(Text) = 0;
end;

Автор: Демо 28.11.2009, 21:34
Цитата(alf138 @  28.11.2009,  20:48 Найти цитируемый пост)
Думал дописать в конце строчки запятую и разделять по строчно но как то замудренно получается 


Используй стандартный разделитель - #13#10.
Либо TListBox.Items.Delimiter и TListBox.Items.DelimitedText

Автор: alf138 29.11.2009, 09:13
Не хочет не пойму что не так делаю 
Код

S:=Socket.ReceiveText;
ListBox1.Items.Delimited='|';
ListBox1.Items.DelimitedText(S);

Автор: Демо 29.11.2009, 15:26
Цитата(alf138 @  29.11.2009,  09:13 Найти цитируемый пост)
Не хочет не пойму что не так делаю


В отладчике смотрел? Точно приходит нужная строка с разделителем?

Автор: alf138 29.11.2009, 16:16
У меня на клиента уходит такая строка 
Код

ServerSocket1.Socket.Connections[i].SendText('Буква ' + Char((X-1) + 192) + ' встречается в тексте ' + IntToStr(MyArray[X-1]) + 'раз.|') 

Т.е приходит "Буква А встречается в тексте 2 раза|", и так все буквы от "а до я" но не делится. 
И вообще пишет 
"Undeclared indentifier "Delimited""

Автор: kami 29.11.2009, 21:22
Цитата(alf138 @  29.11.2009,  16:16 Найти цитируемый пост)
приходит "Буква А встречается в тексте 2 раза|", и так все буквы от "а до я" но не делится. 

Это хорошо, что не разбивается. А то может и приходить сперва "Буква А встре" и потом "чается в тексте 2 раза". Это только к примеру.
Разбиение и склейку пакетов (повторюсь) в TCP никто не отменял.
Посему - нужно над TCP надстраивать свой протокол обмена, к примеру - первые 4 байта - длина сообщения, дальше - само сообщение. И на приемной стороне накапливать принятую информацию в буфер, а потом анализировать ее на предмет полностью пришедшего сообщения.

Автор: amsoft 29.11.2009, 21:47
alf138, 
на мой взгляд проще передовать не готовый текст "буква ... встречается ... раз",
а передовать только данный о кол-ве вхождений каждой буквы, и затем уже на конечном компе разбирать
полученную строку.

Можно сделать так:

1. Заполняешь массив MyArray (как писал выше)
2. Преобразовываешь его в строку:

Код

var
X: integer;
S: string;
...
S := '';
For X := 1 to Length(MyArray) do S := S + IntToStr(MyArray[X-1]) + Chr(9);


PS Chr(9) - знак табуляции, мы его используем для разделения значений в строке

3. Отправляешь полученную строку

При приеме данной строки на другом компе разбираешь ее:

4. Пишем небольшую функцию:

Код

function GetRecordItem(RecordString: string; PosNum: integer; Divider: string): string;
var
X,Y: integer;
S: string;
begin
S := '';
for Y := 1 to PosNum do
    begin
    X := Pos(Divider,RecordString);
    if X = 0
    then begin
         S := RecordString;
         RecordString := '';
         end
    else begin
         S := Copy(RecordString,1,X-1);
         Delete(RecordString,1,(X-1) + Length(Divider));
         end;
    end;
Result := S;
end;


PS Данная функция позволяет искать подстроку №PosNum, в строке RecordString (подстроки разделяются разделителем Divider)

5. Заполняем ListBox:

Код

var
X: integer;
S: string;
...
ListBox1.Clear;
S := ... //присваиваешь переменной значение, получаемое с удаленного компа (строка, которую мы передали)
X := 1;
while GetRecordItem(S,X,Chr(9)) <> '' do
         begin
         ListBox1.Items.Add('Буква ' + Char((X-1) + 192) + ' встречается в тексте ' + GetRecordItem(S,X,Chr(9)) + ' раз');
         Inc(X);
         end;



Автор: alf138 30.11.2009, 08:01
Вот что у меня получилось, компиляция проходит но при отправке пишет List index out of bounds(9).

procedure CharCount(S: string);
var
MyArray: array [0..31] of integer;
X,Y: integer;
begin
for X := 1 to Length(MyArray) do
    MyArray[X-1] := 0;
for X := 1 to Length(S) do
    begin
    Y := Ord(S[X]);
    if Y in [192..223] then MyArray[Y-192] := MyArray[Y-192] + 1;
    if Y in [224..255] then MyArray[Y-224] := MyArray[Y-224] + 1;
    end;
ListBox1.Clear;
S:='';
for X:=1 to Length(MyArray) do
S:= S+ intToStr(MyArray[X-1] )+ Chr(9);
ServerSocket1.Socket.Connections[i].SendText(S);
Извените что не в коде, пишу с телефона.

Автор: amsoft 30.11.2009, 09:51
Уверен, что ошибка именно в этом куске кода?
Приведи полный текст кода, выполняемый при отправке

PS Убери строку ListBox1.Clear - данный компонент нужен при разборе строки на стороне клиента


Цитата(alf138 @  27.11.2009,  23:49 Найти цитируемый пост)
Если нужно создать новую тему подскажите куда. 

На будущее - внизу есть кнопка для создания новой темы

Автор: alf138 30.11.2009, 11:27
Пдозреваю что всетаки ошибка на стороне сервера потому что запускал клиента, и отправлял сообщения на сервер мой"города" и мне приходит на клиента Буква А встречается т раз. На клиенте написанно
сама процедура и вывод
S:=Socket.ReceiveText;
X:=1
while GetRecordItem(S,X,Chr(9)) <>do
begin
ListBox1.Item.Add(Все что писал добавлять);
Inc(x);
end;
Все компиляцию проходит. Но выводит ошибку...
Подскажи что сделал не так ?

Автор: amsoft 30.11.2009, 14:01
Приведи полный текст кода, выполняемый при отправке

Автор: alf138 30.11.2009, 20:46
Извените, все получилось. Ошибку допустил. Большое спасибо "amsoft". Во второй раз помогаешь, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)