Keresés

Részletes keresés

egy hazafi Creative Commons License 2019.08.03 0 0 123

Elnézést, megoldottam a TTimer-es dolgot: mindössze az Invalidate()-et felejtettem ki az alakmozgatas függvényem végéről.

(Van úgy, hogy egy pihentető alvás után jönnek meg az ötleteim... :-) )

Előzmény: egy hazafi (122)
egy hazafi Creative Commons License 2019.08.02 0 0 122

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.

Előzmény: _szergej_ (121)
_szergej_ Creative Commons License 2019.08.02 0 0 121

Nem. Valoszinuleg a Unit1.h fajlban lesz az osztalyod deklaralva, ugyanoda ird be, ahova a Kirajzol(TObject *Sender)-t is irtad.

https://docs.microsoft.com/en-us/cpp/cpp/header-files-cpp?view=vs-2019

Előzmény: egy hazafi (120)
egy hazafi Creative Commons License 2019.08.01 0 0 120

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:

 

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
void __fastcall TForm1::alakmozgatas(TObject *Sender); //Ide kell???
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

class egyalak
{
 public:
 egyalak(int px, int py, Graphics::TBitmap* kep)
 { x=px; y=py; kepe=kep;}
 int x;
 int y;
 Graphics::TBitmap* kepe;
 char alkepvaltoido;
 char aktalkep;
 char alkepdb;
};

Graphics::TBitmap *AlakokKepe = new Graphics::TBitmap;
egyalak *alakok[5];
TTimer *alakmozgato;

void __fastcall TForm1::alakmozgatas(TObject *Sender)
{
 int i;
 for (i=0; i<5; i++)
 {
  if (alakok[i]->alkepvaltoido>0)
  {
   alakok[i]->alkepvaltoido-=1;
  }
  else
  {
   if (alakok[i]->aktalkep+1<alakok[i]->alkepdb)
   {
    alakok[i]->aktalkep+=1;
   }
   else
   {
    alakok[i]->aktalkep=0;
   }
   if (alakok[i]->x+(AlakokKepe->Width)<Form1->Width)
   {
    alakok[i]->x+=4;
   }
   else
   {
     alakok[i]->x=-64;
     alakok[i]->y=random(Form1->Height-64);
   }
   alakok[i]->alkepvaltoido=5;
  }
 }
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Graphics::TBitmap* kepei[4];
 AlakokKepe->LoadFromFile("alak\alak_all.bmp");
 kepei[0] = AlakokKepe;
 kepei[2] = AlakokKepe;
 AlakokKepe->LoadFromFile("alak\alak_lep1.bmp");
 kepei[1] = AlakokKepe;
 AlakokKepe->LoadFromFile("alak\alak_lep2.bmp");
 kepei[3] = AlakokKepe;

 int i;
 for (i=0; i<5; i++)
 {
  alakok[i]=new egyalak(4,i*AlakokKepe->Height+10,kepei[0]);
  alakok[i]->alkepvaltoido=5;
  alakok[i]->aktalkep=0;
  alakok[i]->alkepdb=3;
 }

 alakmozgato=new TTimer(this);
 alakmozgato->Interval=5;
 alakmozgato->OnTimer=alakmozgatas;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Kirajzol(TObject *Sender)
{
int i;
for (i=0; i<5; i++)
{
 Canvas->Draw(alakok[i]->x,alakok[i]->y,alakok[i]->kepe);
}
}
//---------------------------------------------------------------------------

Előzmény: _szergej_ (119)
_szergej_ Creative Commons License 2019.07.31 0 0 119

Az alakmozgatas fuggvenyt rakd be az osztalyba:

 

void __fastcall TForm1::alakmozgatas(TObject *Sender)

{ ... }

 

+ ertelemszeruen a headerbe a deklaraciot.

Előzmény: egy hazafi (118)
egy hazafi Creative Commons License 2019.07.31 0 0 118

Belefutottam még egy hibába, aminek megoldására nem tudok rájönni, hiába bújom a könyveket meg a világhálót:

írtam egy saját függvényt, ezzel a fejléccel:

void __fastcall alakmozgatas(TObject *Sender)
{

 ...

}

és ezt a függvényt hívnám egy futásidőben létrehozott időzítő OnTimer eseményében, a FormCreate-ben:

alakmozgato=new TTimer(this);
alakmozgato->Interval=5;
alakmozgato->OnTimer=alakmozgatas;

 

É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:

[C++ Error] Unit1.cpp(90): E2034 Cannot convert 'void (_fastcall *)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'

Hogyan kellene hívnom ezt a saját függvényt, hogy működjön?

egy hazafi Creative Commons License 2019.07.29 0 1 117

Köszönöm szépen; most már működik minden!

Köszönöm, hogy NevemTevével átsegítettetek a kezdeti nehézségeken! Biztosan lesz még jópár buktató, de azért most már el tudok indulni.

Előzmény: _szergej_ (115)
_szergej_ Creative Commons License 2019.07.28 0 0 116

Illetve irhatsz setter/gettert a kepkezeleshez, ha utolag akarod modositani:

class egyalak {

   ...

   void setBitmap(Graphics::TBitmap* img)

   { this->img = img; }

  

   Graphics::TBitmap* getBitmap() const

   { return img; }

   ...

};

Előzmény: _szergej_ (115)
_szergej_ Creative Commons License 2019.07.28 0 0 115

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?

http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm

Tehát van már X és Y változó, de kép milyen módon lehet?

Ugyanugy, mint az x, y valtozo

class egyalak {

 public:
   egyalak(int px, int py, Graphics::TBitmap* img) : x(px), y(py), img(img) {}
   int x;
   int y;

   Graphics::TBitmap* img;

};

Előzmény: egy hazafi (113)
egy hazafi Creative Commons License 2019.07.28 0 0 114

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?

Előzmény: egy hazafi (113)
egy hazafi Creative Commons License 2019.07.28 0 0 113

Oké, köszi a kifejtésért!

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ű?

Előzmény: _szergej_ (112)
_szergej_ Creative Commons License 2019.07.28 0 0 112

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.

Előzmény: egy hazafi (111)
egy hazafi Creative Commons License 2019.07.28 0 0 111

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.)

