Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1090417528
vic1
2004-07-21 17:45
2004.08.15
кодировки *dbf


11-1078154025
ctapik
2004-03-01 18:13
2004.08.15
Занимаемая память программы (Task manager)


14-1091004315
olookin
2004-07-28 12:45
2004.08.15
Картинки с утреннего потопа в Екатеринбурге


3-1090448400
Viner
2004-07-22 02:20
2004.08.15
ADO и MySQL


3-1090558298
PiterPP
2004-07-23 08:51
2004.08.15
Ошибка на клиенте при открытии базы dbf





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский