-
[Delphi] Nepřímé připojení dat k objektu
Nevim jestli jsem nazval tento thread správně, ale problém je takovýto:
Máme udělat lineární seznam, ktery obsahuje prvky typu TPrvek. TPrvek má atribut Naslednik:TPrvek. Potřebuji k prvku připojit data. Udělal jsem to tak, že jsem přidal nový atibut Data:String. Jenže takhle to nemá být. Prvek seznamu nemá v sobě nést data. Řešení je prý pomocí dědičnosti nebo pomocí tzv. háčku. Ale ani v jedno prípadě nevim jak na to. Data mohou být podle potřeby různá. Mohou být trojího typu:
1. typ: 2 polozky(string,integer)
2. typ: 3 polozky(string,string,integer)
3. typ: 2 polozky(string,string)
Vytvoril bych si tedy 3 třídy od každého typu dat jednu.
Jak mám zajistit aby jsem měl k prvku připojen konkrétně jeden typ dat?
-
Re: [Delphi] Nepřímé připojení dat k objektu
Neporadím ti úplně konkrétně, protože to úplně nechápu... ale zkusil bych se podívat na přetížené (overloaded) funkce - nadefinuješ stejné fce (snad i třídy), s různými parametry a ono se to bude chovat podle toho jaké parametry k tomu dáš...
-
Re: [Delphi] Nepřímé připojení dat k objektu
pomoci dedicnosti to muzes udelat tak, ze budes mit tridu TPrvek, ktera bude mit atribut Naslednik typu TPrvek. Trida TSeznam bude obsahovat atribut Prvni: TPrvek.
Data zajistis treba tak, ze z tridy TPrvek "zdedis" sve tridy, ktere budou obsahovat jeste atributy pro tva data, libovolnych typu.
Do seznamu pak bude pomoci metody "add" pridavat vzdy na konec (projdes si cyklem / rekurzi seznam od Prvni pres atributy Naslednik cely seznam az na konec) prvek, ktery bude instanci tve tridy rozsirujici TPrvek, ale pretypovane na TPrvek..cili pro seznam se bude tva trida tvarit jako TPrvek, bude mit atribut Naslednik. Pro tve potreby bude obsahovat data dle libosti (pro pouziti zase pretypujes zpet).
Nebo muzes mit TPrvek, ktery bude obsahovat atribut Naslednik: TPrvek a atribut Data: TPrvekData. Pak si vytvoris tridu TMojeData, ktera bude rozsirovat TPrvekData a bude obsahovat atributy pro tva data. Do seznamu budes na konec pridavat instanci TPrvek, kde atribut Data bude odkazovat na instanci tridy TMojeData a podobne..
A urcite jsou dalsi zpusoby :)
-
Re: [Delphi] Nepřímé připojení dat k objektu
Citace:
Původně odeslal
Smitka
Neporadím ti úplně konkrétně, protože to úplně nechápu... ale zkusil bych se podívat na přetížené (overloaded) funkce - nadefinuješ stejné fce (snad i třídy), s různými parametry a ono se to bude chovat podle toho jaké parametry k tomu dáš...
"Snad i třídy" To jde? Jinak zajímavá myšlenka. Jdu se pokusit to nějak zprovoznit. Kdyby měl někdo další nápady, tak sem s nimi:)
-
Re: [Delphi] Nepřímé připojení dat k objektu
2 Anduril: Tak toto se jeví jako jednodušší myšlenka:) Jen pro upresneni to ma byt seznam cyklicky s hlavou a mame implementovat metody pro vkládání na konec a za aktualni prvek, ale to na situaci moc nemění. Snad to dám do kupy, díky.
-
Re: [Delphi] Nepřímé připojení dat k objektu
Jj, tak to uz je jedno jak to mezi sebou vnitrne propojis, na myslence to nic nemeni :)
-
Re: [Delphi] Nepřímé připojení dat k objektu
Tak už jsem narazil. Mám v Třídě TSingleList tyto metody:
constructor Vytvor(Hlava:TPrvek); Virtual;
procedure Zrus(Parametr:Boolean);
function JePrazdny:Boolean;
function ZpristupniPrvni:TPrvek;
procedure VlozPrvni(Prvni:TPrvek);
procedure OdeberPrvni;
procedure VlozNaslednika(Dalsi:TPrvek);
procedure OdeberNaslednika;
procedure SetAktualni(Prvek:TPrvek);
function GetAktualni:TPrvek;
Vetšina z nich má parametr typu TPrvek. Jenze já vytvářím objekty z třídy dědící po TPrvek, dejme tomu TPotomek1,TPotomek2 a TPotomek3. Z toho plyne že bych musel každou metodu s parametrem typu Tprvek přetížit 3x. Neexistuje jednodušší řešení?
BTW: Jak bych přetížil třeba tuto funkci?
function TSingleList.ZpristupniPrvni:TPrvek;
begin
ZpristupniPrvni:=FHlava.ZpristupniNaslednika;
end;
To asi nejde ne? Bych ji musel vlozit do třídy TPotomek a dat ji typ prislusneho potomka.
Neztracíte se v tom? Ja jo:)
-
Re: [Delphi] Nepřímé připojení dat k objektu
Citace:
Původně odeslal
Chuck
"Snad i třídy" To jde? Jinak zajímavá myšlenka. Jdu se pokusit to nějak zprovoznit. Kdyby měl někdo další nápady, tak sem s nimi:)
Myslim, ze by to slo udelat pomoci ruznych konstruktoru s ruznyma parametrama. Ale na 100% to nereknu, jsem trochu zblblej z javy... Je to jen napad...
-
Re: [Delphi] Nepřímé připojení dat k objektu
Nevim jak v Delphi (treba to neumi? nevim), ale imho by melo stacit, jak jsem psal, pri vkladani prvku tento pretypovat na TPrvek. Jelikoz tve tridy dedi z TPrvek a seznam pouziva pouze tridu TPrvek, pak by to melo stacit...
Ten seznam by mel byt obecny, nevazat se na konkretni tridy, pouze na TPrvek. Nepotrebujes v nem pracovat s daty, takze tridy TPotomek1 a pod te vubec nezajimaji. Kdyz ze seznamu pak TPrvek dostanes, pretypujes si ho zpet na TPotomekX.
-
Re: [Delphi] Nepřímé připojení dat k objektu
Stejne jako v jinych objektove orientovanych jazycich se nemusi nic pretypovavat - resp. udela se tam implicitni pretypovani.
Napr:
Kód:
TPrvek = class
procedure Zpracuj(co: TPrvek);
end;
TDalsiPrvek = class (TPrvek)
end;
TDalsi2Prvek = class (TPrvek)
end;
v kodu pak muzes napsat toto:
Kód:
var
prvek: TPrvek;
dalsiPrvek: TDalsiPrvek;
dalsi2Prvek: TDalsi2Prvek;
begin
prvek = TPrvek.Create();
dalsiPrvek = TDalsiPrvek.Create();
dalsi2Prvek = TDalsi2Prvek.Create();
prvek.Zpracuj(dalsiPrvek);
prvek.Zpracuj(dalsi2Prvek);
end;
-
Re: [Delphi] Nepřímé připojení dat k objektu
Jo, mas pravdu..smerem na TPrvek to pujde samo, ale zpet (z TPrvek na vlastni tridu) imho ne, tam to bude treba pretypovat.
-
Re: [Delphi] Nepřímé připojení dat k objektu
Jj, je to tak. Jsem zapomněl vytvořit seznam, tak mě to házelo chybu na řádku kde jsem vkládal do metody parametr jiného typu a já myslel že je to tím...
-
Re: [Delphi] Nepřímé připojení dat k objektu
Nejak se mi nedaří zprovoznit vypsání dat. Asi jsem to nepochopil správně. Chci to realizovat asi takto: Budu procházet seznam od začátku do konce a na každém prvku bych chtěl vyvolat metodu VypisSe. Podle výše uvedených poznatků predpokládám že prvky jsou v seznamu uloženy jako typ TPrvek(implicitni pretypovani). Ted nemůžu přijít na myšlenku jak přetypovat prvek seznamu zpět na typ TPotomekX, abych z něho dostal data. Respektive podle čeho poznám na jaký typ se to má přetypovat, když jsou tři varianty?
Snad jsem to napsal srozumitelne...
-
Re: [Delphi] Nepřímé připojení dat k objektu
Pokud tuto metodu das i do tridy TPrvek a v tride TPotomekX ji spravne pretizis podle potreby, staci pak, kdyz budes volat vypisSe() na TPrvek..
Jinak verim, ze i deplhi ma nejaky operator "instanceof" nebo neco takoveho, cim zjistis, jestli je dany objekt instanci nejake tridy.
-
Re: [Delphi] Nepřímé připojení dat k objektu
Tu metodu VypisSe mam dát jako abstraktni? Nebo mám v TPrvek vytvořit tělo metody VypisSe(Prvek:TPrvek), kde zjistim(jetli to teda nějak jde) z jaké třídy je vytvořen parametr metody a podle toho přetypuji parametr na správný typ u kterého pak vyvolám metodu VypisSe?
-
Re: [Delphi] Nepřímé připojení dat k objektu
tak v podstate to jde tak i tak. Prvni zpusob bude lepsi.
-
Re: [Delphi] Nepřímé připojení dat k objektu
Citace:
Původně odeslal
Anduril
tak v podstate to jde tak i tak. Prvni zpusob bude lepsi.
pořádně nechápu užití abstraktní a virtuálni metody. Mám to zatím takto:
TPrvek:
interface
constructor Init;
procedure VypisSe; Virtual; Abstract;
implementation
constructor TPrvek.init;
begin
Naslednik:=nil;
end;
TPotomek1:
procedure VypisSe; Override;
begin
Edit.Text:=Atribut; //Atribut je string
end;
TPotomek2:
procedure VypisSe; Override;
begin
Edit.Text:=Atribut; //Atribut je string
end;
Takhle to nikdy nemůže fungovat že?
-
Re: [Delphi] Nepřímé připojení dat k objektu
Ejhle, ono to více méně takto funguje:) Nevim jak se mi to podarilo, ale je to tak. Ani jsem nemusel nic přetypovávat...:)
-
Re: [Delphi] Nepřímé připojení dat k objektu
Nebudu zakládat nový thread tak to hodim sem. Ještě potřebuju vytvořit metodu v třídě TPrvek aby vypisovala atributy do souboru. Na netu jsem něco nastudoval. Když je atribut typu string tak se mi do souboru uloží nesmyslný znaky. Pokud je char, tak se to uloží OK.
stream je vytvoren takto
Kód:
Soubor:=TFileStream.Create(SaveDialog.FileName,fmCreate);
a metoda
Kód:
procedure TSpravceData.Akce(Soubor:TFileStream);
begin
Soubor.Write(Atribut,SizeOf(Atribut));
end;
-
Re: [Delphi] Nepřímé připojení dat k objektu
Nevíte tady jak do souboru zapsat string pomocí streamu?
-
Re: [Delphi] Nepřímé připojení dat k objektu
Stream.Write(promenna, pocet_znaku_v_stringu*sizeof(char));
-
Re: [Delphi] Nepřímé připojení dat k objektu
Citace:
Původně odeslal
MEluZíNa
Stream.Write(promenna, pocet_znaku_v_stringu*sizeof(char));
Tak jsem to zkusel a nešlo mi to a nakonec jsem našel že to ma byt asi takto
Soubor.Write(String[1],Length(String));
Sice nechápu co znamená ten index, ale asi to bude něco s polem... Každopádně to ale funguje. Teď nemůžu přijít na to jak mám odřádkovat na dalsí řádek... Seek a positition me posuvaji po radku:(
-
Re: [Delphi] Nepřímé připojení dat k objektu
Nojo, melo by to byt spis takle:
Stream.Write(@string, Length(string)*sizeof(char));
Protoze write metoda si bere pointer do pameti a delku v bytech. Pak takovy usek v pameti zapise do streamu.
Jinak, pokud chces textovy soubor tak si najdi neco o "textfile". A hlavne si najdi knizku, ze ktery se to naucis, takle skladat vedomosti po drobkach je dost na nic...
-
Re: [Delphi] Nepřímé připojení dat k objektu
A nevis jak na to odradkovani? Ja bych to delal taky jako textfile, ale ten se mi nepodarilo dat jako parametr do metody, tak to musim delat pres stream.
delal jsem to takhle a neslo to
Metoda(Soubor:TextFile);
EDIT: Aha ja jsem trotl:) RTFM!!! Metoda(var Soubor:Text);