[Delphi] Procedure omzetten cijfers in Tcolor lukt niet

Pagina: 1
Acties:

  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Ik ben bezig met een simpel spelletje. Ik heb een array die er zo uitziet:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type 

Tkleur = Record  //array van kleuren
  kleur : TColor;
  end;

tveld = array [0..6,0..6] of integer;  //array met cijfers

var

kleurgrid : array [0..6,0..6] of Tkleur;

 veld : tveld =     //voorbeeld van de array
( ( 1,1,1,1,1,1,1),
  ( 1,0,0,3,0,2,1),
  ( 1,0,1,0,1,0,1),
  ( 1,0,0,0,0,0,1),
  ( 1,0,1,0,1,0,1),
  ( 1,0,0,0,0,0,1),
  ( 1,1,1,1,1,1,1));


De array veld moet dan omgezet worden in een array met kleuren.

Dat heb ik zo gedaan:

Delphi:
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
procedure vulkleuren;  //leest waarden van veld array in en zet die om in kleuren 
//in de kleurgrid array
var
i,j: integer;

begin
  for i:=0 to 6 do
    begin
      for j:=0 to 6 do
        begin
          if veld[i,j] = 1 then
            begin
              kleurgrid[i,j].kleur:=clblack;  //muurkleur
            end
          else if veld[i,j] = 2 then
            begin
              kleurgrid[i,j].kleur:=clblue;    //player kleur
            end
          else if veld[i,j] = 3 then
            begin
              kleurgrid[i,j].kleur:=clred;     //cpu kleur
            end
          else
            begin
              kleurgrid[i,j].kleur := clwhite;  //toegankelijk vakje
            end;

        end;
    end;
end;


Ik wil nu dat ik de procedure vulkleuren kan aanvullen door er

Delphi:
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
procedure vulkleuren(arraymetcijfers: tveld;arraymetkleuren: tkleur);
var
i,j: integer;
begin
  for i:=0 to 6 do
    begin
      for j:=0 to 6 do
        begin
          if arraymetcijfers[i,j] = 1 then
            begin
              arraymetkleuren[i,j].kleur:=clblack;
            end
          else if arraymetcijfers[i,j] = 2 then
            begin
              arraymetkleuren[i,j].kleur:=clblue;    //player kleur
            end
          else if arraymetcijfers[i,j] = 3 then
            begin
              arraymetkleuren[i,j].kleur:=clred;     //pc kleur
            end
          else
            begin
              arraymetkleuren[i,j].kleur := clwhite;  //toegankelijk vakje
            end;

        end;
    end;
end;


van te maken.

Die dan deze omzetten doet dus onafhankelijk van wat er staat voor kleurgrid of veld als arrays. Nu dacht ik dat ik dat wel kon, maar het lukt niet.

maar bij regel:

Delphi:
1
  arraymetkleuren[i,j].kleur:=clblack;


krijg ik: [Error] Unit1.pas(98): Array type required

En
Delphi:
1
vulkleuren(veld,kleurgrid); 

geeft:

[Error] Unit1.pas(155): Incompatible types: 'Tkleur' and 'Array'

Het probleem is dat gedoe met tkleur, want als ik er gewoon alleen vulkleuren(arraymetcijfers: tveld) van maak doet hij het wel. Hrm.

P.S. Kan iemand ook uitleggen waarom een record gebruikt wordt voor kleur? Ik snap dit namelijk niet. Ja ik ben beginner.

  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

een color zal (vermoed ik) van het ordinale type zijn.
(wat voor type zijn de variabelen van het type Tcolor ?)

[ Voor 35% gewijzigd door Brothar op 18-08-2003 20:45 ]

eagle


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
uhm die vraag snap ik niet echt. Tcolor is toch een delphi eigen type of niet?
Als ik kijk naar de inhoud van die array tkleur dan zie ik getallen van 0 tot 16 miljoen voor de waarden van wit en zwart respectievelijk.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Je moet goed in de gaten houden dat een Tkleur iets anders ie dan een array[] of Tkleur

