Toon posts:

[C++Builder] object TImage als parameter

Pagina: 1
Acties:
  • 41 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik heb een functie imgInit die een rondje tekent in een TImage
Daar heb ik er 35 van op 1 formulier..

ik los dat nu als volgt op
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
      
  imgInit(img11,0); imgInit(img12,0); imgInit(img13,0); imgInit(img14,0); imgInit(img15,0);
  imgInit(img21,0); imgInit(img22,0); imgInit(img23,0); imgInit(img24,0); imgInit(img25,0);
  imgInit(img31,0); imgInit(img32,0); imgInit(img33,0); imgInit(img34,0); imgInit(img35,0);
  imgInit(img41,0); imgInit(img42,0); imgInit(img43,0); imgInit(img44,0); imgInit(img45,0);
  imgInit(img51,0); imgInit(img52,0); imgInit(img53,0); imgInit(img54,0); imgInit(img55,0);
  imgInit(img61,0); imgInit(img62,0); imgInit(img63,0); imgInit(img64,0); imgInit(img65,0);
  imgInit(img71,0); imgInit(img72,0); imgInit(img73,0); imgInit(img74,0); imgInit(img75,0);

//  en deze ziet er zo uit:

void __fastcall TfrmMain::imgInit(TImage *Sender, unsigned int iState)
{
    switch (iState)
    {
      case LIGHT_ON:  ((TImage*)Sender)->Canvas->Brush->Color = clLime;
                      ((TImage*)Sender)->Canvas->Pen->Color = clGreen;
                      break;
      case LIGHT_OFF: ((TImage*)Sender)->Canvas->Brush->Color = clSilver;
                      ((TImage*)Sender)->Canvas->Pen->Color = clGray;
                      break;
    }
    ((TImage*)Sender)->Canvas->Pen->Width = 2;
    ((TImage*)Sender)->Canvas->Ellipse (18-(LIGHT_SIZE/2), 
                                       18-(LIGHT_SIZE/2), LIGHT_SIZE, LIGHT_SIZE);
}

//Dat moet ook als volgt kunnen:

  for (int iRow=0; iRow < DISPLAY_WIDTH; iRow++)
  {
    for (int iCol=0; iCol < DISPLAY_HEIGHT; iCol++)
    {
      String sImage = "img" + IntToStr(iRow+1) + IntToStr(iCol+1);
      imgInit((TImage*)sImage.c_str(), aiColArray[iCol]);
    }
  }


Echter de praktijk wijst uit dat het bovenstaande niet werkt..
Hij slaat vast op:
((TImage*)Sender)->Canvas->Brush->Color = clLime;
met een AccesError..

Ziet iemand wat er hier verkeerd gaat..??

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:40
Wat is de juiste error die je krijgt?
een access violation?

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

Zie ik dit goed??

imgInit((TImage*)sImage.c_str(), aiColArray[iCol]);

Je probeert een object te instantieren d.m.v. een string? Nee, dat gaat inderdaad niet in de gemiddelde taal die word gecompileerd. De gemiddelde interpreter (PHP bijv.) kan hier meestal wel mee omgaan.

Edit: iets meer uitleg: Je cast nu een character string om naar een Timage. En wat jij natuurlijk wilt is dat sImage.c_str() de naam van het object wordt zodat je dat kunt gebruiken als TImage. En zoals hierboven al gezegd, dat gaat niet in een compiled language.

Waarom stop je de TIMages niet in een array? Dan kan je ze met een simpele loop benaderen.

[ Voor 27% gewijzigd door Creepy op 01-07-2003 16:43 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Doe die conversie eens typesafe, dus:
C++:
1
2
3
4
if(Sender->InheritsFrom(__classid(TImage)))
  // Do shit
else
  MessageBox("Hey het ding is geen TImage maar een " + Sender->ClassName());

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LOL, sorry ik had die regel van creepy nog niet gelezen :) Dat is idd het probleem :D

Professionele website nodig?


Verwijderd

Topicstarter
Het is de volgende situatie; Deze module is onderdeel van een applicatie waarmee je karakters voor een display mee kan ontwerpen. Het display (1 karakter) bestaat uit een matrix van 5x7 leds. Nu heb ik met 35 TImage's die matrix gevisualiseerd... De karakters worden in een EPROM gezet per kolom. Dus 5 adressen vormen 1 karakter.

Verwijderd

Topicstarter
Creepy schreef op 01 juli 2003 @ 16:41:
Waarom stop je de TIMages niet in een array? Dan kan je ze met een simpele loop benaderen.
Wat voor type zou dat array moeten zijn..??

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 02 juli 2003 @ 08:45:
[...]


Wat voor type zou dat array moeten zijn..??
Wat dacht je van even in een C++ boek te kijken en het hoofdstuk over array's te bekijken en er een Array van Timage van maken, aangezien je TImages wilt benaderen? Of beter nog: skip de array's en gebruik een (descendant van) TObjectList of een vector.

