![]() |
|
#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; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#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); Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#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; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось 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; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 17.02.2011 в 14:00. |