De jó! Köszi szépen, most már kirajzolja az alakokat. Hanem a TTimer-ben látsz valami problémát? Mert nem akar elindulni az 5-ös kezdőértékről, pedig az Enabled tulajdonságát is true-ra állítottam.
Most meg azt írja, hogy az alakmozgatas nem tagja a 'TForm1'-nek. Jó helyen gondolom én egyáltalán a header létét (a #pragma resource "*dfm" után)? Itt az egész kódom, kiemelve a kritikus részeket:
És az a gond, hogy erre az utolsó, OnTimer-es sorra mindig hibát jelez, ha teszek ()-eket az alakomzhatas után, ha nem; ha írok elé &-et, ha nem. Például:
az OnPaint-ban lévő Kirajzol függvény sem az alakok-at, sem az AlakokKepe-t nem ismeri fel
Nyilvan, hiszen mindketto lokalis valtozo a FormCreate fuggvenyedben. Rakd be a TForm1 osztalyba (ugyanugy, mint ahogy az x, y valtozokat az egyalak osztalyodba)!
Egyébként a __fastcall utasítás szükséges a függvénynévnél?
Sikerült megoldanom! Átraktam ezt a két sort kívülre, és így már kirajzolja az alakokat:
Graphics::TBitmap *AlakokKepe = new Graphics::TBitmap; egyalak *alakok[5];
Már csak az az egy kérdésem maradt, hogy osztályon (class) belül hogyan lehet megoldani egy egyéni kép hozzáadását? Tehát van már X és Y változó, de kép milyen módon lehet?
Javítottam is a kódomon, és most már csak az objektumok kirajzolásával van gond. Mert ennek alapján:
class egyalak { public: egyalak(int px, int py) { x=px; y=py; } int x; int y; };
void __fastcall TForm1::FormCreate(TObject *Sender) { Graphics::TBitmap *AlakokKepe = new Graphics::TBitmap; AlakokKepe->LoadFromFile("alak\alak_all.bmp"); egyalak *alakok[5]; int i; for (i=0; i<5; i++) { alakok[i]=new egyalak(4,i+40); } } //---------------------------------------------------------------------------
void __fastcall TForm1::Kirajzol(TObject *Sender) { int i; for (i=0; i<5; i++) { Canvas->Draw(alakok[i]->x,alakok[i]->y,AlakokKepe); } }
az OnPaint-ban lévő Kirajzol függvény sem az alakok-at, sem az AlakokKepe-t nem ismeri fel. Ezeket hogyan tudnám megadni, hogy felismerje? És melyik a célszerűbb: az egyalak osztályban letárolni a képet, vagy így, ahogy most van, külön változóból (AlakokKepe) beolvastatni a Draw-ban? Azért kérdeztem, hogy ezt a képet milyen típusként kellene megadnom, mert ez a deklarációkor szükséges.
Egyébként a __fastcall utasítás szükséges a függvénynévnél? Ha jól olvastam, ez a gyorsítás érdekében van odaírva, hogy regiszterekben adódjon át a paraméter. Nem tudom, hogy ez pontosan miért jó, de tényleg célszerű?
A :: a hatokor feloldo operator, pl. ha van egy i globalis valtozod, es mas nevter(ek)ben is letezik ugyanezzel a nevvel egy valtozo, ezzel tudsz ra hivatkozni:
#include <iostream>
int i = 5;
void cout() { }
class A
{
int i = 3;
void bla() { std::cout << ::i << std::endl; }
};
A bla() meghivasaval 5 lesz a kimenet, nem 3. Ugyanigy, az std::cout-tal is az std nevterben levo fuggvenyt hasznalod (ha lehagyod az std::-t, le se fordul)
Hivatkozhatsz vele egy osztaly statikus fuggvenyeire, valtozoira, szulo valamelyik fuggvenyere, ha felulirtad volna, es az eredeti implementaciot (is) meg akarod hivni, stb.
Gondolom a kerdesed a kododban levo Graphics::TBitmap-re iranyult. A fentieknek megfeleloen itt a Graphics nevterben (namespace) levo TBitmap tipust peldanyositod. (ld. meg using namespace..)
. vs ->
Sarkitva (es azokra a peldakra ertve, amelyekkel elso korben talalkozni fogsz) a . kb. ugyanaz, mint a -> (a->b helyett irhatod azt is, hogy (*a).b). Ha mutaton keresztul hivatkozol egy tagfuggvenyre/valtozora akkor ->-t, amugy .-t kell hasznalni. A fordito erre ugyis figyelmeztet, ha elteveszted veletlenul. (Mondjuk ez igy nem teljesen korrekt, mivel a -> operator feluldefinialhato, ezert mast is jelenthet, de ez mar messzebbre vezet, ld. pl shared_ptr es tsai...)
ilyen multimédiás adatot miként
A kododban van egy Graphics::TBitmap tipusu valtozo. Ez pont arra jo, igaz nagy valoszinuseggel a hordozhatosagnak lottek igy.
Rendben, köszi neked is, máris nekilátok javítani a hibákat.
Még azt megkérdezném, hogy a . és :: tagok mire valók, miknek az elválasztására használatosak? Azt tudom, hogy a nyíl (->) az objektumok tulajdonságai elérésére való, de előbbi kettőre nem találtam konkrét magyarázatot.
A kép tárolására szolgáló adattípus alatt azt értem, hogy pl. az egész számokat többnyire int adattípusként deklaráljuk, akkor egy ilyen multimédiás adatot miként? (FreeBasicben erre pl. az Any Ptr van.)
Köszi a választ; valóban "őskövület", de talán egyelőre, az alapok elsajátításához megfelel. Főleg, hogy egy, még a 3-as változatáról szóló könyvből tanulok (Windows alkalmazások fejlesztése C++ Builder 3 rendszerben; Computerbooks, 1999).
Abban még tudnál segíteni, hogy megmagyarázd, ebben a kódrészletben mi a hiba?
class egyalak { public: egyalak(int x, int y); int x; int y; }
for (int i=0; i<5; i++) { alakok[i]=new egyalak(4,i+40); } }
Azt írja a ciklusváltozóra, hogy: Undefined symbol: i. Pedig int típusú.
Azt szeretném egyébként elérni, hogy egy objektum 5 darab példánya legyen kirajzolva a képernyőn. Nem tudom, erre a class-t lehet-e használni; ez-e a legjobb módszer?
0. az IDE (nagyvonaluan fogalmazva) csak egy eszkoz a fejlesztesre, az egesz kodot nem fogja megirni neked, csak tamogat benne (bar generalhat bizonyos kodreszleteket, amely nagy segitseg lehet)
1. nem egy IDE hasznalata tesz jo programozova/koderre
A BC++6 egy oskovulet 2002-bol, reg eljart felette az ido. Sejtheted, hogy a modern C++ nyelvbol mennyi mindent tamogat. Itt megnezheted mi az amit nem: https://isocpp.org/std/status
Szoval hiaba nem "a gyengek eszkoze", ezzel biztos nem fogod elsajitatni a C++ csinjat-binjat, bar arra hogy osszekattintgass kezdetnek ezt-azt, jo lehet.
Szvsz valassz masikat, pl. VS-bol van community edition, tanulashoz jo. A lenyeg, hogy minel frissebb forditot (ami akar fuggetlen az IDE-tol) hasznalj, ha a modern(ebb) C++-t (legalabb C++11/14/17 stb) akarnad tanulni.
Jobb híján ide írom az írnivalómat, mert megfelelőbb témát nem találtam hozzá a Programozás témakörben.
Szóval, belekezdtem a C++ programozásba, amivel apróbb játékokat és grafikai programokat szeretnék készíteni. Ehhez először a Code::Blocks-szal és a Dev C++-szal próbálkoztam, de ott sem az SFML-t, sem az SDL-t nem sikerült beállítanom, amikkel multimédiás programok készíthetők.
Már majdnem feladtam, amikor eszembe jutott a jó öreg Borland C++ Builder 6. Fel is telepítettem a minap, és azóta is viszonylag jól haladok a programozgatással, mert a Canvas meglétét ki tudom használni rajzoláskor. Nameg a VCL-t is (ez a Form tervező vagy mi a szösz lenne, ha nem tévedek, de ti biztosan tudjátok, hogy mire gondolok), amivel egy-két kattintás és némi pötyögés után gyorsan összeállítható egy kisebb programocska.
Csupán annyit kérdeznék, hogy ezzel a Borland C++ Builder-rel teljesen el lehet sajátítani a C++ csínját-bínját? Annyira más a logikája a C::B-hoz és a Dev C++-hoz képest, hogy még azt is feltételezem, nyelvileg is vannak eltérések.
Lehet e segítségével belőlem C++ programozó, vagy ez a "gyengék" fejlesztőeszköze, és a profik a másik kettőt, esetleg Visual Studio-t használnak?
Nem lenne rossz megoldás, de sajnos folyamatosan változik(N) a maximum értéke... egyéb ötlet? Bár azért meg fogom próbálni... osztás, egész rész, egészen addig amíg bele nem fér a tartományba. Bár így sajnos a szélső értékek igen ritkán jönnek majd ki.
Ha nem abban a tartományban generál, akkor simán szorozd meg-oszd el, hogy átkonvertáld abba a tartományba. Ha például 0 és 1 közötti valóst kapsz, ahogy szokás, akkor szorozd meg n-nel, vedd az egészrészét, és máris 0 és n közötti számokat kaptál.
Hali! Csak egy kérdésem lenne. (Egyenlőre. :) ) Véletlenszám-generálás. Melyik függvény is az, amelyiknl be tudom állítani, hogy ettől eddig tartománybn generáljon? Ezeket próbáltam, de nem sikerült: Randomize(); RandSeed; Generál véletlenszámot, de nem abban a tartományban amiben kéne. Anno tudtam, de a könyvemet elfelejtették visszahozni, én meg azt felejtettem el kinek adtam oda... Ja, C++Builder 4.0-s van fenn jelenleg.
VC++ 6.0 szakerto, kello turelemmel es skype eleressel felfegyverkezve kerestetik, konzultaciora ill. kisebb projectekre. Rutinos programozot keresek, aki lepesrol lepesre segit nekem megoldani egy problemat. Valojaban igen egyszeru, nehany szaz soros programrol van szo, de igenyel specialis ismereteket. Egy animacio megjelenito modult kell vezerelni, a modul mar keszen van, csak parameterekkel kell meghivogatni, es bizonyos logikai donteseket kell meghozni, diohejban. Elerhetosegem attila @ seohungary.com koszi
Ha úgy érted, hogy egy x86-os *.OBJ vagy *.LIB alkalmazható-e egy másik architektúrán, akkor természetesen határozott nem a válasz; csak a forrásprogramok átviteléről lehet szó.
Ha magad nem akarod megírni, akkor keress valakit, aki ír neked egy "elertPontBeolvasas" nevű függvényt! Vagy úgy gondoltad, hogy valahogy automatikusan 'megírodik' majd ez a függvény?