![]() |
|
|
#1
|
|||
|
|||
|
Помогите, есть цикл, который присваивает переменной значение из диапазона, а если такое число уже есть, то присваивает другое.
Код Код:
repeat
randomize;
c1:=RandomRange(1,5);
until not AdoTable1.Locate('c1',c1,[loCaseInsensitive]);Код:
begin
randomize;
c1:=RandomRange(1,5);
while AdoTable1.Locate('c1',c1,[loCaseInsensitive]) do
begin
randomize;
c1:=RandomRange(1,5);
end;Как можно закончить цикл? |
|
#2
|
||||
|
||||
|
Код:
var
CheckSet: Set of Byte;
...
begin
...
CheckSet := [1..5];
randomize;
repeat
c1:=RandomRange(1,5);
Exclude(CheckSet, c1);
until (not AdoTable1.Locate('c1',c1,[loCaseInsensitive])) or (CheckSet = []);
...
end; |
|
#3
|
|||
|
|||
|
Все равно виснет.
Вот полный код Код:
procedure TForm1.Button1Click(Sender: TObject);
var
c1, c2 : integer;
CheckSet: Set of Byte;
begin
CheckSet := [1..5];
randomize;
repeat
c1:=RandomRange(1,5);
Exclude(CheckSet, c1);
until (not AdoTable1.Locate('c1',c1,[loCaseInsensitive])) or (CheckSet = []);
if AdoTable1.Locate('Name',Edit1.Text,[loCaseInsensitive]) then
ShowMessage('Warning!')
else
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Text:='Insert Into reg (a1, a2, c1, c2) values (:param1, :param2, :param3, :param4)';
AdoQuery1.Parameters.ParamByName('param1').Value:=edit1.Text;
AdoQuery1.Parameters.ParamByName('param2').Value:=rg1.ItemIndex;
AdoQuery1.Parameters.ParamByName('param3').Value:=c1;
AdoQuery1.Parameters.ParamByName('param4').Value:=c2;
AdoQuery1.ExecSQL;
AdoTable1.Active:=false;
AdoTable1.Active:=true;
end; |
|
#4
|
||||
|
||||
|
я никогда не пользовался функцией RandomRage, поэтому не сразу заметил.
Вот ответ на вопрос. Функция возвращаяет результат ОТ и ДО указанных значений, но НЕ включая их. Соответственно, чтобы из CheckSet удалить все значения, надо делать c1:=RandomRange(0,6); |
|
#5
|
|||
|
|||
|
Тогда значения будут дублироваться. Требуется сделать заполнение поля C1 базы данных значениями от 1 до 5, а если все эти значения заняты, то выдать сообщение об этом.
|
|
#6
|
||||
|
||||
|
Код:
var
CheckSet: Set of Byte;
...
begin
...
CheckSet := [1..5];
randomize;
repeat
c1:=RandomRange(0,6);
if not (c1 in CheckSet) then Continue
else
begin
AdoTable1.Locate('c1',c1,[loCaseInsensitive];
Exclude(CheckSet, c1);
end;
until CheckSet = [];
...
end;Последний раз редактировалось dr. F.I.N., 17.02.2011 в 13:33. |
|
#7
|
|||
|
|||
|
Видимо ошибся - значения опять дублируются, но все равно за помощь спасибо!
|
|
#8
|
||||
|
||||
|
Так. Стоп. Процедура должна искать случайное значени (от 1 до 5) в базе, и если его нет, то добавлять. МосК зашевелился
![]() Код:
var
CheckSet: Set of Byte;
Uni: Boolean;
...
begin
...
randomize;
CheckSet := [1..5];
Uni := true;
repeat
c1:=RandomRange(0,6);
Uni :=(c1 in CheckSet) and (not AdoTable1.Locate('c1',c1,[loCaseInsensitive]);
Exclude(CheckSet, c1);
until (not Uni) or (CheckSet = []);
if Uni then // в с1 уникальное значение
...
end;Последний раз редактировалось dr. F.I.N., 17.02.2011 в 14:00. |