Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в ListBox записать в определеную строчку? как перозаписать строку в ListBox 
:(
    Опции темы
Homer12
Дата 3.1.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 3.1.2007

Репутация: нет
Всего: нет



Проблема мне надо записать текст в определеную строчку ListBox например в 0 строку 
вот код берет текст 
Edit1.text:=ListBox1.Items[0];
а вторая проблема я не могу проверить есть одинаковый текст в ListBox
например:
я вожу два раза одно и тоже слово и он должен выдать что такоу слово есть в списки 
Зарание блогодарен. smile 
PM MAIL   Вверх
anwe
Дата 3.1.2007, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



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

занесет в edit строчку из листа. Надо наоборот:
Код
ListBox1.Items[0]:=Edit1.text
Ну а второе - обычное сравнение строк.
PM MAIL   Вверх
Sunvas
Дата 4.1.2007, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89





--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
alf138
Дата 15.11.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



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');  



Это сообщение отредактировал(а) alf138 - 15.11.2009, 13:01
PM MAIL   Вверх
Данкинг
Дата 15.11.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



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



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
alf138
Дата 15.11.2009, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Большое спасибо. Осталось придумать алгоритм проверки.

Это сообщение отредактировал(а) alf138 - 15.11.2009, 13:22
PM MAIL   Вверх
Данкинг
Дата 15.11.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



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


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
alf138
Дата 15.11.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



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

1 строчка = само название города
2 строчка =  последний эллемент в этом слове
3 строчка = первый эллемент.
 
Теперь мне на сервере нужно придумать цикл чтобы при ошибки он еще и отправлял сообщение клиент о неправильном слове .
PM MAIL   Вверх
Данкинг
Дата 15.11.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



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

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


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
alf138
Дата 15.11.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Спасибо огромное, получилось. Теперь алгоритм остался 
Код
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


Это сообщение отредактировал(а) alf138 - 15.11.2009, 15:24
PM MAIL   Вверх
amsoft
Дата 15.11.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



чтобы пробежаться по всему списку, можно сделать так

Код

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
     

Это сообщение отредактировал(а) amsoft - 15.11.2009, 16:45
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
alf138
Дата 15.11.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Не работает, первый раз отрабатывает потом затухает. 
Код

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

Притом первый раз отрабатывает не отправляя сообщения а потмо на все шлет безразлично какие буквы  первая или последняя.
PM MAIL   Вверх
amsoft
Дата 15.11.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



все работает
у тебя же должны быть равны строки с индексами 2 и 4, 5 и 7
а в твоем примере строка с индексом 2 равна а, 4 строка - х, 5 - а, 7 - л
поэтому и не работает
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
alf138
Дата 21.11.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Мучил неделю не чего сдвинуть не могу все как было так и осталось 
Код

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;

Все циклы котрые писали выше впихнуть не удалось, или ошибка или работает один раз. Подскажите пожалуйста где неправильно ?
PM MAIL   Вверх
amsoft
Дата 21.11.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



мне не понятна структура твоего списка
у тебя список имеет такой вид:

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;


в этом коде всегда проверяются только последние строки в списке (по-моему тебе это и надо)
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
alf138
Дата 21.11.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Спасибо большое, просто огромное. Неделю бился, и ваше пытался передлать. Эххх хотел плюсик нажать а не активно. Если вам будет не трудно может подскажите как сохранить букву если следующее слово не на ту букву, массив придется придумывать ? Т.е. написал город а следующий город не на ту букву, что бы сохранялась буква слова которое правильно написанно.
PM MAIL   Вверх
alf138
Дата 21.11.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Всем спасибо огромное все сделал. Теперь все номалек просто дописал 
Код

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".
PM MAIL   Вверх
amsoft
Дата 21.11.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



насчет регистра:

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

PS

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


Не за что  smile 


Это сообщение отредактировал(а) amsoft - 21.11.2009, 20:31
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
kami
Дата 21.11.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



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

Код действителен до момента, когда начнет действовать алгоритм Нагла, ибо разбиение и склейку пакетов никто не отменял.
PM MAIL WWW   Вверх
alf138
Дата 26.11.2009, 04:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) alf138 - 26.11.2009, 04:22
PM MAIL   Вверх
amsoft
Дата 26.11.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



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] - коды прописных букв русского алфавита
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
alf138
Дата 27.11.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



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

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 - 27.11.2009, 21:21
PM MAIL   Вверх
alf138
Дата 28.11.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Все прихотдящие сообщения пишет в одну строчку, как разделить на строчки ? 
Код
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;

PM MAIL   Вверх
Демо
Дата 28.11.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
alf138
Дата 29.11.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Не хочет не пойму что не так делаю 
Код

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


Это сообщение отредактировал(а) alf138 - 29.11.2009, 09:25
PM MAIL   Вверх
Демо
Дата 29.11.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
alf138
Дата 29.11.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



У меня на клиента уходит такая строка 
Код

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

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

Это сообщение отредактировал(а) alf138 - 29.11.2009, 16:17
PM MAIL   Вверх
kami
Дата 29.11.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



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

Это хорошо, что не разбивается. А то может и приходить сперва "Буква А встре" и потом "чается в тексте 2 раза". Это только к примеру.
Разбиение и склейку пакетов (повторюсь) в TCP никто не отменял.
Посему - нужно над TCP надстраивать свой протокол обмена, к примеру - первые 4 байта - длина сообщения, дальше - само сообщение. И на приемной стороне накапливать принятую информацию в буфер, а потом анализировать ее на предмет полностью пришедшего сообщения.
PM MAIL WWW   Вверх
amsoft
Дата 29.11.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



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;



--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
alf138
Дата 30.11.2009, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Вот что у меня получилось, компиляция проходит но при отправке пишет 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);
Извените что не в коде, пишу с телефона.
PM MAIL   Вверх
amsoft
Дата 30.11.2009, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



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

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


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

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

--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
alf138
Дата 30.11.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 3
Всего: 4



Приведи полный текст кода, выполняемый при отправке
--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
alf138
Дата 30.11.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Извените, все получилось. Ошибку допустил. Большое спасибо "amsoft". Во второй раз помогаешь, спасибо.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.