Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Быстрый и легкий путь вкл/выкл директив компилятора. Весь Borland pascal.
{$R+,L+} {Это директива компилятора плюс комментарий}
{{$R+,L+} {Эта строка – два комментария, похоже на картинку?}
Аналогично:
{$DEFINE DEVEL}
{$IFDEF DEVEL}
……
{$ELSEIF}
Переключение с «devel» компиляции на не-«devel» версию происходит простым прибавлением второй скобки в первой строке. Единственное нажатие клавиши позволит переключать вам ключи компилятора.
Также для скоростных манипулиций и кратковременных изменений отлично подойдут комментарии, расположенные за строкой:
ifi=0 theninc(i); {выражение+комментарий}
ср.
{ if i=0 then inc(i); {закомментарена вся строка}
Сравните – два нажатия клавиш для установки фигурной скобки или десяток нажатий для установки (* *) до и после строки. Клавиша Del поможет вам вернуться в предыдущее состояние.
– P Gallagher
Получение ссылки на класс из объекта I
Мне необходимо получить ссылку на класс из объекта. Например, если у меня есть ссылка на объект (например, указатель на экземпляр TLabel), то мне необходимо получить ссылку на класс (например, ссылка на класс TLabel) для того, чтобы мне еще создать необходимое количество объектов данного класса. Другими словами, мне нужно дублировать экземпляры классов, создаваемые кем-то еще.
Класс, о котором идет речь, в Delphi не зарегистрирован (его нет в палитре), поэтому GetClass('TLabel') не работает, даже если экземпляры класса существуют, работать с ними можно только через RTTI. Вдобавок к этому, у меня нет даже кода класса, поэтому работа через RTTI - единственный выход.
Вот пример, который получает ссылку на класс и назначает значения новому классу того же типа. Имейте в виду, что вам необходимо сделать некоторое преобразование типов, чтобы с полученным типом класса можно было сделать что-либо полезное, поскольку возвращаемый класс имеет тип TClass.
typeTLabelClass = class ofTLabel;
procedureTForm1.Button1Click(Sender: TObject);
var
Ref : TLabelClass;
New : TLabel;
begin
Ref := TLabelClass(Label1.ClassType);
New := Ref.Create(Self);
New.Parent := Self;
New.Caption := 'Фантастика!';
end;
Реплицирование класса может быть осуществлено одним из двух способов. Во-первых, вы можете воспользоваться методом Assign (который требует, чтобы ваши классы были наследниками TPersistent). Данный способ заключается в использовании метода Assign, работающего с TPersistentClass:
New.Assign(Label1);
Второй способ заключается в использовании автоматической поточности компонента (этот способ требует, чтобы ваши классы являлись наследниками TComponent, и чтобы они были зарегистрированы для потоковой системы).
В вашем вопросе вы исходили из неправильного предположения; классы могут регистрироваться потоковой системой И НЕ регистрироваться в Палитре Компонентов; обычно эти две вещи связаны, но не обязательно. Например, скажем, у вас имеется следующий класс:
TCustomer = class(TComponent)
private
FCompany: string;
FPhone : LongInt;
published
propertyCompany: string readFCompany writeFCompany;
propertyPhone: LongInt readFPhone writeFPhone;
end;
Вы можете зарегистрировать класс для потоковой системы следующим образом:
RegisterClass(TCustomer);
который позволяет знать как осуществлять поточность для TCustomer, но не регистрирует его в Палитре Компонентов.
После регистрации классов, вы можете реплицировать их следующим образом:
procedureTForm1.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, если вы решили использовать форму вместо табличной сетки.
Наша функция должна достичь цели, обрабатывая значения лет и месяцев. Поскольку не все месяцы имеют одно и то же количество дней, я просто брал среднее число, поэтому результат может быть не очень точен, но большинство людей это удовлетворяет:
functionAgeStr(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 выглядит так:
procedureTEntryForm.TableNameOrderCalcFields(DataSet: TDataset);
begin
TableNameOrderAge.AsString := AgeStr(TableNameOrderDateOfBirth.AsDateTime);
end;
Как пересчитать все вычисляемые поля (Calculated fields) без переоткрытия TDataSet?
Интервал:
Закладка: