Чтение онлайн

на главную - закладки

Жанры

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

После регистрации классов, вы можете реплицировать их следующим образом:

procedure TForm1.Button1Click(Sender: TObject);

var

 Ref: TComponentClass;

 New: TComponent;

 Stream: TMemoryStream;

begin

 Ref := TComponentClass(Label1.ClassType);

 New := Ref.Create(Self);

 Stream := TMemoryStream.Create;

 try

Stream.WriteComponent(Label1);

Stream.Position := 0;

Stream.ReadComponent(New);

 finally

Stream.Free;

 end;

end;

– Rick Rogers 

Получение

ссылки на класс из объекта II

Мне необходимо получить ссылку на класс из объекта… 

TObject.ClassType

var

 ClassRef: TComponentClass;

 NewComp: TComponent;

begin

 TClass(ClassRef) := Sender.ClassType;

 NewComp := ClassRef.Create(Self);

 …

– Pat Ritchey 

Работа с комментариями в большом куске кода

Delphi 1

В Паскале существует 2 способа обозначить комментарии – {} и (* *). Вы можете вставлять один комментарий в другой (осуществлять вложенность). Следовательно, вставляя (* в начале вашего блока, и *) в конце, вы все еще можете работать с вложенными комментариями типа { }.

Базы данных 

Калькуляция

Код определения возраста

Delphi 1

Вызовите диалог редактирования полей (Fields Editor), дважды щелкнув на компоненте TTable или TQuery, расположенном на вашей форме (или выбрав в контекстном меню пункт Fields Editor). Добавьте все поля, с которыми вы хотите работать в форме (даже если вы хотите, чтобы они были невидимы, но вам необходим к ним доступ – для таких полей установите свойство visible в false). Затем щелкните на «Define…» (определить) для добавления вычисляемого поля. Введите имя вычисляемого поля, отличающееся от имен других полей таблицы, выберите тип (вероятно, StringField) и задайте длину (20 будет в самый раз). Убедитесь в том, что напротив поля 'calculated' стоит галочка. Затем создайте для вашего объекта TTable или TQuery обработчик события 'OnCalcFields'. В этом обработчике вы берете значения реальных полей таблицы, делаете вычисления, и помещаете результаты в объект вычисляемого поля, который вы только что создали. После этого значение выводится в TDBGrid, или в элементе управления TDBText, если вы решили использовать форму вместо табличной сетки.

Наша функция должна достичь цели, обрабатывая значения лет и месяцев. Поскольку не все месяцы имеют одно и то же количество дней, я просто брал среднее число, поэтому результат может быть не очень точен,

но большинство людей это удовлетворяет:

function AgeStr(aDate: TDateTime): string;

var

 DaysOld: Double;

 Years, Months: Integer;

begin

 DaysOld:= Date – aDate;

 Years:= Trunc(DaysOld / 365.25);

 DaysOld:= DaysOld – (365.25 * Years);

 Months:= Trunc(DaysOld / 30.41);

 Result:= Format('%d лет, %d месяцев',[Years, Months]);

end;

В моем случае метод OnCalcFields выглядит так:

procedure TEntryForm.TableNameOrderCalcFields(DataSet: TDataset);

begin

 TableNameOrderAge.AsString := AgeStr(TableNameOrderDateOfBirth.AsDateTime);

end;
 

Как пересчитать все вычисляемые поля (Calculated fields) без переоткрытия TDataSet?

Одной строкой

Nomadic отвечает:

Resync([rmExact, rmCenter]);

Как создать вычисляемые поля во время исполнения программы (Calculated fields at RunTime)?

Nomadic отвечает:

Смотрите книгу "Developing Custom Delphi Components" от Рэя Конопки.

Здесь немного исправленный пример из этой книги

function TMyClass.CreateCalcField(const AFieldName: string; AFieldClass: TFieldClass; ASize: Word): TField;

begin

 Result := FDataSet.FindField( AFieldName ); // Field may already exists!

 if Result<>nil then Exit;

 if AFieldClass = nil then

 begin

DBErrorFmt( SUnknownFieldType, [AFieldName] );

 end;

 Result := FieldClass.Create( Owner );

 with Result do

 try

FieldName := AFieldName;

if (Result is TStringField) or (Result is TBCDField) or (Result is TBlobField) or (Result is TBytesField) or (Result is TVarBytesField) then

begin

Size := ASize;

end;

Calculated := True;

Поделиться:
Популярные книги

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Эра Мангуста. Том 2

Третьяков Андрей
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра Мангуста. Том 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Помещицы из будущего

Порохня Анна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Помещицы из будущего

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Император

Рави Ивар
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Император

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри