Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.17;
Скачать: [xml.tar.bz2];

Вниз

Помогите с алгоритмом пожалуйста   Найти похожие ветки 

 
158963   (2003-02-06 12:05) [0]

Уже второй день мучаюсь, никак не сделаю. Многие пользуются мирком или qchat. Там есть такая функция, если в поле где вводишь текст для отправления нажать кнопку вверх или вниз, то перелистывется история сообщений и это сообщение можно отправить повторно, но там кол-во сообщений хранящихся в памяти мало, только штку 50, потом они затираются друг другом.
Как реализовать такойже алгоритм? Я решил использовать listbox для хранения посланных строк и ограничить число сообщений в памяти 30. Спасибо.


 
Jeer   (2003-02-06 12:14) [1]

Сделай стек с использованием методов TListbox.Items
Insert, Delete.


 
158963   (2003-02-06 12:34) [2]

Да это все понятно, но оно как бы сказать не совсем рабоче:)))
Вот мой код:
при событии onkeypress на поле для ввода текса:
if key=#13 then begin
if (Trim(msg.text)) <> "" then begin
if listbox1.Items.Count <= 4 then begin
listbox1.Items.Add(msg.Text);
sn:=listbox1.Items.Count-1;
end
else begin
listbox1.Items.Delete(p);
listbox1.Items.Insert(p,msg.text);
sn:=p;
if p < 4 then
p:=p+1
else begin
ky:=1;
p:=0;
end;
end;
end;
вот при нажатии клавиши вверх:
if key=38 then begin
if sn <> -1 then begin
msg.Text:=listbox1.Items.Strings[sn];
if (sn = 4) and (ky=1) then
sn:=0
else
begin
if sn=0 then
sn:=4
else
sn:=sn-1;
end;
end;
end;
Пашет, но есть логическая ошибюка :( Я уже запутался


 
Palladin   (2003-02-06 12:41) [3]

var
msgs:TStringList; // сообщения
nMessageLimit:integer; // размер "стека"

procedure AddMessage(p_strMessage:string);
begin
if msgs.Count=nMessageLimit then msgs.delete(0);
msgs.add(p_strMessage);
end;


 
158963   (2003-02-06 13:03) [4]

А что это? Непонял.


 
Palladin   (2003-02-06 13:15) [5]

это принцип организации "стека" сообщений...
чего не понятного. всепросто как банан.
в твоем случае не вместо msgs
listbox1.Items


 
158963   (2003-02-06 13:22) [6]

Помоему этот код неверный. Он же будет удалять все время только 0 строку? А остальные оставит? И чем он отличался отт приведеного мной кода? Я что-то недоганаяю.


 
uw   (2003-02-06 13:35) [7]

>Palladin © (06.02.03 13:15)

У тебя queue или pipe. Если стек, то
msgs.delete(msgs.count - 1);



 
Palladin   (2003-02-06 13:41) [8]

> uw
да. согласен.
мне показалось, что человек именно это и хотел организовать.


 
158963   (2003-02-06 13:41) [9]

Все-равно он будет заменять только последнюю запись как я понял.
Мне надо просто при нажатии клавишы стрелка вверх, перелистывать сообщения назад, т.е. по порядку от последнего посланного к пердпослденему и т..д и так до 30 сообщений.


 
Palladin   (2003-02-06 13:48) [10]

тот алгоритм, что я привел будет удалять сообщение которое было послано 31 раз назад :)
ибо самые свежие сообщения добавляются в конец очереди...


 
158963   (2003-02-06 14:06) [11]

Все-равно не вижу смылса даннеого кода. Как добавлять и так понятно. Просто беру и добавляю, а елси уже кол-во строк равно максимуму, то просто заменяю.
Вот мой код, он делал тоже самое:
if listbox1.Items.Count <= 4 then begin
listbox1.Items.Add(msg.Text);
end
else begin
listbox1.Items.Delete(p);
listbox1.Items.Insert(p,msg.text);
end;
А как считать правильно? Мне нужно считать попорядку с самой последней записи и до первой, при этом нужно переходить правильно , если уже первый элемент был заменен.


 
Palladin   (2003-02-06 14:29) [12]