Dus vulkleuren(veld, kleurgrid) gaat alvast niet werken omdat je vulkleuren als volgt hebt gedefinieerd
Delphi:
1
procedure vulkleuren(arraymetcijfers: tveld;arraymetkleuren: tkleur);

en je geeft als parameter een
Delphi:
1
array [0..6,0..6] of Tkleur;

mee. Een record is ook zeer zeker niet hetzelfde als een array!

Misschien eens opzoek naar een goed Delphi boek of tutorial waarin het 1 en ander staat uigelegd over variabelen, types en records?

[ Voor 14% gewijzigd door Creepy op 18-08-2003 21:05 ]

"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


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Ik heb een record altijd gecodeerd als een array waarbij je zelf de rij en kolom namen kon ingeven. Maar blijkbaar klopt dat niet.

Heb hier het boek voor me.

A Record is a user-defined data type that encapsulates a group of related data. A record contains information in one or more fields.

An array is a set of sequentially indexed elements of the same intrinsic data type.

Verwijderd

Zoals Creepy al zij, een record is niet hetzelfde als een array.
Je zult of een TKleurArray type moeten definieren die je als parameter aan VulKleuren meegeeft, of die arraymetkleuren public/protected/private definieren zodat VulKleuren er direct bij kan. Maar dat laatste is nou niet een toonbeeld van netjes programmeren.

TKleurArray dus. :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

REDFISH schreef op 18 August 2003 @ 21:22:
A Record is a user-defined data type that encapsulates a group of related data. A record contains information in one or more fields.

An array is a set of sequentially indexed elements of the same intrinsic data type.
En hierdoor interpreteer je een record als een array? Als je ja antwoord moet je eens gaan kijken naar een boek in je moerstaal ;)

"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


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Nou ja, ik heb het omgeschreven naar dit:

Met dank aan iemand anders.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  TVeld = array[0..6, 0..6] of Integer;
  TKleurGrid = array[0..6, 0..6] of TColor;
 
const
  VeldKleuren: array[0..3] of TColor = (clWhite, clBlack, clBlue, clRed);


var kleurgrid : Tkleurgrid;

//en 

procedure VulKleuren(AKleurGrid: TKleurGrid;AVeld: TVeld);
var
  x, y: Integer;
begin
  for x := 0 to 6 do
    for y := 0 to 6 do
      AKleurGrid[x,y] := VeldKleuren[AVeld[x,y]];
end;


Het vreemde is nu alleen dat als ik hem aanspreek met
Delphi:
1
vulkleuren(kleurgrid,veld]. 

dat kleurgrid 000000 blijft bevatten

Doe ik echter
Delphi:
1
2
3
4
5
6
7
8
9
Procedure vulkleuren;
var
x,y: integer;
begin
  for x := 0 to 6 do

    for y := 0 to 6 do
      KleurGrid[x,y] := VeldKleuren[Veld[x,y]];
end;

Dan vult hij hem wel

any ideas?

@ creepy :

Arrays en records zijn structuren die gekenmerkt worden door de aanwezigheid van een markering binnen de eenheid en een waarde die bij bepaalde markering hoort. Deze waarden moeten in een array altijd van hetzelfde gegevenstype zijn. In een record hoeft dat niet. De array is bedoeld om grote aantallen van hetzelfde type gegevens te verzamelen in een geheel. De record is bedoeld om diverse type gegevens die logisch gezien bij elkaar horen vast te leggen in een geheel.

Ik vind het gewoon een array. :P Of zeg jij het naadje van de kous maar es.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

REDFISH schreef op 18 augustus 2003 @ 23:25:
Nou ja, ik heb het omgeschreven naar dit:

Met dank aan iemand anders.

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  TVeld = array[0..6, 0..6] of Integer;
  TKleurGrid = array[0..6, 0..6] of TColor;
 
const
  VeldKleuren: array[0..3] of TColor = (clWhite, clBlack, clBlue, clRed);


var kleurgrid : Tkleurgrid;

//en 

procedure VulKleuren(AKleurGrid: TKleurGrid;AVeld: TVeld);
var
  x, y: Integer;
