Avatar billede gangsta12dk Nybegynder
12. april 2005 - 16:34 Der er 12 kommentarer og
1 løsning

Random farve til shape??

Hej, jeg har fire shape ( ShapeA, ShapeB, ShapeC og ShapeD) på min form. Jeg vil gerne have at når man starter programmet skal hver af de fire shape få et tilfældigt farve ud af disse 8 farver (clRed, clBlue, clGreen, clYellow, clSilver, clFuchsia, clAqua og clBlack).

På forhånd tak.
Avatar billede kroning Nybegynder
12. april 2005 - 17:10 #1
procedure TForm1.FormCreate(Sender: TObject);
const
StartColors : array(.0..7.) of TColor =(clRed, clBlue, clGreen, clYellow, clSilver, clFuchsia, clAqua, clBlack);
begin
Randomize;
ShapeA.Brush.Color:=StartColors[Random(8)];
ShapeB.Brush.Color:=StartColors[Random(8)];
ShapeC.Brush.Color:=StartColors[Random(8)];
ShapeD.Brush.Color:=StartColors[Random(8)];
end;
Avatar billede gangsta12dk Nybegynder
12. april 2005 - 17:51 #2
Tak for hjælpen. Send et svar så du kan få dine point.
Avatar billede gangsta12dk Nybegynder
12. april 2005 - 18:02 #3
kroning>> Kunne man lave det på en måde så f.eks. de samme farver ikke går igen i to eller flere shapes.

Eks. Hvis ShapeA får farven clRed, så må shapeB, Shape C og Shape D ikke få den farve osv.

PÅ forhånd tak
Avatar billede kroning Nybegynder
12. april 2005 - 18:12 #4
Ja men så skal der lidt mere kode til, noget i denne stil:

procedure TForm1.FormCreate(Sender: TObject);
const
StartColors : array(.0..7.) of TColor =(clRed, clBlue, clGreen, clYellow, clSilver, clFuchsia, clAqua, clBlack);
var
ColorsLeft : array of TColor;

function GetColor : TColor;
var
i : integer;
begin
i:=Random(Length(ColorsLeft));
Result:=ColorsLeft[i];
  if i+1<Length(ColorsLeft) then
    Move(ColorsLeft[i+1],ColorsLeft[i],(Length(ColorsLeft)-i-1) * SizeOf(TColor));

  SetLength(ColorsLeft,Length(ColorsLeft)-1);
end;

begin
SetLength(ColorsLeft,Length(StartColors));
Move(StartColors,ColorsLeft[0],SizeOf(StartColors));
Randomize;
ShapeA.Brush.Color:=GetColor;
  ShapeB.Brush.Color:=GetColor;
  ShapeC.Brush.Color:=GetColor;
  ShapeD.Brush.Color:=GetColor;
end;
Avatar billede gangsta12dk Nybegynder
12. april 2005 - 19:08 #5
kroning>> Tak for hjælpen.

Din kode virker, men jeg må desværre sige at jeg ikke forstår hvorfor den virker :(

Hvis du er så venlig, at ville skrive hvad hver eneste sætning gør, så vil jeg være dig meget taknemlig og  samtidig belønne det med ekstra point ( hvor mange point vil du have for det "ekstra arbejde" :D )?

På forhånd tak.
Avatar billede kroning Nybegynder
13. april 2005 - 00:48 #6
Her er en enklere og bedre løsning, sig til hvis du stadig vil have en forklaring, det gør jeg gerne og det skal jeg self. ikke have ekstra point for.

BEMÆRK: Jeg er ikke hjemme i øjeblikket så koden er skrevet i notepad og derfor utestet.

procedure TForm1.FormCreate(Sender: TObject);
const
StartColors : array(.0..7.) of TColor =(clRed, clBlue, clGreen, clYellow, clSilver, clFuchsia, clAqua, clBlack);
var
ColorsLeft : integer;

function GetColor : TColor;
var
i : integer;
begin
i:=Random(ColorsLeft);
Result:=ColorsLeft[i];
StartColors[i]:=StartColors[ColorsLeft-1];
Dec(ColorsLeft);   
end;

begin
ColorsLeft:=Length(StartColors);
Randomize;
ShapeA.Brush.Color:=GetColor;
ShapeB.Brush.Color:=GetColor;
ShapeC.Brush.Color:=GetColor;
ShapeD.Brush.Color:=GetColor;
end;
Avatar billede kroning Nybegynder
13. april 2005 - 00:55 #7
Jaja, har allerede selv fundet en fejl.
Linien Result:=ColorsLeft[i]; skal være Result:=StartColors[i];
Avatar billede gangsta12dk Nybegynder
13. april 2005 - 10:32 #8
Tak for hjælpen. Jeg vil stadig give ekstra point for din hjælp, hvis du ønsker det, men midlertidig har jeg sat et godt ord for dig i dit karma ;)
Avatar billede gangsta12dk Nybegynder
13. april 2005 - 11:03 #9
Hej jeg har lige fundet en lille fejl i den kode du lige har skrevet:

StartColors[i]:=StartColors[ColorsLeft-1];  // en variabel kan ikke sættes lige med en konstant

Jeg har fundet en metode til at løse den del af fejlen.

Jeg bruger bare "slavemetoden" og skriver hvilke farve hver konstant har.

Eks.
  StartColors [0]:=clRed; StartColors [1]:=clBlue; StartColors [2]:=clGreen;
  StartColors [3]:=clYellow; StartColors [4]:=clSilver; StartColors [5]:=clFuchsia;
  StartColors [6]:=clAqua; StartColors [7]:=clLime;
Avatar billede kroning Nybegynder
13. april 2005 - 18:29 #10
I stedet for "slavemetoden" kunne man også bare flytte StartColors ud af FormCreate sådan:

var
StartColors : array(.0..7.) of TColor =(clRed, clBlue, clGreen, clYellow, clSilver, clFuchsia, clAqua, clBlack);

procedure TForm1.FormCreate(Sender: TObject);
var
ColorsLeft : integer;
.
.
Avatar billede gangsta12dk Nybegynder
18. april 2005 - 17:48 #11
Ja, nu virker programmet efter din kode, men de 4 shape får ikke hver forskellig farve. Det sker ofte at 2 eller 3 ud af de 4 shape får samme farve :D
Avatar billede kroning Nybegynder
18. april 2005 - 18:09 #12
Mystisk, det checker jeg når jeg kommer hjem i morgen.
Avatar billede kroning Nybegynder
19. april 2005 - 07:51 #13
Nu har jeg prøvet mange mange gange (læs: 1 million gange) og har ikke oplevet at de får samme farve.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester