Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизПочему данная функция возвращает всегда пустую строку? Найти похожие ветки
← →
}|{yk © (2004-07-16 14:40) [0]
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 получается правильно.
← →
MacroDenS © (2004-07-16 14:43) [1]раставь брейкпоинты и пройдись по ним.
Посмотри как соблюдаются условия и какие значения переменных при этом получаются.
← →
Reindeer Moss Eater © (2004-07-16 14:43) [2]Понравилось следущее:
1.if (DataSet = nil) or (DataSet.Active<>true) then
2.
CurrentField := TField.Create(Self);
CurrentField := DataSet.Fields.FieldByNumber(FieldIdx);
CurrentField.Free;
редко встретишь такую поэзию
← →
Ega23 © (2004-07-16 14:43) [3]А может твой DataSet.IsEmpty?
← →
Digitman © (2004-07-16 14:46) [4]
> DataSet.Fields.FieldByNumber(FieldIdx) <> nil
ну, очевидно, потому что условие
DataSet.Fields.FieldByNumber(FieldIdx) <> nil
не выполняется.. это следует из кода, даже без необходимости вникать в конечную логику
← →
Reindeer Moss Eater © (2004-07-16 14:49) [5]Почему данная функция возвращает всегда пустую строку?
Потому что она - сплошной бред.
← →
}|{yk © (2004-07-16 14:52) [6]Это понятно... Но количество полей в таблице больше 0, FieldIdx в конкретном случае равен 11, но DataSet.Fields.FieldByNumber(FieldIdx) всегда равен nil. Почему?
>1.if (DataSet = nil) or (DataSet.Active<>true) then
А что? В принципе конечно может и ошибку вызвать, лучше по отдельности. переделаю
← →
Reindeer Moss Eater © (2004-07-16 14:53) [7]if (DataSet <> nil) and DataSet.Active then
← →
}|{yk © (2004-07-16 14:54) [8]Смысл функции - пройтись по всем полям Dataseta, сформировать строку по текущей записи с заголовками полей, и выдать это в формаьтрованном виде перед удалением.
← →
Reindeer Moss Eater © (2004-07-16 14:57) [9]А зачем создавать экземпляры TField, сохранять ссылку на них в локальной переменной, потом терять на них ссылку, присваивая локальной переменной указатель на найденный TField, и в конце грохать найденный экземпляр поля в датасете?
Код функции получен с помощью "Генератора Особо Бессмысленных Функций"?
← →
Reindeer Moss Eater © (2004-07-16 15:01) [10]Более того.
Если условие
if DataSet.Fields.FieldByNumber(FieldIdx) <> nil then
однажды выполнится, ты останешься без экземпляров полей в своем датасете после первого же вызова этой функции.
← →
}|{yk © (2004-07-16 15:10) [11]Да понятно, уже исправил. Но вопрос в другом. Почему 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:13) [12]Начнем с того, что ты ищещ вообще не то, чего тебе надо
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 index of the field in the TFields object.
← →
}|{yk © (2004-07-16 15:19) [13]Хорошо, но как получить доступ к полям датасета через индекс?
← →
Reindeer Moss Eater © (2004-07-16 15:20) [14]Индексированное свойство
TDataSet.Fields
← →
Reindeer Moss Eater © (2004-07-16 15:21) [15]Delphi syntax:
property Fields[Index: Integer]: TField;
← →
}|{yk © (2004-07-16 15:30) [16]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:37) [17]if DataSet.Fields[FieldIdx] <> nil then
Каков тайный смысл этого кода, если количество полей нам вернулось выше и мы точно знаем с детсва, что индексы начинаются с нуля?
← →
Reindeer Moss Eater © (2004-07-16 15:44) [18]if (DataSet = nil) and DataSet.Active then
Exit;
Странная конструкция.
← →
}|{yk © (2004-07-16 15:58) [19]Все. Окончательный (почти) и работающий вариант
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;
← →
Sandman25 © (2004-07-16 16:00) [20]for Index := FieldCount-1 downto 0
?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.046 c