Главная страница
    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.035 c
3-1090056519
Russko
2004-07-17 13:28
2004.08.15
Сортировка ORDER BY


1-1091193030
Veetyok
2004-07-30 17:10
2004.08.15
как сохранить stringgrid в файл


1-1091111490
_student
2004-07-29 18:31
2004.08.15
Может ли на форме существовать два объекта с одинаковыми именами?


6-1087387389
Amirka
2004-06-16 16:03
2004.08.15
Как вытащить определенный текст из html-файла?


14-1090922461
Vlad Oshin
2004-07-27 14:01
2004.08.15
Купим Луну? :)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский