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


Автор: Andreyzpr 2.6.2007, 15:42
Введу в курс дела:
Я пишу чат.
Список пользователей у меня выводиться в TreeView.
Когда кто либо в чате начинает печатать текст, то возле его иконки в чате появляеться красная полосочка
Все это делаеться таким путем:
Когда ктото начинает печатать, его клиент посылает другим в чате команду, а те клиенты, которые получили, просто меняют иконку на другую - такую же как прежнюю только с красной полосочкой.
Когда юзер перестает печатать, то клиент посылает команду об окончании набора текста, и остальные клиенты возвращают прежнюю иконку, естествено уже без той черточки.
А проблема у меня такая
Где то я сделал ошибку в коде, что раз на раз посылаеться команда о начале набора текста
Вот код, касающиеся набора текста:

Код

procedure TForm1.TextMemoChange(Sender: TObject);
begin
PrintText;
end;

procedure TForm1.PrintText;
begin
ResetTimer.Enabled:=false;
if PrintIndex = 1 then
  begin
    ResetTimer.Enabled:=true;
  end else
    begin
     SendCommand('PrintYes', '*', '*', '');  //посылаем комадну о начале
     PrintIndex:=1;
     ResetTimer.Enabled:=true;
    end;
end;

procedure TForm1.ResetTimerTimer(Sender: TObject);
begin
SendCommand('PrintNo', '*', '*', '');  //Посылаем команду о завершении набора
PrintIndex:=0;
ResetTimer.Enabled:=false;
end;
 
//------------
//Обработка в сокете OnRead - читаем команды
if (command = 'PrintYes') then
  begin
    for i:=1 to UserList.Items.Count do
      begin
        name:=UserList.Items.Item[i-1].Text;
        if (Name = AuthorName) then
          begin
            UserList.Items.Item[i-1].ImageIndex:=UserList.Items[i-1].ImageIndex + 12;
            UserList.Items.Item[i-1].SelectedIndex:=UserList.Items[i-1].SelectedIndex + 12;
          end;
      end;
  end;
if (command = 'PrintNo') then
  begin
    for i:=1 to UserList.Items.Count do
      begin
        name:=UserList.Items.Item[i-1].Text;
        if (Name = AuthorName) then
          begin
            UserList.Items.Item[i-1].ImageIndex:=UserList.Items[i-1].ImageIndex - 12;
            UserList.Items.Item[i-1].SelectedIndex:=UserList.Items[i-1].SelectedIndex - 12;
          end;
      end;
  end;

Гляньте ктото свежим глазом в чем ошибка, из за чего оно бывает протормаживает
Ато знаете как, ошибка явная а я не вижу!

Автор: Sunvas 2.6.2007, 17:38
Код

ResetTimer.Enabled:=false;    
if PrintIndex = 1 then    
  begin    
    ResetTimer.Enabled:=true;

Не нравится мне этот кусок кода. ИМХО коряво как-то. 
Таймер у тебя на сколько заряжен?

Автор: Andreyzpr 2.6.2007, 17:50
Цитата(Sunvas @ 2.6.2007,  17:38)
Код

ResetTimer.Enabled:=false;    
if PrintIndex = 1 then    
  begin    
    ResetTimer.Enabled:=true;

Не нравится мне этот кусок кода. ИМХО коряво как-то. 
Таймер у тебя на сколько заряжен?

таймер заряжен на 1,5 секунлы
Этож получаеться у каждого разная скорость печати
Ктото в одну секунду вводит 5 букв - ктото одну
тут же выходит что пока ты печатаешь клиент не отправит команду об окончании набора текста

Автор: Sunvas 2.6.2007, 18:09
Ну вот тебе и ошибка. После прохода 1.5 секунды вызывается код:
Код

SendCommand('PrintNo', '*', '*', '');  //Посылаем команду о завершении набора    
PrintIndex:=0;    <-обрати внимание на эту строку!!
ResetTimer.Enabled:=false;

Потом, пока человек печатает, благодаря тому, что PrintIndex=0, вызывается этот код:
Код

     SendCommand('PrintYes', '*', '*', '');  //посылаем комадну о начале

Автор: Andreyzpr 2.6.2007, 18:21
Цитата(Sunvas @ 2.6.2007,  18:09)
Ну вот тебе и ошибка. После прохода 1.5 секунды вызывается код:
Код

SendCommand('PrintNo', '*', '*', '');  //Посылаем команду о завершении набора    
PrintIndex:=0;    <-обрати внимание на эту строку!!
ResetTimer.Enabled:=false;

Потом, пока человек печатает, благодаря тому, что PrintIndex=0, вызывается этот код:
Код

     SendCommand('PrintYes', '*', '*', '');  //посылаем комадну о начале

Чето я ниче не понял
Сматри для чего эта переменная:
Когда пользователь начинает печатать - а именно набрал первый символ - переменная стала равна 1
запускаеться таймер, который при срабатывании отправит команду о завершении набора текста.
Если Пользователь набирает второй символ, таймер, чтобы он не сработал - не отправил команду о завершении печати, отключаеться. Дальше идет проверка. Если эта переменная равна еденице - то уже не нужно отправлять команду о том что я набираю текст - она уже отправлена. После идет активация таймера - если пользователь закончит печатать через 1,5 секунды таймер подаст соответствующую команду.
Ввел пользователь третюю букву.
Смотрим - 
Деактивируем таймер - опять же, чтобы он не отправил команду о завершении набора текста! 
Дальше проверяем - если мы уже отправляли команду о начале набора - тогда молча запускаем обратно таймер.

Прошло 1,5 секунды, запущеный таймер сработал.
При срабатывании он переменную поставил в значение НОЛЬ, отправил команду о том что я закончил печатать.
Вдруг я решил еще точку поставить - короче говоря набрал исче один символ.
Смотрим код:
Если переменная равна нулю ТОГДА мы ОТПРАВЛЯЕМ команду о наборе текста и опять активируем таймер!
Тоесть этот код позволяет как можно меньше отправлять команд на сервер!
-----
Поэтому мы переменную ставим в ноль!
Я не литератор, могу не очь внятно объясниь, если чет непонятно спрашуй  smile 

Автор: Sunvas 2.6.2007, 18:29
Цитата

 что раз на раз посылаеться команда

Возможно я че-то не понял. Что означает "раз на раз"?

Автор: Andreyzpr 2.6.2007, 18:38
Цитата(Sunvas @ 2.6.2007,  18:29)
Цитата

 что раз на раз посылаеться команда

Возможно я че-то не понял. Что означает "раз на раз"?

Ну вот например
Запустил чат
Начинаешь печатать текст - а уведомления о наборе текста в чате нету.
Ждещь 1,5 секунды и продолжаешь печатать - появилось
Непонятно из за чего такой глюк - где я допустил ошибку!

Автор: Sunvas 2.6.2007, 19:23
По твоему алгоритму вроде бы все правильно. Но попробуй для начала определить что именно глючит: отправка текста или твой алгоритм. Выводи состояния печати текста куда-нить в лабел и смотри что происходит.

Автор: Andreyzpr 2.6.2007, 19:39
Цитата(Sunvas @ 2.6.2007,  19:23)
По твоему алгоритму вроде бы все правильно. Но попробуй для начала определить что именно глючит: отправка текста или твой алгоритм. Выводи состояния печати текста куда-нить в лабел и смотри что происходит.

В лабеле работает!
Значит проблема в изменении иконки, чтоли!!!!!
А что там та такого?

Автор: Sunvas 2.6.2007, 19:45
Цитата(Andreyzpr @  2.6.2007,  19:39 Найти цитируемый пост)
А что там та такого?

В 17й строке ошибка.  smile 

Автор: Andreyzpr 2.6.2007, 19:53
Цитата(Sunvas @ 2.6.2007,  19:45)
Цитата(Andreyzpr @  2.6.2007,  19:39 Найти цитируемый пост)
А что там та такого?

В 17й строке ошибка.  smile

17 строка - это end; ??????

Автор: Sunvas 2.6.2007, 20:07
Цитата(Andreyzpr @  2.6.2007,  19:53 Найти цитируемый пост)
17 строка - это end; ??????

http://forum.vingrad.ru/act-Help/CODE-01/HID-17.html 8е сверху.  smile 

Автор: Andreyzpr 2.6.2007, 20:18
Цитата(Sunvas @ 2.6.2007,  20:07)
Цитата(Andreyzpr @  2.6.2007,  19:53 Найти цитируемый пост)
17 строка - это end; ??????

http://forum.vingrad.ru/act-Help/CODE-01/HID-17.html 8е сверху.  smile

http://forum.vingrad.ru/forum/topic-154457/anchor-entry1153383/0.html
Первый пост - пример кода!

Автор: Sunvas 2.6.2007, 21:00
Andreyzpr, в первом куске лишь хорошо описан лишь код получения состояния печатает/не печатает.
А вот сама отправка сообщения, его получение и изменения иконки - очень урезаны.

Автор: Alexeis 2.6.2007, 21:27

M
Alexeis
Модератор: Название темы должно отражать ее суть!

Автор: Andreyzpr 4.6.2007, 14:13
А вот покажи пример, как можно было назвать эту тему?

Добавлено через 57 секунд
Суть темы такова: я допустил ошибку  в коде, хочу чтобы мне с этим помогли! Вот от сути и пошло название: Где промохнулся в коде!!!!!!!
Что еще не так!!!!!!!!

Автор: Alexeis 4.6.2007, 14:38
Andreyzpr, мы не в детском саду, чтобы кричать "помогите я не знаю что у меня случилось, но что-то не работает!  smile " 
  Нужно проводить анализ своих ошибок и по крайней мере локализовать причину ошибки, и если после этого не удалось найти причину, то только тогда спрашивать указывая на использованные методы или технологии которые, вероятно, неверно используются. Формулировать задачу нужно нормально, тогда и название получиться само собой.

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