![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Какой функцией "подождать" пока отработает код?
Верный вопрос © (2004-11-21 19:48:00)Какой функцией "подождать" пока отработает код перед тем как начнет выполняться следующий код?
Skyle (2004-11-22 12:21:00) [1]Поле заполниться еще не успело а фокус в листбоксе перешел уже на следующий элемент и
поле начало заполняться снова.
Положить таймер, который перезапускается каждый раз при изменении активного элемента листбокса. А в его обработчике уже сделать отключение таймера и показ текста в RichEdit. Интервал таймера - по желанию.
Верный вопрос (2004-11-22 09:34:00) [2]Базара нет, опИсался, говорю же прямо тут писал, стдесб правильно будет так
if BaseItems.count-1 < 50 then
u := BaseItems.count-1 else
u := 0;
for i := 0 to u do
begin
ListBox1.Items.add(BaseItems.Strings[i]);
end;
Германн (2004-11-22 04:40:00) [3]2 Верный вопрос (22.11.04 03:53) [25]
Увы, все еще не понятно. :(
В частности не понятно:
u := 0;
for i := u to 50 do
От i:=0 до i:=50 - 51 итерация. А у тебя есть их?
Верный вопрос (2004-11-22 03:53:00) [4]Спасибо Всем! Похоже получается!
>Германн © (22.11.04 03:17) [21]
...
Вот примерный кусок кода. может что не верно, писал тут по памяти в 05:52 по нашему.
if BaseItems.count-1 < 50 then
u := BaseItems.count-1 else
u := 0;
for i := u to 50 do
begin
ListBox1.Items.add(BaseItems.Strings[i]);
end;
Label2.Caption := inttostr(0);
Label3.Caption := inttostr(50);
......
if key = vk_down then
begin
if not (Label3.caption = inttostr(BaseItems.Count-1)) then
begin
ListBox1.Items.Delete(0); /// удаляем первую
///а так как строк стало 49, то последняя освободилась, ///значитListBox1.Items.Insert(50,BaseItems.Strings[strtoint(Label3.caption)+1]);
///Вставляем в пустую 50 строку элемент под номером
///strtoint(Label3.caption)+1 - что значит 51
Label3.caption := inttostr(strtoint(Label3.caption)+1);
Label2.caption := inttostr(strtoint(Label2.caption)+1);
//После этого прибавляем к обоим индексам по 1
end;
end;
Все еще непонятно?
GuAV (2004-11-22 03:33:00) [5]
procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
var Data: String);
begin
Data := Format('Элемент № %d', [Index]);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Style := lbVirtual;
ListBox1.Count := 10000;
end;
Этот список лёгко обрабатывает 10000 элементов. А Virtual Listview и миллион строк потянет (через ownerdata и OnData).
Юрий Зотов (2004-11-22 03:23:00) [6]> Верный вопрос (22.11.04 03:03) [19]
Задизаблите кнопку Down на время заполнения ричэдита, вот и все проблемы. Или, если это невозможно, то флажок введите.
Метод_заполнения_ричэдита (вариант 1).
begin
DownButton.Enabled := False;
try
... // Заполняем ричэдит
finally
DownButton.Enabled := True
end
end;
Метод_заполнения_ричэдита (вариант 2). // Flag - глоб. пер-ная.
begin
if not Flag then
begin
Flag := True;
try
... // Заполняем ричэдит
finally
Flag := False
end
end
end;
GuAV (2004-11-22 03:19:00) [7]Верный вопрос (21.11.04 20:15) [5]
ListBox очень-очень долго грузит все элементы навигации потому что их слишком много, поэтому приходится держато его в другом TStringListе. А для того чтобы он не тормозил я придумал такую фишку - при загрузке я помещаю в него только 50 прервых элементов списка.
Всё это неправильно !
Надо Style := lbVirtual и обрабатывать OnData
Посмотри в демках Virtual ListView.
Германн (2004-11-22 03:17:00) [8]2 Верный вопрос (22.11.04 03:07) [20]
То бишь сначала последняя строка списка имела индекс 49. Затем удалили нулевую строку и последняя строка заимела индекс 48. И после всего этого ты вставляешь строку с индексом не 50 а 51 ! :(((
Верный вопрос (2004-11-22 03:07:00) [9]>Германн © (22.11.04 03:01) [18]
ListBox1.Items.Insert(50,BaseItems.Strings[strtointLabel3.caption)
+ 1 ]); //Добавляем Item не 50 а 51
Верный вопрос (2004-11-22 03:03:00) [10]Piter © (22.11.04 01:59) [16]
>У тебя ЛОГИКА ПРИЛОЖЕНИЯ НЕПРАВИЛЬНАЯ. Это глупо - выводить 90 >ТЫСЯЧ строк куда бы то ни было.
90.000 строк на экран я не вывожу. Даже намека на это нигде не было. Я сказал что они содержатся в TStringListr а он как известно на экран не лезет.
>Представляю, если мне предложать выбрать из 90.000 строк нужную >мне. Я рехнусь.
Пользователю хотящему найти игру среди этого списка предстоит потрудится и всего навсего ввести хоть малюсенький кусок ее названия, хоть обрывок конца названия в строку поиска и опа, все названия из базы совпавшие с запрашиваемым текстом будут немедленно показаны в Листбоксе. А далее кликай по назвыанию и менее чем за треть секунды в поле "Описание" представленное Ричедитом появится текст относящийся к этой игре.
>Это даже с точки зрения интерфейса не юзабельно.
Интерфейс простой : окно разделено на две части - правую и левую. Левая более узкая чем правая потому что в ней находится листбокс с названиями игр и строка поиска. Правая сторона - ричедит в котором отображается текст по игре. Вот и весь интерфейс.
И вообще все в оффтоп ушло, блин, я кажется понял как объяснить :
Короче листбокс, в нем названия игр кликаю по любому его элементу , текст соответствующий выбраной игре появляется в поле описания. Жму кнопку Down, фокус переходит на нижестоящий элемент, начинается заполнение текстом поля описания. Поле заполниться еще не успело а фокус в листбоксе перешел уже на следующий элемент и
поле начало заполняться снова. После 20-30 таких переходов все виснет и появляется таблчка типа Стек переполнен. Как этого избежать? Вот.
Германн (2004-11-22 03:01:00) [11]2 Верный вопрос (21.11.04 20:15) [5]
Не вдавался в детали твоего алгоритма. Но возникли сомнения, когда ты сказал, "при загрузке я помещаю в него только 50 прервых элементов списка."
И при этом:
ListBox1.Items.Delete(0); //Уничтожаем Item 0
ListBox1.Items.Insert(50,BaseItems.Strings[strtointLabel3.caption)+1]); //Добавляем Item 50!...
то бишь - таки сколько строк у тебя 50 или 51?
Мирон (2004-11-22 02:16:00) [12]Piter © (22.11.04 1:38) [15]
В общем, копать в эту сторону, а не в ту область "как вывести 90.000 строк на экран сразу".
Гм... Так автор, вроде, и двигался в этом направлении. Хоть и через ж%@., но все-таки...
Piter (2004-11-22 01:59:00) [13]Верный вопрос (22.11.04 1:20) [14]
Ну как можно спокойно реагировать на такое?
а что такого? Я спросил зачем ты используешь TStringList. А потом еще спросил что за секции.
Данными вопросами я тебя оскорбил? :)
Ты пойми, тут тоже люди не глупые. И если ты объясняешь, а люди не понимают - вполне возможно, что ты коряво объясняешь.
Спасибо за внимание. Досвидания
пока, пока :)
Пойми простую вещь - ответ на вопрос нужен ТЕБЕ. Мне и многим другим параллельно обидешься ты или нет, уйдешь с этого сайта или нет.
Но я знаю одно - тебе обязательно помогут, если ты покажешь, что тебе действительно нужен ответ на вопрос и ты уже приложил столько усилий для решения проблемы, сколько смог.
О моих способностях вы ничего не знаете, а соответственно и судить не можете
тут ты не прав. Ты же привел кусок кода. А по коду вполне даже можно судить об уровне программиста. Не точно, но приблизительно можно...
Piter (2004-11-22 01:38:00) [14]Верный вопрос (22.11.04 0:19) [11]
Загрузи в TListBox ок. 90.000 строк
я что, на идиота похож?
Вопросы не те задаешь. У тебя ЛОГИКА ПРИЛОЖЕНИЯ НЕПРАВИЛЬНАЯ. Это глупо - выводить 90 ТЫСЯЧ строк куда бы то ни было. И не стоит искать компонент, который может с этим справится. Это даже с точки зрения интерфейса не юзабельно. Представляю, если мне предложать выбрать из 90.000 строк нужную мне. Я рехнусь.
Делай поиск, используй что-то типа базы данных.
Как минимум нужно разделить все игры по алфавиту, что уже снизит хотя бы раз в 20 объем информации в каждом разделе. Плюс сделай многостраничное отображение информации, как делают поисковые машины, допустим, не более 100 записей на одной странице. В общем, копать в эту сторону, а не в ту область "как вывести 90.000 строк на экран сразу".
Верный вопрос (2004-11-22 01:20:00) [15]>Palladin © (22.11.04 00:50) [13]
>Твои способности не стоят показываемой амбиции.
О моих способностях вы ничего не знаете, а соответственно и судить не можете. Амбиции я никакой не показывал в отличии от ответов некого Piter ©. Я на вашем сайте нвсего около года, но Piter мне запомнился тем что он постоянно отвечает подобным образом - высокомерно и неуважительно. Заметьте : пост [5] объясняет что такое это "секции" а пост [6] их еще и схематически показывает. И почему использовать Листбокс не удобно там тоже объяснено.
Piter © (21.11.04 21:42) [8]
Верный вопрос (21.11.04 20:15) [5]
у меня только один вопрос. Нафига использовать TStringList? Почему бы не хранить информацию в TListBox?
Хотя еще интересно что за секции... чего то ты намудрил
Ну как можно спокойно реагировать на такое?
И вообще я на этом сайте заметил такое не только у Piter а у многих, очень многих тутошных обитателей. Если сказать нечего - лучше вообще ничего не говорить чем говорить не по делу и флудить, нет, начинают угарать над тем что человек в программировании соображает мало и задает на их взгляд тупые вопросы. А сами когда только учились программировать что не разу не задавали вопросы типа "А как скопировать из одного Мемо текст в другой Мемо"
Спасибо за внимание. Досвидания.
Palladin (2004-11-22 00:50:00) [16]
> [11] Верный вопрос (22.11.04 00:19)
Твои способности не стоят показываемой амбиции.
Eugene1501 (2004-11-22 00:40:00) [17]Мне кажется для таких задач лучше использовать базы данных.
Кроме того DrPass уже говорил:
>Что касается твоего вопроса - в однопоточном приложении не >бывает ситуации, когда один код выполняется до того, как >закончилась предыдущая команда. У тебя ошибка где-то в логике >приложения.
Верный вопрос (2004-11-22 00:19:00) [18]>Piter © (21.11.04 21:42) [8]
>у меня только один вопрос. Нафига использовать TStringList? Почему >бы не хранить информацию в TListBox?
1). Загрузи в TListBox ок. 90.000 строк.
2). Попытайся быстро по ним перемещаться, искать отсеивать и т.д.
3). Перегружай и обновляй элементы листбокса каждый раз, когда
происходит загрузка нового списка.
Сколько времени потребуется? Даже 1) не выполнишь. Вот для этого и СтрингЛист.
>Хотя еще интересно что за секции... чего то ты намудрил
Как ты можешь посоветовать мне хранить ок 90.000 описаний, прохождений и кодов от игр не разделяя их друг от друга в одном файле? Плюс к этому обеспечить быстрый доступ к любому из них в случае чтения, записи или перезаписи?
Поэтому приходится разделять их друг от друга метками, части между двумя метками я назвал "секциями" потому что не смог придумать название более популярно описывающее эти блоки информации.
Жду ответа.
KilkennyCat (2004-11-21 22:16:00) [19]так как есть
> ListBox1.Items.Count
спользование подобного:
> Label3.caption := inttostr(strtoint(Label3.caption)+1);
> Label2.caption := inttostr(strtoint(Label2.caption)+1);
некрасиво.
DrPass (2004-11-21 22:11:00) [20]
> ListBox очень-очень долго грузит все элементы навигации
> потому что их слишком много, поэтому приходится держато
> его в другом TStringListе
Перед тем, как грузить, вызови ListBox.Lines.BeginUpdate, после завершения - ListBox1.Lines.EndUpdate, будет намного быстрее
Что касается твоего вопроса - в однопоточном приложении не бывает ситуации, когда один код выполняется до того, как закончилась предыдущая команда. У тебя ошибка где-то в логике приложения.