Avatar billede tuctoh Nybegynder
31. december 2003 - 14:52 Der er 23 kommentarer og
2 løsninger

Variabel i imagenavn

Jeg har 8*2 forskellige billeder, de hedder bit0on, bit0off, bit1on etc...
Jeg ville lave en procedure som tager bit-nummeret som parameter, og ændrer billederne ala:

bit0off.visible := false;
bit0on.visible := true;

Jeg ville gøre noget med
bit+bitnr+off.visible := false;
men det virker ikke... har i nogle forslag til hvordan jeg løser det?
Avatar billede tuctoh Nybegynder
31. december 2003 - 16:08 #1
proceduren jeg vil ændre er:

procedure TForm1.switch(Bitnr : Integer);
begin
    if readbit(bitnr) = 0 then
    begin
        WriteBit(bitnr,1);
        bit0off.visible := false;
        bit0on.visible := true;
    end
    else
    begin
        WriteBit(bitnr,0);
        bit0off.visible := true;
        bit0on.visible := false;
    end;
end;

så den viser det rigtige billede for den enkelte bit... i javascript kunne det gøres med noget eval(), men åbenbart ikke i delphi.
Bruger delhi 4 btw
Avatar billede leifj Nybegynder
31. december 2003 - 20:42 #2
Du kan styre dine billeder via en array of TImage.
Array indekset fortæller, hvilket billede, der er valgt, og du kan herefter via visible-propertien styre, om de skal være on eller off.
Avatar billede tuctoh Nybegynder
31. december 2003 - 21:49 #3
Ja, havde tænkt på et array... men hvordan erklæres det, hvor skrives det, hvordan navngives billederne i et array etc...?
Jeg er noob til delphi, så kender ikke syntaxten for det etc...

håber du kan hjælpe.
Avatar billede leifj Nybegynder
01. januar 2004 - 10:55 #4
Du kan evt. gøre således:

var
  Bits: array of TImage;
  Antal: Integer;

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;

begin
  Antal:=8;
  SetLength(Bits, Antal);
  for I:=1 to Antal do begin
    Bits[I]:=Timage.Create(Self); 
  end;
end;

Du kan herefter tildele værdier til de enkelte Bits[I]:

for I:=1 to Antal do begin
  Billedliste.GetBitmap(I,Bits[I].picture.bitmap);
  Bits[I].Visible:=True;
end;

I eksemplet ovenfor hentes billederne fra en TImageList ved navn Billedliste.

Når du er færdig med at bruge dine Bits[I], skal de fjernes:

for I:=1 to Antal do begin
  Bits[I].Destroy;
end;

håber, at det hjælper dig.
Avatar billede leifj Nybegynder
01. januar 2004 - 11:10 #5
Hov - i mit eksempel er der en lille fejl.
Længden af array er angivet forkert. Du skal erstatte
SetLength(Bits, Antal);
med
SetLength(Bits, Antal+1);
Avatar billede tuctoh Nybegynder
01. januar 2004 - 13:16 #6
Hej,

jeg kan godt se hvad det er din kode skal gøre, men er ikke helt med på hvordan det vil virke i praksis.
Jeg får hvert billede ind i sin egen aray (bit[x]). Hvordan styrer jeg placeringen af dette billede, og hvordan fortæller jeg hvilket billede der skal vises?

Håber du kan hjælpe med det også :)
tak!
Avatar billede leifj Nybegynder
01. januar 2004 - 15:01 #7
Jeg kan da forsøge.
Dine billeder gemmer du f.eks i Billedliste (TImageList). Hvis du nu vil have, at Bits[1] skal indeholde billede nr. 5 fra Billedliste, skriver du følgende:

Billedliste.GetBitmap(5,Bits[1].picture.bitmap);

Placering af Bits[1] kan du klare ved at angive Left og Top properties - f.eks:

Bits[1].Left:=150;
Bits[1].Top:=100;

Jeg håber, at det kan hjælpe dig, ellers må du lige spørge igen :)
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:04 #8
det kan jeg godt se... men hvordan vælger jeg billederne til min imagelist? Jeg kan ikke se nogen steder hvor det kan gøres :s
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:06 #9
ahh, man kan højreklikke på den! Smart.
Jeg kan dog kun se .bmp og .ico - kan man ikke få jpg billeder ind den vej (ville være nemmere, men det andet kan da også godt gøres).

Tak!!
Avatar billede leifj Nybegynder
01. januar 2004 - 15:16 #10
Hvis det altid ligger fast, at du skal bruge 8*2 billeder, er der ingen grund til at deklarere arrayen dynamisk. Nu kender jeg ikke dit program, men det vil måske være smart, at deklarere den i 2 dimensioner f. eks:

Bits: Array[1..8, 1..2] of TImage;

Du kan så bruge den ene dimension af billederne til "on" og den anden dimension til "off".

Når du deklarerer arrayen statisk, skal du ikke bruge linien startende med:

SetLength ...
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:18 #11
ok, det er nok smartere. Tak!
Arrays er nu noget anderledes end jeg er vandt til fra ASP :p