потому и запутался, что алгоритм у тебя запутаный

на событии onkeypress

CurrentMessageIdx - пусть будет текущяя позиция
Msg - строка

если enter
то
if CurrentMessageIdx=-1 then
begin
ListBox1.Items.Delete(0);
ListBox1.Items.Add(Msg);
end else ListBox1.Items[CurrentMessageIdx]:=Msg;


если вниз то

if CurrentMessageIdx<>-1 then
begin
CurrentMessageIdx:=CurrentMessageIdx+1;
if CurrentMessageIdx=ListBox1.Items.Count then CurrentMessageIdx:=-1;
end;


если вверх то

case CurrentMessageIdx of
-1: CurrentMessageIdx:=ListBox1.Items.Count-1;
0: else CurrentMessageIdx:=CurrentMessageIdx-1;
end; //case


попробуй


 
158963   (2003-02-06 16:13) [13]

Опять не то, Вы немного не поняли. Ведь таким образом он будет заменять все время первую строку. А как сделать процесс, который будет от 0 до 29 это делать?
Вы в мирке или qchate или vypress chate общались? То что Вы приводите коды они вообще не то делают. А одно сообщение вывести проще простого, на событие нажатия енетер:
listbox1.items.add(msg.text)
на событие клавишы вверх:
msg.text:=listbox1.items.strings(listbox1.items.count)
Вот замена Вашему коду:))))
Вот этот код только надо изменить так, что при добавлении если уже 30 строк есть, то НЕ СТИРАЯ _ВСЕХ_строк, по очереди заментяь их на новые, при этом и менять начало прокрутки истории.
Спасибо.


 
Palladin   (2003-02-06 16:37) [14]

я щаз матерится начну...
я же еще выше тебе привел алгоритм добавления новых сообщений затирая совсем старые!!!!

а то что ниже привел это интерепритация того алгоритма что организовал ты!

жую более тщательно на основе того что привел еще раньше!!
ты отправляешь сообщение msg
оно добавляется в историю сообщений msgs (Msgs.Add(msg)) в самый его конец... если в результате этого, количество сообщений в истории стало больше чем лимит который ты определил, то ты просто напросто удаляешь самое старое сообщение которое было послано... то есть сообщение под индексом 0 в списке msgs.
if msgs.Count=nMessageLimit then msgs.delete(0);

что же тут непонятного, о боги!!?????


 
Palladin   (2003-02-06 16:40) [15]

а если не нравится очередь то второй путь от (06.02.03 14:29)
именно заменяет то сообщение на которое ты перешел, тем сообщением что ты послал...
ListBox1.Items[CurrentMessageIdx]:=Msg;


 
158963   (2003-02-06 16:55) [16]

1) msgs.delete(0); - ага, это то я пониаю, этоя сделал давным давно, опрос в другом: КАК ДУЛАТЬ ВСЕ ПО ОЧЕРЕДЕИ а не ТОЛЬКО 0! Надо сперва 0, потом 1, 2 , 3 , 4.... 29, 0, 1, 2, 3....
а у вас: 0,1,2,3....29, 0, 0, 0, 0...
Ладно это я тоже сделал (см. мой код). Вопрос в том, КАК ВЫВОДИТЬ?! Я никак не могу высети, он все-время пишет что лист вне бонуса. я не знаю как вычеслить первый проход это или нет.


 
Palladin   (2003-02-06 17:01) [17]

когда делаешь msgs.delete(0) удаляется первая в списке строка,
строка с индексом 1 становится 0,
строка с индексом 2 становится 1,
строка с индексом 3 становится 2,
строка с индексом 4 становится 3,
строка с индексом 5 становится 4,
строка с индексом 6 становится 5,
строка с индексом 7 становится 6,
строка с индексом 8 становится 7,
строка с индексом 9 становится 8,
строка с индексом 10 становится 9,
строка с индексом 11 становится 10,
строка с индексом 12 становится 11,
строка с индексом 13 становится 12
и т.д. :)
и когда ты в следующий раз сделаешь delete(0) удалится строка которая до предыдущего delete была с индексом 1...

