Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2013, 21:58   #1
martin0102
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 10
По умолчанию Delphi(Цикл)

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i:Integer;
begin
for i:=0 to 98 do
begin
  ADOTable1.First;
  if ComboBox1.Items[i]=(ADOTable1.FieldByName('n').AsString) then Continue
  else
  ComboBox1.Items.Add(IntToStr(i+1));
  ADOTable1.Next;
end;
end;
мне надо чтобы в случае если совпадает значение в поле n(в таблице) со значением строки ComboBox-а то в ComboBox не добавлялась такая строка, вроде написано норм, но выводит полностью все 99, есть какието советы?




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 06.03.2013 в 08:33.
martin0102 вне форума Ответить с цитированием
Старый 05.03.2013, 23:18   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,376
По умолчанию

Предположу, что строку:
Код:
ADOTable1.First;
следует вынести за цикл:
Код:
ADOTable1.First;
for i:=0 to 98 do
begin
  if ComboBox1.Items[i]=(ADOTable1.FieldByName('n').AsString) then
     Continue
  else
     ComboBox1.Items.Add(IntToStr(i+1));
ADOTable1.Next;
end;

Вроде так ...
PS: Только по наитию ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 06.03.2013, 00:59   #3
martin0102
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 10
По умолчанию

особо ничего не поменялось, как еще можно это реализовать?
martin0102 вне форума Ответить с цитированием
Старый 06.03.2013, 07:02   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
как еще можно это реализовать?
Анализом имеющегося кода и поиском ошибок. Ставьте бреакпоинты и смотрите в чем проблема. К примеру алгоритм может быть рабочим, но в ComboBox1 могут уже иметься все значения из ADOTable1. Я бы заострил внимание на работу Continue. Как я понимаю она просто берет следующую итерацию, соответственно пропуская ADOTable1.Next;
Делайте выводы сами.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 06.03.2013, 08:46   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, полность согласен с высказанными выше замечаниями.

во-вторых,
у Вас проблема в алгоритме. алгоритм у Вас не плохой - он ЖУТКИЙ!
вообще ничего не понятно, что находится в таблице, почему цикл от 0 до 98 (ведь есть и количество записей в таблице и есть количество элементов в ComboBox), почему сравнивается на элемент на i-m месте ComboBox'а c элементом таблицы ?!...

если хотите получить конкретную помощь, то, расскажите, что у Вас изначально (до выполнения данного кода в ComboBox, что в таблице, и что должно получится после выполнения данного цикла. Желательно на конкретном примере, с конкретным набором циферок...

p.s. пока, ИНТУИТИВНО (читай "телепатически" ) я думаю, что задача должна выглядеть примерно так:
Код:
var i: integer;
begin
  ComboBox1.Items.Clear;
  for i:=0 to 98 do
    if Not ADOTable1.Locate('n', i ,[]) then
             ComboBox1.Items.Add( IntToStr(i));
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.03.2013, 08:48   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Может, проще первый цикл по таблице делать, а уже второй в комбике?

Типа такого:

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i:Integer;
  find: boolean;
begin
  ADOTable1.First;
  While not ADOTable1.Eof do begin
    find:=false;
    for i:=0 to 98 do begin
      find:=ComboBox1.Items[i]=ADOTable1.FieldByName('n').AsString;
      if find then break;
    end;
    if not find then ComboBox1.Items.Add(ADOTable1.FieldByName('n').AsString);
    ADOTable1.Next;
  end;
end;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 06.03.2013, 09:15   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Может, проще первый цикл по таблице делать, а уже второй в комбике?
особенно если пользоваться всеми возможностями Tstrings (Indexof)
Код:
adotable1.first;
while not adotable1.EOF do begin
  if combobox1.items.Indexof(adotable1.fieldbyname('n').asstring)<0 then combobox1.Items.add(adotable1.fieldbyname('n').asstring);
  adotable1.Next;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.03.2013, 14:23   #8
martin0102
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 10
По умолчанию

Я извеняюсь что не правильно поставил вопрос, всем спасибо за помощь)))

Последний раз редактировалось martin0102; 07.03.2013 в 14:25.
martin0102 вне форума Ответить с цитированием
Старый 07.03.2013, 14:26   #9
martin0102
Пользователь
 
Регистрация: 14.01.2013
Сообщений: 10
По умолчанию

Код:
var i: integer;
begin
  ComboBox1.Items.Clear;
  for i:=0 to 98 do
    if Not ADOTable1.Locate('n', i ,[]) then
             ComboBox1.Items.Add( IntToStr(i));
end;
это именно то что мне нужно

Последний раз редактировалось martin0102; 07.03.2013 в 14:28.
martin0102 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
цикл while (delphi) mxra1n Помощь студентам 8 25.06.2012 19:43
Delphi, цикл while Reaper052 Помощь студентам 11 12.06.2012 17:23
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34