Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.02.2011, 12:54
Error Error вне форума
Прохожий
 
Регистрация: 10.01.2007
Сообщения: 33
Репутация: 10
По умолчанию Циклы

Помогите, есть цикл, который присваивает переменной значение из диапазона, а если такое число уже есть, то присваивает другое.
Код
Код:
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  
Старый 17.02.2011, 13:02
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Код:
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  
Старый 17.02.2011, 13:07
Error Error вне форума
Прохожий
 
Регистрация: 10.01.2007
Сообщения: 33
Репутация: 10
По умолчанию

Все равно виснет.
Вот полный код
Код:
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  
Старый 17.02.2011, 13:17
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

я никогда не пользовался функцией RandomRage, поэтому не сразу заметил.
Вот ответ на вопрос. Функция возвращаяет результат ОТ и ДО указанных значений, но НЕ включая их. Соответственно, чтобы из CheckSet удалить все значения, надо делать c1:=RandomRange(0,6);
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #5  
Старый 17.02.2011, 13:25
Error Error вне форума
Прохожий
 
Регистрация: 10.01.2007
Сообщения: 33
Репутация: 10
По умолчанию

Тогда значения будут дублироваться. Требуется сделать заполнение поля C1 базы данных значениями от 1 до 5, а если все эти значения заняты, то выдать сообщение об этом.
Ответить с цитированием
  #6  
Старый 17.02.2011, 13:27
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Код:
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  
Старый 17.02.2011, 13:34
Error Error вне форума
Прохожий
 
Регистрация: 10.01.2007
Сообщения: 33
Репутация: 10
По умолчанию

Видимо ошибся - значения опять дублируются, но все равно за помощь спасибо!
Ответить с цитированием
  #8  
Старый 17.02.2011, 13:55
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Так. Стоп. Процедура должна искать случайное значени (от 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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:36.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025