![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Код:
var
mark,endofupr:boolean;
i,x,l,m,n1:integer;
mas: array of integer;
begin
i:=0;
SetLength(mas, Listbox1.Items.Count); //установил длину массива
for i:=0 to Listbox1.Items.Count do
mas[i]:=999; //забил весь массив такими элементами, они точно не встретятся, а их будет нужно сравнивать
mark:=true;
while mark=true do
begin
mark:=false;
k:=Random(Listbox1.Items.Count);
for i:=0 to length(mas)-1 do
if k=mas[i] then mark:=true;
end;
mas[j]:=k;
j:=j+1;
if j=Listbox1.Items.Count then showmessage('end of ist');
end;
upr:= ListBox1.Items[k];
endзначит так. в этом коде, у меня есть несколько строк в листбоксе, я вывожу их в строку поочередно, в случайном порядке, но так, чтоб они не повторялись между собой. мучаюсь целый день, понапереставлял уже все, что только можно, а оно ни в какую. почему-то не записываются значения в массив. я его сначала забил 999, как вы можете заметить, потому что они точно не встретятся в моей программе ( в отличие от стандартного нуля). и после выполнения алгоритма, вывожу этот массив,для проверки, а там все те же девятки, хотя должжны быть разные номера элементов листбокса. переменным j,k я задал ноль в теле самого юнита, они у меня глобальные всем спасибо за внимание |
|
#2
|
||||
|
||||
|
end в конце лишний.
|
|
#3
|
||||
|
||||
|
Строку
Код:
upr:= ListBox1.Items[k]; |
|
#4
|
|||
|
|||
|
Цитата:
Можно проще и "железобетонней" с помощью промежуточного списка строк. Сначала копируешь все в промежуточный список, потом, пока в нем хоть один элемент есть, выбираешь случайный, добавляешь в строку и удаляешь из пром. списка: Код:
function GetRandomStrings(ListBox : TListBox) : String;
var
Idx : Integer;
Buf : TStringList;
begin
Randomize; // Init random
Result := '';
Buf := TStringList.Create;
Try
Buf.Assign(ListBox.Items);
While Buf.Count > 1 Do
Begin
Idx := Random(Buf.Count); // Get random number 0..Count-1
Result := Result + Buf[Idx] + ' '; // Add this item to the result
Buf.Delete(Idx); // Remove "used" item
End;
Result := Result := Buf[0]; // Last one
Finally
Buf.Free;
End;
end; |
|
#5
|
|||
|
|||
|
Код:
procedure TForm1.Timer1Timer(Sender: TObject); //действие по таймеру
var
mark,endofupr:boolean;
i,x,l,m,n1:integer;
mas: array of integer;
begin
i:=0;
SetLength(mas, Listbox1.Items.Count);
for i:=0 to Listbox1.Items.Count do
mas[i]:=999; //забил весь массив такими элементами, они точно не встретятся, а их будет нужно сравнивать
endofupr:=true;
mark:=true;
Timer1.enabled := false; //выключаем таймер
if checkbox1.Checked=true then //если выводить рандомно
begin
Randomize;
k:=Random(Listbox1.Items.Count);//выбираем число между количеством строк
if checkbox2.Checked = true then //если без повторений
begin
if j>0 then //первый случай мы уже учли внизу
while mark=true do
begin
mark:=false;
k:=Random(Listbox1.Items.Count);
for i:=0 to length(mas)-1 do
if k=mas[i] then mark:=true;
end;
mas[j]:=k;
j:=j+1;
if j=Listbox1.Items.Count then
begin
showmessage('last exercise for today');
endofupr:=false;
end;
end;
edit3.Text:=edit3.Text+'['+inttostr(mas[j])+']'; //это всякая фигня для проверки.
//и вот эти мас[i] почему-то по выводу равны [999], хотя им нужно присвоить номера строк. почему не присваиваются -не понимаю
edit3.Text:=edit3.Text+inttostr(k);
//edit3.Text:=edit3.Text+'('+inttostr(j)+')';
upr:= ListBox1.Items[k];
end
else //если не рандомные и тдТак, я, пожалуй, ошибся, вывесив только часть кода. так, думаю, будет проще понять что и как. а то тут вы говорите про лишние энды, и мало ли где я еще напутал при редактироваании. а это ж к делу не относится. собственно выводом по таймеру управляют два чекбокса: один из них отевчает за случайный вывод. а второй за вывод с/без повторениями. как уже говорил, у меня проблема с рандомом без повторений. сейчас попробую сделать массив не чисел с номерами строк, а просто со строками, и выводить напрямую из него. ну, мало ли. и да, я не понял почему upr:=... перенести вверх если вы о том, что это присваивание и вывод должны быть в цикле, то нет. это единичное действие по таймеру, а этиот таймер будет включаться не раз, так что вот как раз в каждое включение нужно вывести один, не повторяющийся, элемент то есть конкретно в этой процедуре выводится одна строка, просто она(процедура) выполняется несколько раз.ну и эти строки, повторяюсь, не должны, гхм, пардон за такое построение предложения, повторяться. Последний раз редактировалось vazer, 15.07.2013 в 19:56. |
|
#6
|
|||
|
|||
|
так, в общем, вопрос решил, может не очень красиво, конечно.
но спасибо lmikle за идею, действительно сделал со списком. Код:
if checkbox1.Checked=true then //если рандомные
begin
Randomize;
if checkbox2.Checked = true then //если без повторений
begin
if l>1 then //
begin
indx:=random(l);
upr:=mas[indx];
for i:=indx to l do
mas[i]:=mas[i+1];
l:=l-1;
end
else
begin
showmessage('last exercise for today');
upr:=mas[l-1];
endofupr:=false;
end;вот шматок кода, если кому интересно. теперь задам еще несколько вопросов, с вашего позволения. 1)решил прописать программу в автозагрузку, воспользовавшись вот этим вот. хотел спросить: arunonce если тру, то добавляет в автозагрузку только раз, потом я могу отключить и все. а если фолс, то включается постоянно, даже если галочку убрать, я правильно понимаю? Код:
procedure SetAutorun(aProgTitle,aCmdLine: string; aRunOnce: boolean );
var
hKey: string;
hReg: TRegIniFile;
begin
if aRunOnce then hKey := 'Once'
else
hKey := '';
hReg := TRegIniFile.Create( '' );
hReg.RootKey := HKEY_LOCAL_MACHINE;
hReg.WriteString('Software\Microsoft\Windows\CurrentVersion\Run'
+ hKey + #0,
aProgTitle,
aCmdLine );
hReg.destroy;
end;хотя вообще не понимаю, как это связано. 2)меня в автозагрузке висят несколько старых названий этой программы(я их менял в процессе создания), без галочек уже, конечно, и с несуществующими реальными адресами. их можно оттуда убрать? а то напрягает немного,и вдруг это как-то мешает, и поэтому не работает автозагрузка по-новой. при чем если с одной из программ совпадает и имя и расположение, а получается, что одна с галочкой, а вторая(старая), без. 3)ну и вопрос с автоматическим включением программы нужно решать: может кто знает другой путь для добавления туда? Последний раз редактировалось lmikle, 16.07.2013 в 05:07. |
|
#8
|
|||
|
|||
|
спасибо,поставил для пользователя.
кстати, если arunoce=false то вроде пока не наблюдаю никаких черных экранов. но надо бы, конечно, еще потестировать. а вопрос об удалении из списка автозагрузки программ, уже от автозагрузки отключенных, остается открытым |
|
#9
|
||||
|
||||
|
regedit.exe не помогает? Посмотрите в поисковике, сейчас существует куева хуча чистильщиков "мёртвых" веток в реестре. Ну или самый эффективный и радикальный вариант - переустановка
![]() |