Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> два цикла, два цикла и зависание программы 
:(
    Опции темы
alf138
Дата 30.9.2011, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



После прохождения первого цикла программа зависает 
Код

  while not DBGrid2.DataSource.DataSet.Eof do begin
  if StrToInt(DBGrid2.Fields[12].Value) >0 then
  begin
  ShowMessage('Деталь '+DBGrid2.Fields[11].Value+'превышает свое колво на '+IntToStr(DBGrid2.Fields[12].Value)+' шт' );
  if StrToInt(DBGrid2.Fields[12].Value)<0 then
  begin
  ShowMessage('Деталь '+DBGrid2.Fields[11].Value+'нехватает '+IntToStr(DBGrid2.Fields[12].Value)+' шт' );
  end;
        DBGrid2.DataSource.DataSet.Next;
end;
  end;

PM MAIL   Вверх
DarkProg
Дата 30.9.2011, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Определитесь откуда именно вы хотите тянуть данные из Датасета или из таблицы, а то у вас какой-то полуметод, т.е. либо обращайтесь напрямую к датасету Dataset.FieldByName('Поле1').asInteger и соответственно делайте Dataset.Next и т.д.

Да, и ещё, проход по датасету можно организовать используя цикл For, т.к. есть Dataset.RecordCount

Перед циклом обязательно поставьте Dataset.First

Либо вытаскивайте данные из таблицы, но т.к. я понятия не имею что у вас за Grid, то и подсказать не могу.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
northener
Дата 30.9.2011, 23:29 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(alf138 @  30.9.2011,  22:35 Найти цитируемый пост)
После прохождения первого цикла программа зависает

1. Ужасное форматирование кода! 
2. А где тут два цикла?



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 1.10.2011, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(DarkProg @  30.9.2011,  23:00 Найти цитируемый пост)
Да, и ещё, проход по датасету можно организовать используя цикл For, т.к. есть Dataset.RecordCount
DataSet.Next предпочтительней



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 1.10.2011, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Я попытался лишние begin'ы выкинуть:
Код

  while not DBGrid2.DataSource.DataSet.Eof do 
   begin
    if StrToInt(DBGrid2.Fields[12].Value) >0 then
      ShowMessage('Деталь '+DBGrid2.Fields[11].Value+'превышает свое колво на '+IntToStr(DBGrid2.Fields[12].Value)+' шт' );
    if StrToInt(DBGrid2.Fields[12].Value)<0 then
      ShowMessage('Деталь '+DBGrid2.Fields[11].Value+'нехватает '+IntToStr(DBGrid2.Fields[12].Value)+' шт' );
     DBGrid2.DataSource.DataSet.Next;
  end;


Добавлено через 1 минуту и 19 секунд
И вообще - зачем так сложно, т.е. к данным обращаться через DBGrid?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
DarkProg
Дата 2.10.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(bems @  1.10.2011,  17:15 Найти цитируемый пост)
DataSet.Next предпочтительней

Как ни странно и не порадоксально обычно код выглядит примерно так

Код

Dataset.First;
For i:=0 to Dataset.RecordCount-1 do
  begin
     //что-то делаем
    Dataset.Next;
  end;



--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
bems
Дата 2.10.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



DarkProg, RecordCount не обязан быть точным. 



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 2.10.2011, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(bems @  2.10.2011,  12:56 Найти цитируемый пост)
RecordCount не обязан быть точным. 

Чтобы ему быть точным, придумали .Fetch. smile Я к тому, что тоже всегда FOR использую в таких случаях.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
DarkProg
Дата 2.10.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(Данкинг @  2.10.2011,  13:57 Найти цитируемый пост)
Чтобы ему быть точным, придумали .Fetch.


Это точно smile


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
bems
Дата 2.10.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Не встречал что-то. Может имеется в виду FetchAll? Ну он не объявлен в базовом TDataSet, значит мне всегда придется знать конкретный класс датасета, и надеятся что у всех потомков с которыми я захочу работать он есть (щас будет совет использовать Rtti? smile ). 
Есть вот еще Last для этих целей, это уже вариант. Пожалуй сделаю себе хелпер smile
Код

type

  TDataSetHelper = class helper for TDataSet
  public
    procedure MakeRecordCountWorkProperly; inline;
  end;

implementation

{ TDataSetHelper }

procedure TDataSetHelper.MakeRecordCountWorkProperly;
begin
  Last
end;

Ну или альтернатива - просто написать цикл while   


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 2.10.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(bems @  2.10.2011,  17:36 Найти цитируемый пост)
FetchAll

Да, именно он. Но тут от СУБД зависит: датасеты в Access или FoxPro всегда же возвращают все имеющиеся записи. FB - нет. К тому же зная RecordCount, можно в цикле использовать и ProgressBar, что при работе с подобными вещами - проход по датасетам - весьма полезно.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
bems
Дата 2.10.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Данкинг @  2.10.2011,  17:22 Найти цитируемый пост)
Но тут от СУБД зависит

вот это и плохо

Цитата(Данкинг @  2.10.2011,  17:22 Найти цитируемый пост)
К тому же зная RecordCount, можно в цикле использовать и ProgressBar, что при работе с подобными вещами - проход по датасетам - весьма полезно
вот для таких вещей он и годится. А для реальной работы - нет. 
Если прогрессбар немного соврёт ничего страшного не случится же.


Это сообщение отредактировал(а) bems - 2.10.2011, 17:39


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 2.10.2011, 23:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 12
Всего: 20



Цитата(bems @  2.10.2011,  17:37 Найти цитируемый пост)
Дата 2.10.2011, 17:37 

Абсолютно согласен.
Код

x.First
while not x.EOF do begin
...
  x.Next;
end;

Единственный грамотный способ перебора всех записей любого наследника TDataSet! 
Во всех версиях Дельфи и во всех версиях сторонних компонент купленных Борландом.

P.S. Есть ещё конечно методы BOF, Last и Prior, но это то же самое.

А с RecordCount очень легко рано или поздно нарваться на очень крупные неприятности, после чего вполне вероятно придётся переписывать всю или почти всю программу.

Это сообщение отредактировал(а) northener - 3.10.2011, 01:24


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.