Zabawa z sygnalizacją

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.

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ę.

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 ;)

0

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

0

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

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.

0

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

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

0

Dzięki Wam obu ;)

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?

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.

0

To jest tak skonstruowane, że ma być możliwość symulacji różnych typów - typowa dla przejścia(||, | i --|--) :)
Ikonka jest 32x32. A ma być default? Usuwałem wyregenerowany plik, budowałem na nowo i nadal problem.
{$R *.res}? nie czasem {$R *.dfm}?
Plik próbowałem umieścić w poprzednim poście, w tym też, ale się nie udało(nieobsługiwany typ "Typ "application/octet-stream" tego pliku nie jest akceptowany").
PS Idzie jakoś skrócić mój kod?
PS2 Idzie robić migające kolory trwające np. 1 sek?(do sygnalizacji pieszej)

0

Ikonka jest 32x32. A ma być default? Usuwałem wyregenerowany plik, budowałem na nowo i nadal problem. {$R *.res}? nie czasem {$R *.dfm}?

Default jest dla domyślnych opcji dla nowego projektu i chyba nie uwzględnia to ikonki. A i pomyśl logicznie *.dfm to pliki formatek czyli jak robisz w VCL i nie tworzysz ich dynamicznie tylko masz dodane w projekcie to jest dlatego DFM, natomiast ikonkę masz w pliku zasobów RES i ma ten wpis być w pliku PROJEKTU przełacz się na niego Ctrl + F12 i sprawdź czy masz ten wpis. Najlepiej sprawdź na jakimś nowym - pustym projekcie czy ikonę możesz zmieniać, bo nie spotkałem się aby był z tym problem pod Delphi 7.

Plik próbowałem umieścić w poprzednim poście, w tym też, ale się nie udało(nieobsługiwany typ "Typ "application/octet-stream" tego pliku nie jest akceptowany").

Może exeków nie mozna, trzeba było chociaż go zzipować.

PS Idzie jakoś skrócić mój kod?

Dołącz cały zarchiwizowany kod, to może ktoś wymyśli coś o ile da się ten kod zoptymalizować.

PS2 Idzie robić migające kolory trwające np. 1 sek?(do sygnalizacji pieszej)

W wątku albo Timerze można zmieniać kolor z koloru tła sygnalizatora na właściwy. Czyli na przykład z czarnego na zielony i odwrótnie. Jeżeli odstęp między mignięciami ma być mniejszy niż 100 ms lepiej robić to w wątku. Informacje o wątkach są w artykule na 4p oraz mnóstwie stron do znalezienia w google. Zarowno w ich używaniu pod VCL jak i czystym WinAPI.

0

Ok, jest ten {$R *.res}.
Ikonę na nowym projekcie zmieniłem bez problemu. Przy starym nawet przy wybraniu innej ikonki ta Delphiowska się nie zmienia.

0

To nie wiem, usuń wszystkie *.dcu oraz plik zasobów z katalogu projektu i spróbuj ponownie.

0

Usunąłem i nadal...
W załączniku paczka.

0

Źłe formatujesz kod i nie dołączasz źródła jak trzeba. Po co plik tekstowy ze źródłem. Najlepiej usunąc *.dcu, a resztę plików dółaczyć tak aby sprawdzający miał jak najmniej kombinacji, tylko odpalił IDE i mógł od razu sprawdzić co i jak. W Twój kod nie zagłebiałem się, tylko go przeformatowałem po ludzku i dodałem ikonę bez żadnego problemu. W pliku symulacja_sygnalizacji.rar masz moją symulacje, ja zrobiłem to z jednym przejściem i ogólną sygnalizacją dla samochodów. Poza tym widzę, że popełniasz szkolny bład, po co cztery Timery i cztery komponenty które ukrywasz. Twórz je dynamicznie jako obiekty i usuwaj w razie potrzeby dynamicznie. Jak już coś kodzić to z głową i porządnie. U mnie w kodzie może nie jest to idealne, ale oparte wszystko na uniwersalnych w miarę możłiwości klasach. A i nazwy plików przekonwertowałem na małe litery na szybko, bo na ogół jak coś tworzę to nazwy katalogów mają być z samych wielkich liter, natomiast pliki w podkatalogu raczej całe z małych. Wyjątek robię tylko dla trzymanych osobno mp3'ek oraz dokumentów czy arkuszy od pakietu OpenOffice'a. Takie moje przyzwyczajenie :)

0

4 Timery dawałem dla rozdzielenia kodu, ale i tak planowałem je ściaśnić w 2 ;) Jutro jeszcze się tym pobawię. Ja siętylko nadal zastanawiam, czemu tej ikonki nie umiem dodać...

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