Zabawa z sygnalizacją

2011-10-14 11:28
0

Robię symulację sygnalizacji świetlnej.
Mam teraz problem, ponieważ, chcę zrobić przejścia, które się pojawiają, jeśli w checkboxie jest zaznaczona opcja i sygnalizator istnieje.
Problem polega na tym, że:

  • mimo, że opcja jest zaznaczona, po dodaniu sygnalizatora nie pojawia się przejście.
  • po usunięciu sygnalizatora przejście zostaje.
  • po wyłączeniu opcji sygnalizacji dla pieszych ona nie znika

Problem nie dotyczy sygnalizatora z numerem jeden, ponieważ on zawsze istnieje.
Kod, którym próbuję coś zdziałać:

procedure TSygnalizacja.przejsciaClick(Sender: TObject);
begin
  przramka1.Visible:= not przramka1.Visible;
  przczerwone1.Visible:= not przczerwone1.Visible;
  przzielone1.Visible:= not przzielone1.Visible;

  if (a>=2) then
  begin
    przramka2.Visible:= True;
    przczerwone2.Visible:= True;
    przzielone2.Visible:= True;
  end;

  if (a>=3) then
  begin
    przramka3.Visible:= True;
    przczerwone3.Visible:= True;
    przzielone3.Visible:= True;
  end;

  if (a>=4) then
  begin
    przramka4.Visible:= True;
    przczerwone4.Visible:= True;
    przzielone4.Visible:= True;
  end;

  if (a<4) then
  begin
    przramka4.Visible:= False;
    przczerwone4.Visible:= False;
    przzielone4.Visible:= False;
  end;

  if (a<3) or (ramka3.Visible=False) then
  begin
    przramka3.Visible:= False;
    przczerwone3.Visible:= False;
    przzielone3.Visible:= False;
  end;

  if (a<2) then
  begin
    przramka2.Visible:= False;
    przczerwone2.Visible:= False;
    przzielone2.Visible:= False;
  end;
end;

gdzie:
a - ilość sygnalizacji normalnych
przramka - przejście ramka
przczerwone - czerwone światło
przzielone - zielone światło.

Proszę o pomoc.

PS W a<3 jest testowy kod, który też nie działa.

@EDIT: 13:58 Sygnalizację dla pieszych idzie wyłączyć tylko, jeśli jest jeden sygnalizator.

edytowany 2x, ostatnio: OldShaterhan, 2011-10-14 14:31

Pozostało 580 znaków

2011-10-15 19:52
0

Weż najlepiej zarchiwizuj cały swój kod tego projektu wraz z exekiem i dołacz do tego posta, bo nie wiemy jak ustawiasz to a. Mi się taki kod na sucho źle analizuje, bo nie wiem co chcesz osiągnąc. Wspominasz o jakims CheckBoxie, a tutaj masz klikanie w przycisk, który do końca nie wiem czy rozumiem co ma robić. Najlepiej również zamiast zmiennej a ustawiać sobie odpowiednio Tag tego przycisku w który klikasz i go później porównywać. Jak będziemy mieli kod to ktoś może coś poradzi, bo swój post napisałeś dawno i nikt nie odpowiedział, a ja też nie mam obecnie tyle wolnego czasu co wcześniej, ale jeżeli odpowiesz jeszcze dzisiaj to może do jutra coś poradzę.


edytowany 1x, ostatnio: olesio, 2011-10-15 19:53

Pozostało 580 znaków

2011-10-15 20:03
0

Pomyliły mi się nazwy - oczywiście chodzi o CheckBoxa. Przypuszczalnie wystarczyłby mi kod, który sprawdza czy CheckBox jest zaznaczony i wówczas zastosować go na zasadzie:

begin
if (a<2) and (checkbox jest zaznaczony) then
przramka.Visible:=True;
else
przramka.Visible:=False;

Jak to nie zadziała, to wówczas poproszę Was o dalszą pomoc ;)

edytowany 1x, ostatnio: OldShaterhan, 2011-10-15 20:11

Pozostało 580 znaków

2011-10-15 20:25
0

Sprawdzić czy CheckBox jest zaznaczony to mega banał. CheckBox posiada własnośc Checked.


Pozostało 580 znaków

2011-10-15 20:30
0

Czyli jak ma sprawdzić? Wiem, głupi jestem xD

edytowany 1x, ostatnio: OldShaterhan, 2011-10-15 20:31

Pozostało 580 znaków

2011-10-15 20:43
0

Ech - if'em, lub przez Visible := Costam.Checked. Przecież Checked to własnośc typu boolean. Jak nie ogarniasz takich podstaw, polecam napierw lekturę jakiś kursów z podstawami. Może być Kompendium Delphi na stronie 4p.


Pozostało 580 znaków

2011-10-15 20:49
0

If'em będzie lepiej. Proszę tylko ten jeden kod. Jak nie zadziała, to zobaczymy ;)

Pozostało 580 znaków

2011-10-15 21:28
0

Przyznam szczerze, że widziałem wcześniej Twój post, ale zupełnie nie mogłem się domyśleć, o co Ci chodzi. Dałem więc sobie spokój. Na Twoje szczęście jest olesio, który odpisał. Nie sądzę, aby komuś innemu się chciało.

Teraz, kiedy już wiadomo, jaki jest problem, to odpowiedź jest wręcz banalna. Jeżeli chodzi o ten kod:

if (a<2) and (checkbox jest zaznaczony) then
przramka.Visible:=True;
else
przramka.Visible:=False;

to trzeba napisać tak:

PrzRamka.Visible:= (a < 2) and CheckBox.Checked;

PS. Podziękowania należą się olesiowi

Pozostało 580 znaków

2011-10-15 21:33
0

Dzięki Wam obu ;)

Pozostało 580 znaków

2011-10-15 22:08
0

Prawie działało, jednak pozostawał jeden problem. Mianowicie, jeśli usunąłem jeden sygnalizator to przejście na niego zostaje ;) I chciałem, żeby się dodawały "na żywo".
Zmieniłem kod na:

procedure TSygnalizacja.il_kierChange(Sender: TObject);
begin
  a:= il_kier.Value;

[...]

  if (a>=2) and przejscia.Checked then
  begin
    przramka2.Visible:= True;
    przczerwone2.Visible:= True;
    przzielone2.Visible:= True;
  end;
  if (a>=3) and przejscia.Checked then
  begin
    przramka3.Visible:= True;
    przczerwone3.Visible:= True;
    przzielone3.Visible:= True;
  end;
  if (a=4) and przejscia.Checked then
  begin
    przramka4.Visible:= True;
    przczerwone4.Visible:= True;
    przzielone4.Visible:= True;
  end;

  if (a<2) or not przejscia.Checked then
  begin
    przramka2.Visible:=False;
    przczerwone2.Visible:=False;
    przzielone2.Visible:=False;
  end;
  if (a<3) or not przejscia.Checked then
  begin
    przramka3.Visible:=False;
    przczerwone3.Visible:=False;
    przzielone3.Visible:=False;
  end;
  if (a<4) or not przejscia.Checked then
  begin
    przramka4.Visible:=False;
    przczerwone4.Visible:=False;
    przzielone4.Visible:=False;
  end;
end;

procedure TSygnalizacja.przejsciaClick(Sender: TObject);
begin
  przramka1.Visible:= not przramka1.Visible;
  przczerwone1.Visible:= not przczerwone1.Visible;
  przzielone1.Visible:= not przzielone1.Visible;

  if (a>=2) and przejscia.Checked then
    begin
    przramka2.Visible:= True;
    przczerwone2.Visible:= True;
    przzielone2.Visible:= True;
  end;
  if (a>=3) and przejscia.Checked then
  begin
    przramka3.Visible:= True;
    przczerwone3.Visible:= True;
    przzielone3.Visible:= True;
  end;
  if (a=4) and przejscia.Checked then
  begin
    przramka4.Visible:= True;
    przczerwone4.Visible:= True;
    przzielone4.Visible:= True;
  end;

  if (a<2) or not przejscia.Checked then
  begin
    przramka2.Visible:=False;
    przczerwone2.Visible:=False;
    przzielone2.Visible:=False;
  end;
  if (a<3) or not przejscia.Checked then
  begin
    przramka3.Visible:=False;
    przczerwone3.Visible:=False;
    przzielone3.Visible:=False;
  end;
  if (a<4) or not przejscia.Checked then
  begin
    przramka4.Visible:=False;
    przczerwone4.Visible:=False;
    przzielone4.Visible:=False;
  end;
end;

i działa znakomicie ;) Wcześniej miałem problem, że nie przyjmowało przejscia.Checked bo nie wiedziało o co chodzi ;)
Dzięki za wszelką pomoc.
Plik exe: http://www.wrzuc.to/KsyA9pI5L.wt (przejścia jeszcze nie zmieniają kolorów, zostanie dodane w wersji 0.2)

PS Zmieniłem plik ikony, ale po kompilacji się nie pojawia, czemu?

edytowany 1x, ostatnio: OldShaterhan, 2011-10-15 22:10

Pozostało 580 znaków

2011-10-15 22:21
0

Ale prawdziwa sygnalizacja nie wygasa całkowicie, chyba że jest uszkodzona. O ile to tylko testowy program. Polecam pamiętać o zablokowaniu przycisku maksymalizacji oraz o ustawieniu BorderStyle na bsSingle, jeżeli rozmiar okna ma być niezmieniony. Co do ikonki standardową 32x32 piksele powinno łyknąc jak dodasz ją w opcjach projektu. Zapisz cały projekt, rebuildnij go, a wcześniej upewnij się, że w pliku projektu masz przed begin taki wpis {$R *.res}. Natomiast co do umieszczenia pliku. Jeżeli rozmiar jest do jednego megabajta to śmiało możesz dołaczyć go do posta, będąc zarejestrowanym użytkonikiem na tym forum. Zawsze później plik możesz podmienić na nowszą wersję, a link nie wygaśnie, nie ma upierdliwego czekania jak na wielu nawet prostych hostingach, a poza tym zawsze będziesz wiedział jakie jest zainteresowanie Twoim plikiem, czyli ile osób go pobrało.


Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0