Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Метод при наследовании   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.048 c
2-1132914479
psa247
2005-11-25 13:27
2005.12.11
Create Process !


2-1132531348
uhhax
2005-11-21 03:02
2005.12.11
FindFirst


2-1132671744
Vladd
2005-11-22 18:02
2005.12.11
TWebBrowser


3-1130308266
Goldmund
2005-10-26 10:31
2005.12.11
Работа с БД с применением DLL


2-1132659001
oleggar
2005-11-22 14:30
2005.12.11
script





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