Roder lige lidt med de billeder, og vender tilbage når jeg ved om jeg kan hitte ud af det :)
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:28 #12
Det vil ikke som jeg vil :s

I min var har jeg:
billeder : array[0..7] of TImage;

jeg laver det i én dimension, da jeg vil ændre billedet, i stedet for at gøre et andet visible. Bits får fra 0 til 7.

I min form create har jeg:

    for i:=0 to 7 do
    begin
    billeder[i]:=Timage.Create(Self);
    end;
    billedliste.GetBitmap(0,billeder[1].picture.bitmap);
    billeder[1].Visible := True;
    billeder[1].Left := 50;
    billeder[1].top := 50;

i er en integer.
I min imagelist (som hedder billedliste) har jeg valgt to billedet... et on of et off (0 og 1).

Der er ikke nogen fejl - den viser bare ikke billedet.

Hvad gør jeg galt?
Avatar billede leifj Nybegynder
01. januar 2004 - 15:37 #13
Prøv

billeder[1].Visible:=False;

før linien

billedliste.GetBitmap(0,billeder[1].picture.bitmap);
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:39 #14
nop, hjælper ikke :(
Avatar billede leifj Nybegynder
01. januar 2004 - 15:43 #15
Prøv at anbringe koden i FormShow i stedet for FormCreate
Avatar billede leifj Nybegynder
01. januar 2004 - 15:46 #16
Du er sikker på, at du har anbragt et billede på position 0 i din billedliste ?
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:48 #17
procedure TForm1.FormShow(Sender: TObject);
var i : integer;
begin
    //initialiser billeder
    for i:=0 to 7 do
    begin
    billeder[i]:=Timage.Create(Self);
    billedliste.GetBitmap(0,billeder[i].picture.bitmap);
    billeder[i].Visible := True;
    billeder[i].Left := i*50;
    billeder[i].top := 200;
    end;
end;


giver ikke nogen forskel... 0 fejl, men heller ikke nogle billeder.
Og ja, har tjekket igen.. der er et billede som der skal være i den imagelist.
Avatar billede hrc Mester
01. januar 2004 - 15:51 #18
Er der ikke noget med at TImage skal have sat en Parent-propertyr til den form som den er tilknyttet? Det her virker hos mig, men det kan også være, det skyldes at jeg sætter TImagen til størrelsen på de billeder der ligger i listen (16x16)

var
  Image : TImage;
begin
  Image := TImage.Create(self);
  Image.Parent := self;
  Image.Left := 100;
  Image.Top := 120;
  Image.Width := 16;
  Image.Height := 16;

  ImageList1.GetBitmap(0,Image.Picture.Bitmap);
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:54 #19
der var den hrc! parent = self var det der skulle til :D

Tak!

Jeg arbejder lige lidt videre med det, og deler så points ud.
thanks :)
Avatar billede tuctoh Nybegynder
01. januar 2004 - 15:58 #20
ok, så har jeg NÆSTEN styr på det.
billedliste.GetBitmap(1,billeder[n].picture.bitmap);
skifter billedet... skærmen opdaterer bare ikke det billede med det samme.

Hvad kan man gøre for at billedet bliver opdateret? Det der sker er at den viser det samme billede, indtil jeg minimerer og åbner igen (=den opdaterer skærmbilledet).
Er der en smart metode at gøre det på? Smider lige 10 points mere ind.
Avatar billede hrc Mester
01. januar 2004 - 16:01 #21
I ovenstående mente jeg ikke en 'proper tyr', men derimod 'property' ;-)

Tror der var to fejl i det oprindelige eksempel fra tuctoh:

1. Manglende Parent (Ejeren er selve formen mens forældren er den komponent som billedet placeres på. I ovenstående er det formen, men det kan jo eksempelvis være et TPanel).

2. Størrelsen skal passe med det der er i en TImageList (ikke testet). Kunne automatisere det lidt:

Image.Width := ImageList1.Width;
Image.Height := ImageList1.Height;

I øvrigt:

Mener at TImage, som her oprettes i en procedure, vil blive frigivet korrekt, idet komponenten automatisk ryger ind i formens Controls-liste.
Avatar billede leifj Nybegynder
01. januar 2004 - 16:02 #22
Du skal lave den usynlig, skifte billedet og lave den synlig ige
Avatar billede tuctoh Nybegynder
01. januar 2004 - 16:06 #23
hrc, bredden var sat rigtigt :) Måske mere luck end noget andet :p

leifj, det havde du ret i! Nu viser den det jo rigtigt :D

leifj, du får 30 points (det oprindelige) og hrc får de sidste 10... i var begge en stor hjælp!
Jeg opretter et nyt spm. om lidt, som omhandler det samme (vil have en event når man klikker på de billeder, eller noget usynligt som ligger oven på), men det er nok lige lovligt langt væk fra topic.

Tak!
Avatar billede leifj Nybegynder
01. januar 2004 - 16:08 #24
Tak for points
Avatar billede hrc Mester
01. januar 2004 - 19:56 #25
Ditto thanks.
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