Előzmény: _szergej_ (110)
_szergej_ Creative Commons License 2019.07.27 0 1 110

Oda van irva a kepernyore, sorszammal ellatva, hogy mi a baja. Tetszik-nem tetszik, meg kell tanulni ertelmezni, hiaba van angolul.

1. hianyzik az osztaly default konstruktora. (Amugy nem szokas egy osztalyt egy fuggveny belsejeben definialni, ld. NevemTeve valaszat)

2. hianyzik az osztaly definicioja utan a ;

  class egyalak {

    ...

  };

 

Azt sem tudom, hogy C++-ban milyen adattípus az, ami pl. egy képet tárolna???

Errol nem szol a szabvany, mivel egy altalanos celu programnyelvrol van szo.

1. megnezed a forditoval kapott libek adnak-e ra tamogatast

2. keresel egy thirdparty libet

3. megirod magad

Előzmény: egy hazafi (109)
egy hazafi Creative Commons License 2019.07.27 0 0 109

Erre most ezt a hibát írja, ami a képen van:

Azt sem tudom, hogy C++-ban milyen adattípus az, ami pl. egy képet tárolna???

Előzmény: NevemTeve (108)
NevemTeve Creative Commons License 2019.07.27 0 0 108

Talán ilyesmi?

 

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("alakalak_all.bmp");
 egyalak *alakok[5];
 int i;

 for (i=0; i<5; i++)
 {
  alakok[i]=new egyalak(4,i+40);
 }
}

Előzmény: egy hazafi (106)
NevemTeve Creative Commons License 2019.07.27 0 0 107

Szerintem azt kellene írnia, hogy 'undefined symbol: alakok'

Vagy ez nem az igazi kód, csak valami hasonló?

Előzmény: egy hazafi (106)
egy hazafi Creative Commons License 2019.07.27 0 0 106

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?

 

void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Graphics::TBitmap *AlakokKepe = new Graphics::TBitmap;
 AlakokKepe->LoadFromFile("alak\alak_all.bmp");

 

 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?

Előzmény: _szergej_ (105)
_szergej_ Creative Commons License 2019.07.26 0 0 105

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.

Előzmény: egy hazafi (104)
egy hazafi Creative Commons License 2019.07.26 0 0 104

Sziasztok!

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?

nivett Creative Commons License 2009.06.29 0 0 103
Végülis... köszi a segítséget. :D
Előzmény: DJG (102)
DJG Creative Commons License 2009.06.29 0 0 102
És az miért baj? Mindig az éppen aktuális n-nel szorozd meg. Nem kell annak konstansnak lennie, változó ugyanúgy lehet.
Előzmény: nivett (101)
nivett Creative Commons License 2009.06.28 0 0 101
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.
Előzmény: DJG (100)
DJG Creative Commons License 2009.06.27 0 0 100
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.

És az „egyelőre” szóban nincsen „n” betű.
Előzmény: nivett (99)
nivett Creative Commons License 2009.06.27 0 0 99
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.
RitkanIsmeteltKerdesek Creative Commons License 2008.08.21 0 0 98
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
Szilardsz Creative Commons License 2008.08.13 0 0 97

Sziasztok!

 

Bcb6.0- ban szeretnék írni Xp- re egy sorosport kezelő programot. Tudna valaki segíteni!

 

Kösz!

NevemTeve Creative Commons License 2008.05.29 0 0 95
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ó.
Előzmény: NevemTeve (94)
NevemTeve Creative Commons License 2008.05.29 0 0 94
Gondolod, hogy erre lehet generikusan válaszolni? Nyilván van egy SDK ahhoz a PDA-hoz, abból kell tájékozódnod.
Előzmény: Törölt nick (93)
NevemTeve Creative Commons License 2008.04.03 0 0 92
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?
Előzmény: hibaforrás (90)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!