Alexzzy Цитата: delover Кстати, поискал Лишнера в электронном виде
У меня остались только примеры для книг D2 D3 D4. Дело в том что лучше книги о разработке своих компонентов своих дизайнеров и недокументированных свойствах Delphi я не видел. Это именно Секреты Delphi. Сейчас серьёзно поменялось RTTI (~ с d2010) и многое неактуально. Он пишет свои менеджеры памяти и серьёзно для своего времени использует WinAPI.
Про Tag разговор начинался с того что была тема о том, что "if Boolean=True then" это якобы плохой стиль программирования. Моя же мысль о том, что "if КонкретныйКомпонент.Tag = 1 then" более плохой стиль программирования. Дело в том что True переводится с дельфи скорее как правда, а не истина. Меня радует что пишут "Равно Правда". Это для меня типа смайлика, ну не отменять же смайлы по причине того что они вроде не нужны.
Добавлено: Да пример разницы в RTTI.
[more]
Код: [no]{$IFDEF SUPPORTS_GENERICS}
procedure TTestCheckComponent.DoListProc(const AClassName: string;
Proc: TTestListProc);
var
Context: TRttiContext;
t: TRttiType;
Inst: TRttiInstanceType;
meth: TRttiMethod;
test: TTestProc;
begin
for t in Context.GetTypes do
if t.TypeKind = tkClass
then begin
Inst := t.AsInstance;
if Inst.Name = AClassName then
for meth in Inst.GetMethods do
if meth.Visibility = mvPublished
then
begin
FName := meth.Name;
if Pos(sTestProc, FName) <> 1 then
raise ETestWarning.CreateFmt('Error declaration: %s.%s',
[sTestCheck, FName]);
TMethod(test).Code := meth.CodeAddress;
TMethod(test).Data := Self;
test(True);
Proc(FName, FCaption, TMethod(test).Code, FState);
end;
end;
end;
{$ELSE}
procedure TTestCheckComponent.DoListProc(Proc: TTestListProc);
var
P: Pointer;
Count: Word;
I: Integer;
test: TTestProc;
begin
P := PPointer(Self)^;
Inc(PByte(P), vmtMethodTable);
P := PPointer(P)^;
Count := PWord(P)^;
Inc(PByte(P), 8);
for I := 0 to Count - 1 do
begin
FName := PShortString(P)^;
Inc(PByte(P), Length(FName)+7);
if Pos(sTestProc, FName) <> 1 then
raise ETestWarning.CreateFmt('Error declaration: %s.%s',
[sTestCheck, FName]);
TMethod(test).Code := Self.MethodAddress(FName);
TMethod(test).Data := Self;
test(True);
Proc(FName, FCaption, TMethod(test).Code, FState);
end;
end;
{$ENDIF}[/no]