Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизМетод при наследовании Найти похожие ветки
← →
Sam Stone © (2005-11-14 21:50) [0]Есть код:
TBaseClass = class(TObject)
private
FName:string;
FList:TList;
public
procedure Add(p:pointer);
procedure Delete(i:integer);
function GetObjectByName(AName:string):pointer;
property Items:TList read FList write FList;
end;
THerb = class(TBaseClass)
//специфические поля(детализация)
End;
TPotion = class(TBaseClass)
//специфические поля
End;
TMainFrame = class(TBaseClass)
private
FHerbs:TList;
FPotions:TList;
public
procedure MyProc;
end;
//---------------------
procedure TMainFrame.MyProc;
p:pointer;
begin
...
p:=GetObjectByName("name");
THerb(Herbs[i]).Add(p);// <<================
...
end;
function TBaseClass.GetObjectByName(AName:string):pointer;
var i:integer;
begin
i:=0;
result:=nil;
while i<FList.Count do
if AName=TBaseClass(Items[i]).Name then begin
result:=FList[i];
i:=FList.Count;
end else
inc(i);
end;
Но в случае работы процедуры TMainFrame.MyProc в функции GetObjectByName() работа просходит с TMainFrame.FList, а надо обратиться к списку объекта THerbs или TPotion. Подскажите, как доползти.
Извращения типа TBaseClass(TList(Items[K])[i]).GetObjByName() не помогли ;) (пояснение: в конструкторе MainFrame я в FList добавляю FHerbs и FPotions (Items[k] - указатель на соотв. список), чтобы можно было легко в цикле делать предварительную обработку. Можно было бы просто скопировать код, подставив определенную процедуру, но я для примера привел только два класса. Остальные аналогично выглядят)
← →
Digitman © (2005-11-15 10:02) [1]что-то ты наблудил изрядно с деревом наследования ..
← →
jack128 © (2005-11-15 10:32) [2]Sam Stone © (14.11.05 21:50)
while i<FList.Count do
if AName=TBaseClass(Items[i]).Name then begin
result:=FList[i];
i:=FList.Count;
end else
inc(i);
оригинально :-)
Sam Stone © (14.11.05 21:50)
GetObjectByName() работа просходит с TMainFrame.FList, а надо обратиться к списку объекта THerbs или TPotion. Подскажите, как доползти.
создать процедуруfunction FindByNameInList(List: Tlist): TBaseClass; // А не Pointer как у тебя было. Нефиг принебригать типизацией.
var
I: integer;
begin
i := 0;
Result := nil;
while not Assigned(Result) and (i < List.Count) do
begin
if AName=TBaseClass(List[i]).Name then begin
Result:=FList[i];
Inc(I);
end;
end;
соответственно твой метод function TBaseClass.GetObjectByName(AName:string):pointer; сведется к одной строке Result := FindByNameInList(Items) , в MyProc ты должен написать FindByNameInList( <Тот список в котором тебе нужно искать> )
← →
Игорь Шевченко © (2005-11-15 11:23) [3]jack128 © (15.11.05 10:32) [2]
Сдается мне, ты одно слово забыл. Break;
← →
Sam Stone © (2005-11-15 19:32) [4]Ясно. Просто сперва написал, а потом не хотелось капитально код править
> function FindByNameInList(List: Tlist): TBaseClass; // А
> не Pointer как у тебя было. Нефиг принебригать типизацией.
>
В моем случае нет смысла приводить к TBaseClass, потому что в конце работа идет с THerb и прочими типами, чтобы получить доступ к специфическим полям. А указатель нужет только для того, чтобы "соединить" 2 объекта связью.
> while i<FList.Count do
> if AName=TBaseClass(Items[i]).Name then begin
> result:=FList[i];
> i:=FList.Count;
> end else
> inc(i);
> оригинально :-)
:-)))) невнимательность :) Но ошибки нет, потому что Items - проперти читающая FList. Зато отдельно смотрится жутко :-D
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.038 c