Консультация № 28143
22.10.2005, 23:41
0.00 руб.
0 2 2
Приветствую всех. Такая маза, вот спотыкнулся и все. Дело вот в чем, имеется БД(с известным количеством записей) в гриде. Мне необходимо перемещаться по ней произвольным порядком но так что-бы не повторялся выбор. Если что, более подробнее напишу. Внизу код. Что-то код не прется. Подскажите как править или свой вариант. В общих чертах: сначала рандом в пределах 5(тестовое кол-во записей), считываются значения из темпового фала, если не ноль или ранее используемое, то продолжаем, выбираем запись и сохр. её значение в темп. И так по кругу. Клинит меня,....на фоне любви..:))) Давайте любые советы...двойки не ставлю.

Приложение:
procedure TForm1.Button1Click(Sender: TObject);Varn:integer; f:textfile; str:integer; i:integer;k:integer;Label 1;begin1:k:=5;n:=Random(5);AssignFile(f,‘temp.tmp‘);Reset(f);while not EOF(f) dobeginRead(f,str);if (n=str) or (n=0) then goto 1;CloseFile(f);end;Table1.Locate(‘Number‘,n,[loCaseInsensitive]);AssignFile(f,‘temp.tmp‘);Append(f);WriteLn(f,n);CloseFile(f);end;

Обсуждение

давно
Мастер-Эксперт
425
4118
23.10.2005, 08:55
общий
это ответ
Здравствуйте, CJ!
Вы лучше вторую таблицу для временных значений заведите, так быстрее будет искаться тем же Locate‘ом. Только не забывайте перед первым применением очищать ее.
Если таблица DBF, то можно сохранять номера записей. Тогда для хранения номеров можно просто завести переменную типа string и записывать в нее номера записей через запятую. Поиск на совпадение проводить функцией Pos(). Не знаю, прокатит ли такая штука с Парадоксом - попробуйте, может тоже будет работать.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
23.10.2005, 12:42
общий
это ответ
Здравствуйте, CJ!
Я так понимаю, что нужно обойти все записи таблицы в случайном порядке и размер таблицы ограничен разумными пределами. В таком случае можно создать массив индексов, по которому будем выбирать записи:
var
Ind: array of integer;
i,j,k: integer;
begin
SetLength(Ind, RecCount);
try
//Индекс по порядку
//RecCount - кол-во записей
for i:=0 to RecCount-1 do Ind[i]:=i;
//Теперь рандомно перемешаем его
Randomize;
for i:=0 to RecCount-1 do
begin
j:=Random(RecCount); //куда переносим (меняем местами)
k:=Ind[i];
Ind[i]:=Ind[j];
Ind[j]:=k;
end;
//Теперь можно обходить по нашему индексу с гарантией случайности
//и того, что ни одна запись не будет пропущена
for i:=0 to RecCount-1 do
begin
Table1.First;
Table1.MoveBy(Ind[i]);
//Делаем с записью всё что угодно:)
end;
finally
Ind:=nil;
end;
end;
Форма ответа