Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Как узнать, что курсор находится на последней зап


Автор: Mihas 23.3.2009, 15:16
У меня Paradox, BDE.
Мне нужно создать условие:
если курсор находится на первой записи, тогда...
если курсор находится на последней записи тогда...

В таблице есть сортировочное поле, на форме две кнопки "Вверх" и "Вниз", с их помощью я изменяю значения в этом поле и тем самым перемещаю записи. При достижении курсором первой записи, кнопка "Вверх" становится недоступной (UpBtn.Enabled := RecNo <> 1;), а вот с последней записью проблема:

DownBtn.Enabled := not Eof; - неработает.
DownBtn.Enabled := RecNo <> RecordCount; - не работает.
DownBtn.Enabled := RecNo < RecordCount; - не работает.

Как быть?

Автор: Cashey 23.3.2009, 15:24
DownBtn.Enabled := RecNo = RecordCount;
или
DownBtn.Enabled := RecNo = RecordCount-1;

Автор: Mihas 23.3.2009, 15:35
Цитата(Cashey @ 23.3.2009,  15:24)
DownBtn.Enabled := RecNo = RecordCount;
или
DownBtn.Enabled := RecNo = RecordCount-1;

Ни то, ни другое - не сработало...

Автор: pseud 23.3.2009, 15:54
Код

DownBtn.Enabled := RecNo < (RecordCount - 1);

Автор: Mihas 23.3.2009, 16:34
Цитата(pseud @  23.3.2009,  15:54 Найти цитируемый пост)
DownBtn.Enabled := RecNo < (RecordCount - 1);

Не сработало...

Автор: Cashey 23.3.2009, 16:47
Цитата(Mihas @  23.3.2009,  16:35 Найти цитируемый пост)
Ни то, ни другое - не сработало...

надо понять чему у вас RecNo равно. Если стоит сортировка, то RecNo не будет равно номеру видимой записи.

Автор: Akella 23.3.2009, 16:58
а более полный код

Цитата(Mihas @  23.3.2009,  15:16 Найти цитируемый пост)
DownBtn.Enabled := not Eof; - неработает.


Автор: pseud 23.3.2009, 17:13
Mihas, выкладывай тестовый небольшой (одна таблица, одна форма) проект НЕРАБОЧИЙ.

Автор: Mihas 23.3.2009, 17:25
Цитата(Cashey @  23.3.2009,  16:47 Найти цитируемый пост)
надо понять чему у вас RecNo равно. Если стоит сортировка, то RecNo не будет равно номеру видимой записи.


Я тоже думаю, что проблема именно в этом.

Цитата(Akella @  23.3.2009,  16:58 Найти цитируемый пост)
а более полный код


Давайте я выложу весь код, имена свои не менял, просто скопировал, но думаю тут понятно:

Код

procedure TfmProv.SourceProvDataChange(Sender: TObject; Field: TField);
begin
 with Prov do begin
   UpBtn.Enabled:= not Bof;
   DownBtn.Enabled:= not Eof;
 end;
end;

procedure TfmProv.UpBtnClick(Sender: TObject);
var
 SavePos: TBookmark;
 S1Value, S2Value: integer;
begin
 with Prov do
   if not Bof then begin
     DisableControls;
     try
       SavePos:= GetBookmark;
       try
         S1Value:= ProvPNo.AsInteger;
         Prior;
         S2Value:= ProvPNo.AsInteger;
         Edit;
         ProvPNo.AsInteger:= S1Value;
         Post;
         GotoBookmark(SavePos);
         Edit;
         ProvPNo.AsInteger:= S2Value;
         Post;
       finally
         FreeBookmark(SavePos);
       end;
     finally
       EnableControls;
     end;
   end;
   DBGridProv.SetFocus;
end;

procedure TfmProv.DownBtnClick(Sender: TObject);
var
 SavePos: TBookmark;
 S1Value, S2Value: integer;
begin
 with Prov do
   if not Eof then begin
     DisableControls;
     try
       SavePos:= GetBookmark;
       try
         S1Value:= ProvPNo.AsInteger;
         Next;
         S2Value:= ProvPNo.AsInteger;
         Edit;
         ProvPNo.AsInteger:= S1Value;
         Post;
         GotoBookmark(SavePos);
         Edit;
         ProvPNo.AsInteger:= S2Value;
         Post;
       finally
         FreeBookmark(SavePos);
       end;
     finally
       EnableControls;
     end;
   end;
   DBGridProv.SetFocus;
end;

----------------------------------------------------------------
Prov - таблица
ProvPNo - сортировочное индексированное поле
DBGridProv - сетка

Автор: Kbl4AH 23.3.2009, 18:43
Может как-то так?
Код

var
  RecNoCurrent, RecNoLast: Integer;
begin
  with DBGrid1.DataSource.DataSet do
  begin
    RecNoCurrent := RecNo;
    DisableControls;
    Last;
    RecNoLast := RecNo;
    RecNo := RecNoCurrent;
    EnableControls;
  end;
  if RecNoCurrent = RecNoLast then
    ShowMessage('Последняя строка');
end;

Автор: Mihas 23.3.2009, 19:18
Цитата(Kbl4AH @  23.3.2009,  18:43 Найти цитируемый пост)
Может как-то так?

Не прошло...

Автор: Kbl4AH 23.3.2009, 19:34
Mihas, а можешь весь проект выложить?

Автор: Akella 24.3.2009, 09:42
С DataSet.EOF я давно уже поимел дело. Проблема была в том, что когда курсор становится на последнюю запись, то EOF всё равно ещё возвращает False. Т.е. последняя запись - это не конец файла. А когда на последней записи я вызывал Next, вот тогда EOF возвращал True.

Автор: pseud 24.3.2009, 10:14
Цитата(Akella @  24.3.2009,  09:42 Найти цитируемый пост)
С DataSet.EOF я давно уже поимел дело. Проблема была в том, что когда курсор становится на последнюю запись, то EOF всё равно ещё возвращает False. Т.е. последняя запись - это не конец файла. А когда на последней записи я вызывал Next, вот тогда EOF возвращал True.


c точки зрения нас это баг.
с точки зрения разработчиков - это норма:
Цитата

property Eof: Boolean;

Description

Test Eof (end-of-file) to determine if the active record in a dataset is the last record. If Eof is True, the current record is unequivocally the last row in the dataset. Eof is True when an application:

  • Opens an empty dataset.
  • Calls a dataset’s Last method. (Unless it is a unidirectional dataset)
  • Call a dataset’s Next method, and the method fails because the current record is already the last row in the dataset.
  • Calls SetRange on an empty range or dataset.

Eof is False in all other cases.

Tip:    If both Eof and Bof are True, the dataset or range is empty.


особенно радует пункт:
Call a dataset’s Next method, and the method fails because the current record is already the last row in the dataset.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)