![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему данная функция возвращает всегда пустую строку? [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;
редко встретишь такую поэзию