[ Voor 11% gewijzigd door Creepy op 02-07-2003 08:55 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
De luxe van een bibliotheek heb ik momenteel hier niet op mijn werk, ik probeer wat te vinden online, maar het wil niet zo best.. ik vind zat voorbeelden, maar ik kan vanwege mijn geringe ervaring met C++Builder moeilijk insschatten welke componenten daaruit voor mij van belang zijn.. (ja sorry.. ik ben een elektro/embedded-man; dat OO-programmeren ligt mij niet zo..)

Ik zoek een duidelijke omschrijving hoe stapsgewijs te werk te gaan (met het maken/implementeren van zo'n array/OpbectList/Vector); of even een concreet voorbeeld. Het is belangrijk dat die rijen en colommen gescheiden blijven, omdat ik de de colommen naar de display moet sturen (hardwarematig)..

[ Voor 29% gewijzigd door Verwijderd op 02-07-2003 09:55 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Je zoekt iets als dit:
C++:
1
2
3
4
TImage** l_Images = new TImage*[width*height];
for(int x = 0; x != width; x++)
  for(int y = 0; y != height; y++)
    l_Images[y * width + x] = new TImage(Owner);

Professionele website nodig?


Verwijderd

Topicstarter
Aha.. Ja.. Als ik het goed begrijp heb ik dan een Array/List/Vector (??) l_images met allemaal eehh.. 'blanco' TImage's..??

- Hoe krijg ik daar de TImage's in die op mijn formulier staan..? (Zie bovenste bericht img11 tot img75; dat is TImage->Name).

- Als ik de waarde van lampje rij 3 kolom 4 wil weten (Ik gebruik daar de TImage->Tag voor; 0 = aan 1 = uit) ;
hoe haal ik dat uit die lijst..? Ofwel; hoe kan ik de individuele TImage's benaderen..?
(Bedankt voor je hulp overigens!)

[ Voor 12% gewijzigd door Verwijderd op 02-07-2003 10:37 ]


  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 17:28

alienfruit

the alien you never expected

Verwijderd schreef op 02 July 2003 @ 08:44:
Het is de volgende situatie; Deze module is onderdeel van een applicatie waarmee je karakters voor een display mee kan ontwerpen. Het display (1 karakter) bestaat uit een matrix van 5x7 leds. Nu heb ik met 35 TImage's die matrix gevisualiseerd... De karakters worden in een EPROM gezet per kolom. Dus 5 adressen vormen 1 karakter.
Waarom maakte je niet een afgeleidde van TGraphicControl waarbij dmv. die matrix direkt tekent op het canvas ipv. van 35 TImage's te gberuiken?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Of nog handiger als het om lampjes gaat: maak een TGraphicControl derivant TLampje met als enige public property een boolean 'On' :)

Professionele website nodig?


Verwijderd

Topicstarter
Ja dat had ook gekund, maar ik wil dat je de lampjes aan en uit kan klikken.. (Dus dat je grafisch het Symbool kan aanpassen..)

0 0 1 0 0
0 1 1 1 0
1 1 1 1 1
0 0 0 0 0
1 1 1 1 1
0 1 1 1 0
0 0 1 0 0
|-->> Wordt in een array opgeslagen (in hex, dus: 0010100>0x14 , adres gecalculeerd (aan de hand van kolom en nog wat hardwarematige pereferieke omgevingsvariabelen), en binair weggeschreven in een file die in een EPROM geprogrammeerd kan worden

Dat leek mij dan het eevoudigste.. anders moet je weer werken met cursurpositie, kleur op cursorpositie, dat leek mij niet handig.. (en gezien mijn builder-ervaring.. imagine that..! Dan heb ik er helemaal een jaaropgaaf aan..!) Ik moet dit binnen niet al te lange tijd afhebben.. Het is gelukkig een applicatie die alleen intern gebruikt gaat worden, dus hij hoeft gelukkig niet monkey-proof te zijn :)

Ik heb trouwens dat in mijn

__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)

gezet.. (dat is wat ie uitvoerd als het formulier wordt opgestart..)

[ Voor 4% gewijzigd door Verwijderd op 02-07-2003 11:09 ]


Verwijderd

Topicstarter
Is dit wat..? (de compiler accepteert het, maar het werkt nog niet..)

ReadChar haalt een Symbool, op en stopt die in die aiCharColArray en die ziet er ong. als volgt uit:
unsigned int aiCharColArray[5] = {0x11,0x0A,0x7F,0x0A,0x11}

Symbool:
1 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 1 0 1 0
1 0 0 0 1
0 0 0 0 0
0 0 0 0 0

en ConvertValueToArray maakt van 0x11 een: aiColArray = {1,0,0,0,1,0,0}

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//in de opstartdinges:

  for(int iRow = 0; iRow != DISPLAY_WIDTH; iRow++)
  {
    for(int iCol = 0; iCol != DISPLAY_HEIGHT; iCol++)
    {
    String sImage = "img" + IntToStr(iRow+1) + IntToStr(iCol+1);
    l_Images[iCol * DISPLAY_WIDTH + iRow] = new TImage(Owner);
    l_Images[iCol * DISPLAY_WIDTH + iRow]->Name = sImage.c_str();
    }
  }
  
//Bij het aanroepen:

  ReadChar(aiCharColArray,iBank,iAddress);
  for (int iRow=0; iRow < DISPLAY_WIDTH; iRow++)
  {
    ConvertValueToArray(aiCharColArray[iRow], aiColArray, 8);
    for (int iCol=0; iCol < DISPLAY_HEIGHT; iCol++)
    {
      imgInit(l_Images[iCol * DISPLAY_WIDTH + iRow], aiColArray[iCol]);
    }
  }
  

Verwijderd

Topicstarter
ik vermoed dat l_Images niet de objecten op mijn formulier bevat.. Hoe wijs ik die hieraan toe..??

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Al die kicks zijn nodig, we hebben je nu wel genoeg bij het handje genomen. Het is nu aan jezelf om er wat mee te doen. Tips:
P&W FAQ - Leer debuggen!!
• Koop een boek over BCB of algemeen C++ en werk dat eens door. Je beheerst de basisprincipes van C++ niet en pakt veel te moeilijke problemen aan voor je huidige niveau.

Professionele website nodig?

Pagina: 1

Dit topic is gesloten.