Avatar billede hawk88 Nybegynder
28. maj 2008 - 14:10 Der er 3 kommentarer

Lave trafiklys (windows app)

Hey

Har endnu en gang brug for jeres hjælp, skal have lavet en windows app. hvor der er tre bokse med rød, gul, grøn også en knap der kan gøre så den først bliver grøn med første tryk og på det andet tryk gul og sidste rød, og det skal den så kunne fortsætte med, hvis nogen bare kan give mig et godt hint eller lignende, ved ikke lige hvordan jeg skal bære mig ad.
Avatar billede bvli Praktikant
28. maj 2008 - 14:40 #1
Hej.

Prøv først at tænke dig en klasse der repræsenterer selve trafiklyset. Tænk over hvordan det skal _opføre_ sig, og hvordan det skal _se ud_.

F.eks. hvis man kalder en metode (Shift()?), så skal lyset skifte fra en (eller flere) farve(r) til en anden, alt efter hvordan status er. Er lyset rødt, og metoden Shift kaldes, skal den gule lampe også tændes. Er Lyset rødt/gult og metoden shift kaldes, skal den røde og gule slukkes og den grønne tændes. Osv.

Nu kan vi så se, at selve signalet kan have 4 status. rødt, rødt/gult, grønt, gult. (en oplagt mulighed til en enum - som man evt. kunne udstille som en readonly property) :)

Hvordan skal det så se ud? Tjoeh.. Du kunne starte med at nedarve fra klassen Control. Så har du en masse basisfunktionalitet for selve kontrollen. Så kan du jo overveje om det skal være horisontalt eller vertikalt. (Eller om det skal kunne indstilles separat) Del højden op i tre dele. Den øverste tredjedel bruger du til at tegne en rød fyldt cirkel i, den midterste til at tegne en gul fyldt cirkel i og den sidste nederste tredjedel til at tegne en grøn fyldt cirkel i. Alt efter hvordan status i signalet er (som du jo ved ud fra den property vi talte om ovenfor), tegner du de cirkler du skal i den override'de OnPaint(..) metode.

Ok - nu skulle du vist have nok til at komme i gang? Ellers må du lige prøve at skrive, hvad du behøver mere.

/B :)
Avatar billede hawk88 Nybegynder
28. maj 2008 - 17:15 #2
Mange tak for forklaringen, meget af det er jeg med på, men er ikke ligefrem en haj til c#, så er nok nød til at se noget kode for at kunne forstå sammenhængen.

Kan det ikke gøres simplere?
Avatar billede bvli Praktikant
29. maj 2008 - 01:02 #3
Her har jeg prøvet at lave et hurtigt eksempel. Jeg tror ikke du finder det meget simplere :)

En enum TrafficLightStatus som bruges til at beskrive status på trafiklyset.
En klasse TrafficLight, som repræsenterer et trafiklys.
En klasse TestForm som bruges til at teste TrafficLight-kontrollen.

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace B.Testing {

  public enum TrafficLightStatus {
    Red,
    RedYellow,
    Green,
    Yellow
  }

  public class TrafficLight : Control {
     
    private TrafficLightStatus status;
 
    public TrafficLightStatus Status {
      get { return status; }
    }

    public void Shift() {
      if (status == TrafficLightStatus.Yellow) {
        status = TrafficLightStatus.Red;
      } else {
        status++;
      }
      Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e) {
      base.OnPaint(e);
      ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, SystemColors.ControlDark, ButtonBorderStyle.Dotted);
      if (status == TrafficLightStatus.Red || status == TrafficLightStatus.RedYellow) {
        DrawRedLight(e.Graphics);
      }
      if (status == TrafficLightStatus.Yellow || status == TrafficLightStatus.RedYellow) {
        DrawYellowLight(e.Graphics);
      }
      if (status == TrafficLightStatus.Green) {
        DrawGreenLight(e.Graphics);
      }
    }

    private void DrawGreenLight(Graphics g) {
      float height = ClientRectangle.Height / 3;
      RectangleF r = new RectangleF(ClientRectangle.X, ClientRectangle.Y + height * 2, Width, height);
      g.FillEllipse(Brushes.Green, r);
    }

    private void DrawYellowLight(Graphics g) {
      float height = ClientRectangle.Height / 3;
      RectangleF r = new RectangleF(ClientRectangle.X, ClientRectangle.Y + height, Width, height);
      g.FillEllipse(Brushes.Yellow, r);
    }

    private void DrawRedLight(Graphics g) {
      float height = ClientRectangle.Height / 3;
      RectangleF r = new RectangleF(ClientRectangle.X, ClientRectangle.Y, Width, height);
      g.FillEllipse(Brushes.Red, r);
    }
  }

  public class TestForm : Form {
 
    private TrafficLight trafficLight = new TrafficLight();
    private Button button = new Button();

    public TestForm() {
      trafficLight.Size = new Size(75, 220);
      button.Location = new Point(100, 10);
      button.Text = "&Shift";
      button.Click += delegate { trafficLight.Shift(); };
 
      Controls.Add(trafficLight);
      Controls.Add(button);
    }

    public static void Main() {
      Application.Run(new TestForm());
    }
  }
}


/B :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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