begin
  for x := 0 to 6 do
    for y := 0 to 6 do
      AKleurGrid[x,y] := VeldKleuren[AVeld[x,y]];
end;


Het vreemde is nu alleen dat als ik hem aanspreek met
Delphi:
1
vulkleuren(kleurgrid,veld]. 

dat kleurgrid 000000 blijft bevatten

Doe ik echter
Delphi:
1
2
3
4
5
6
7
8
9
Procedure vulkleuren;
var
x,y: integer;
begin
  for x := 0 to 6 do

    for y := 0 to 6 do
      KleurGrid[x,y] := VeldKleuren[Veld[x,y]];
end;

Dan vult hij hem wel

any ideas?
In het eerste geval geef je in de procedure waardes aan de elementen van de locale variabele AKleurGrid. Deze variabele is alleen binnen de procedure bekend; Delphi maakt automatisch een locale kopie van de variabele die aan de procedure wordt doorgegeven. Daarna bewerk je in de procedure de kopie, niet het origineel. Zodra de procedure verlaten wordt, is de variabele ´out of scope´ (zie Delphi Help), wat effectief betekent dat de variabele dan onbekend is. Je past echter nooit de globale variabele KleurGrid aan.

In het tweede geval pas je de globale variabele aan, waardoor alles werkt zoals jij wilt.

Probeer achtereenvolgens maar de volgende proceduredeclaraties:

Delphi:
1
2
3
4
5
6
7
8
procedure VulKleuren(AKleurGrid: TKleurGrid; AVeld: TVeld);
[...]

procedure VulKleuren(var AKleurGrid: TKleurGrid; AVeld: TVeld);
[...]

procedure VulKleuren(const AKleurGrid: TKleurGrid; AVeld: TVeld);
[...]
Je zult zien dat er een verschil is. Dit is een fundamenteel verschil dat je in vrijwel iedere programmeertaal tegenkomt en je kunt er het beste een boek of online reference bijpakken om de nuances te leren.

Een goede grap mag vrienden kosten.


  • Brothar
  • Registratie: Oktober 2000
  • Laatst online: 04-02 09:14

Brothar

meester

Please Tomatoman,
Geef voor mij eens het verschil aan.
Het enige wat ik zie, is dat AKleurGrid en AVeld bij de declaraties lokale variabelen voor de procedure zijn. Ik vermoed dat alleen bij de 2de declaratie sprake is van een waarde die wordt "teruggegeven" aan de procedure-aanroep.

(Je stuurt inderdaad iemand verder het Delphi-bos in ! :))

[ Voor 12% gewijzigd door Brothar op 19-08-2003 00:33 ]

eagle


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Brothar schreef op 19 August 2003 @ 00:31:
Please Tomatoman,
Geef voor mij eens het verschil aan.
Het enige wat ik zie, is dat AKleurGrid en AVeld bij de declaraties lokale variabelen voor de procedure zijn. Ik vermoed dat alleen bij de 2de declaratie sprake is van een waarde die wordt "teruggegeven" aan de procedure-aanroep.

(Je stuurt inderdaad iemand verder het Delphi-bos in ! :))
Het verschil zit hem in de var en const bij de declaratie van de procedures. Ook dit verschil staat net als het verschil tussen record en array uitgelegd in een beetje Delphi boek of tutorial.

En waarom ik een record geen array vind is vrij makkelijk aan de syntax te zien. Bij een record gebruik je geen [], bij een array wel. Een array kan ook @runtime van grootte worden aangepast, een record niet. Delphi ondersteunt geen associative array's, en een record is hier ook geen vervanging voor aangezien je bijv. niet @ runtime items kan toevoegen aan een record, en aan een (dynamische) array wel. Een record heeft ook nog zoiets leuks als een variant deel (zoek dit maar op in je Delphi boek ;) ). Dat is ook weer iets wat met een array ook niet mogelijk is.
Mijn conclusie: verschillen genoeg, dus noem een record een record, en een array een array ;)

"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

Pagina: 1