Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему данная функция возвращает всегда пустую строку? [D6]


}|{yk ©   (2004-07-16 14:40:00) 


function TDataModuleMain.FormatQuestionBeforeDelete(DataSet: TDataSet; UseOnlyRequired: Boolean = true): string;
var
 FieldIdx: Integer;
 CurrentField: TField;
begin
 Result := '';
 if (DataSet = nil) or (DataSet.Active<>true) then
   Exit;
 FieldIdx := DataSet.Fields.Count - 1;
 while FieldIdx > 0 do
 begin
   CurrentField := TField.Create(Self);
   if DataSet.Fields.FieldByNumber(FieldIdx) <> nil then
   begin
     CurrentField := DataSet.Fields.FieldByNumber(FieldIdx);
     Result := Result + CurrentField.DisplayText + #10#13;
   end;
   Dec(FieldIdx);
   CurrentField.Free;
 end;
end;

FieldIdx получается правильно.


Sandman25   (2004-07-16 16:00:00) [1]

for Index := FieldCount-1 downto 0
?


}|{yk   (2004-07-16 15:58:00) [2]

Все. Окончательный (почти) и работающий  вариант

function TDataModuleMain.FormatQuestionBeforeDelete(DataSet: TDataSet; UseOnlyRequired: Boolean = true): string;
var
 FieldIdx: Integer;
begin
 Result := '';
 FieldIdx :=  0;
 if (DataSet = nil) and not DataSet.Active or DataSet.IsEmpty then
   Exit;
 while FieldIdx < DataSet.Fields.Count do
 begin
   if DataSet.Fields[FieldIdx].Visible then
     if (not DataSet.Fields[FieldIdx].Required and UseOnlyRequired) or (DataSet.Fields[FieldIdx].Required) then
     begin
       Result := Result + DataSet.Fields[FieldIdx].DisplayLabel + ' : ';
       Result := Result + DataSet.Fields[FieldIdx].AsString + #10#13;
     end;
   Inc(FieldIdx);
 end;
end;


Reindeer Moss Eater   (2004-07-16 15:44:00) [3]

if (DataSet = nil) and DataSet.Active then
  Exit;

Странная конструкция.


Reindeer Moss Eater   (2004-07-16 15:37:00) [4]

if DataSet.Fields[FieldIdx] <> nil then

Каков тайный смысл этого кода, если количество полей нам вернулось выше и мы точно знаем с детсва, что индексы начинаются с нуля?


}|{yk   (2004-07-16 15:30:00) [5]

C этого все и началось...

function TDataModuleMain.FormatQuestionBeforeDelete(DataSet: TDataSet; UseOnlyRequired: Boolean = true): string;
var
 FieldIdx: Integer;
begin
 Result := '';
 if (DataSet = nil) and DataSet.Active then
   Exit;
 FieldIdx := DataSet.Fields.Count - 1;
 while FieldIdx > 0 do
 begin
   if DataSet.Fields[FieldIdx] <> nil then
   begin
//      if FieldByNumber(FieldIdx).Required
     Result := Result + DataSet.Fields[FieldIdx].DisplayText + ' : ';
     Result := Result + DataSet.Fields[FieldIdx].AsString + #10#13;
     Dec(FieldIdx);
   end;
 end;
end;

вызывает ошибку уже на третьей итерации - list index out of bounds (-1)


Reindeer Moss Eater   (2004-07-16 15:21:00) [6]

Delphi syntax:

property Fields[Index: Integer]: TField;


Reindeer Moss Eater   (2004-07-16 15:20:00) [7]

Индексированное свойство
TDataSet.Fields


}|{yk   (2004-07-16 15:19:00) [8]

Хорошо, но как получить доступ к полям датасета через индекс?


Reindeer Moss Eater   (2004-07-16 15:13:00) [9]

Начнем с того, что ты ищещ вообще не то, чего тебе надо

Description

Call FieldByNumber to retrieve field information for a field given its field number. Note that the field number is the position of the field in the underlying database table, not the indexof the field in the TFieldsobject.


}|{yk   (2004-07-16 15:10:00) [10]

Да понятно, уже исправил. Но вопрос в другом. Почему DataSet.Fields.FieldByNumber(FieldIdx)  всегда nil?

function TDataModuleMain.FormatQuestionBeforeDelete(DataSet: TDataSet; UseOnlyRequired: Boolean = true): string;
var
 FieldIdx: Integer;
begin
 Result := '';
 if (DataSet = nil) and DataSet.Active then
   Exit;
 FieldIdx := DataSet.Fields.Count - 1;
 while FieldIdx > 0 do
 begin
   if DataSet.Fields.FieldByNumber(FieldIdx) <> nil then
     Result := Result + DataSet.Fields.FieldByNumber(FieldIdx).DisplayText + #10#13;
   Dec(FieldIdx);
 end;
end;


Reindeer Moss Eater   (2004-07-16 15:01:00) [11]

Более того.
Если условие
if DataSet.Fields.FieldByNumber(FieldIdx) <> nil then
однажды выполнится, ты останешься без экземпляров полей в своем датасете после первого же вызова этой функции.


Reindeer Moss Eater   (2004-07-16 14:57:00) [12]

А зачем создавать экземпляры TField, сохранять ссылку на них в локальной переменной, потом терять на них ссылку, присваивая локальной переменной указатель на найденный TField, и в конце грохать найденный экземпляр поля в датасете?

Код функции получен с помощью "Генератора Особо Бессмысленных Функций"?


}|{yk   (2004-07-16 14:54:00) [13]

Смысл функции - пройтись по всем полям Dataseta, сформировать строку по текущей записи с заголовками полей, и выдать это в формаьтрованном виде перед удалением.


Reindeer Moss Eater   (2004-07-16 14:53:00) [14]

if (DataSet <> nil) and DataSet.Active then


}|{yk   (2004-07-16 14:52:00) [15]

Это понятно... Но количество полей в таблице больше 0,  FieldIdx в конкретном случае равен 11, но DataSet.Fields.FieldByNumber(FieldIdx) всегда равен nil. Почему?
>1.if (DataSet = nil) or (DataSet.Active<>true) then

А что? В принципе конечно может и ошибку вызвать, лучше по отдельности. переделаю


Reindeer Moss Eater   (2004-07-16 14:49:00) [16]

Почему данная функция возвращает всегда пустую строку?

Потому что она - сплошной бред.


Digitman   (2004-07-16 14:46:00) [17]


> DataSet.Fields.FieldByNumber(FieldIdx) <> nil


ну, очевидно, потому что условие

DataSet.Fields.FieldByNumber(FieldIdx) <> nil

не выполняется.. это следует из кода, даже без необходимости вникать в конечную логику


MacroDenS   (2004-07-16 14:43:00) [18]

раставь брейкпоинты и пройдись по ним.
Посмотри как соблюдаются условия и какие значения переменных при этом получаются.


Ega23   (2004-07-16 14:43:00) [19]

А может твой DataSet.IsEmpty?


Reindeer Moss Eater   (2004-07-16 14:43:00) [20]

Понравилось следущее:

1.if (DataSet = nil) or ( DataSet.Active<>true) then

2.
CurrentField := TField.Create(Self);
CurrentField := DataSet.Fields.FieldByNumber(FieldIdx);
CurrentField.Free;

редко встретишь такую поэзию


Наверх

Титульная страница Поиск, карта сайта Написать письмо