следовало бы понимать данный механизим...


 
158963   (2003-02-06 17:48) [18]

Старнно, но если делать так:
if CurrentMessageIdx=-1 then
begin
ListBox1.Items.Delete(0);
ListBox1.Items.Add(Msg.Text);
end else ListBox1.Items[CurrentMessageIdx]:=Msg.Text;
то первый элемент все время будет заменять на новый и все. А какое значение при создании формы должно иметь переменная CurrentMessageIdx ?


 
Palladin   (2003-02-06 18:02) [19]

все правильно... это замена новым сообщением того сообщения к которому ты перешел нажимая на стрелки...
ведь ты этот же механизм организовал в своем алгоритме...
единственное я забыл условие добавить,
теперь с коментариями

if CurrentMessageIdx=-1 then // если не стоим ни на каком предыдущем сообщении
begin
if ListBox1.Items.Count=nCountLimit then // если мы превысили лимит
ListBox1.Items.Delete(0); // то удаляем самое старое сообщение
ListBox1.Items.Add(Msg); // добавляем новое
end else ListBox1.Items[CurrentMessageIdx]:=Msg; // если все таки на каком то сообщении стоим, то заменяем его на новое

CurrentMessageIdx - это номер сообщения в истории
если он стоит на конце списка сообщений и мы нажали кнопку вниз, то он становится равным -1, то есть это означает что если мы сейчас введем сообщение оно добавится в список, и при переполненом списке удалит сообщение 0


> у вас: 0,1,2,3....29, 0, 0, 0, 0...

у меня удаляется 0 сообщение и сразу же в конец добавляется новое...
такчто ничего подобного по поводу кучи нулей...


 
158963   (2003-02-06 18:18) [20]

Помоему вы меня не понимаете или я не допонимаю что-то.
Вот берем и втыкаем грубо говоря этот код на нажатие ентера на едите:
if CurrentMessageIdx=-1 then // если не стоим ни на каком предыдущем сообщении
begin
if ListBox1.Items.Count=nCountLimit then // если мы превысили лимит
ListBox1.Items.Delete(0); // то удаляем самое старое сообщение
ListBox1.Items.Add(Msg); // добавляем новое
end else ListBox1.Items[CurrentMessageIdx]:=Msg; // если все таки на каком то сообщении стоим, то заменяем его на новое

Запускаем прогу, пишем текст, жмем ентер, он добавляет первую строку
Потом пишем еще раз текст, он заменяет первую строку на новую.


 
Palladin   (2003-02-06 22:45) [21]

после того когда ты написал строку и ввел ее
CurrentMsgIdx стал 0 и поэтому заменяется все время первая строка, согласен недочет с моей стороны
после

if CurrentMessageIdx=-1 then
begin
if ListBox1.Items.Count=nCountLimit then ListBox1.Items.Delete(0);
ListBox1.Items.Add(Msg); // добавляем новое
end else ListBox1.Items[CurrentMessageIdx]:=Msg;

нужно добавить
CurrentMessageIdx:=-1;


 
158963   (2003-02-07 16:18) [22]

Спасибо большое. Работает.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.02.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.013 c
14-53180
pochtamt
2003-02-01 08:21
2003.02.17
Где можно скачать лекции/книги и т.п. по разработке баз данных?


1-52985
Devel
2003-02-10 13:55
2003.02.17
PGP


1-52968
anbezr
2003-02-06 12:51
2003.02.17
Можно ли получить доступ к скрытому полю объекта


1-52971
denis24
2003-02-10 09:53
2003.02.17
строки в tmemo разного цвета


14-53258
blackman
2003-02-01 21:56
2003.02.17
Не прогой единой жив человек !





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский