konto usunięte

Temat: Zagęszaczanie Jeżeli... Problem z programem do...

Witam,

Chciałem sobie zrobić prosty generator haseł. Korzystam z CheckBox.
Jeden dla małych liter,
drugi dla dużych liter
trzeci dla liczb
czwarty dla znaków specjalnych.
Struktura programu wygląda następująco
const
a = 'abcdefghijklmnopqrstuvwxyz';
b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
c = '0123456789';
d = '-+=!@#$%&()/.,?><[]{}\';

begin
len := SpinEdit1.Value;
edit1.Text := '';
Randomize;
begin
if checkbox1.checked then s:= a;
if checkbox2.checked then s:= b;
if checkbox3.checked then s:= c;
if checkbox4.checked then s:= d;
if checkbox1.checked and checkbox2.checked then s:= a+b;
if checkbox1.checked and checkbox3.checked then s:= a+c;
if checkbox1.checked and checkbox4.checked then s:= a+d;
if checkbox2.checked and checkbox3.checked then s:= b+c;
if checkbox2.checked and checkbox4.checked then s:= b+d;
if checkbox3.checked and checkbox4.checked then s:= c+d;
if checkbox1.checked and checkbox2.checked and checkbox3.checked then s:= a+b+c;
if checkbox1.checked and checkbox2.checked and checkbox4.checked then s:= a+b+d;
if checkbox2.checked and checkbox3.checked and checkbox4.checked then s:= b+c+d;
if checkbox1.checked and checkbox3.checked and checkbox4.checked then s:= a+c+d;
if checkbox1.checked and checkbox2.checked and checkbox3.checked and checkbox4.checked then s:= a+b+c+d;
else
begin
showMessage('błąd nie nic nie zaznaczono:)');
exit;
end;
edn;
end;
Randomize;
for i := 1 to len do
edit1.Text := edit1.Text + s[Random(Length(s))];


Wydawało mnie się że program działa, bo jako tako działa. Napisałem to najprościej jak to możliwe jest. Problem polega na tym że jak nic nie jest zaznaczone to się wykrzacza...
Czy idę dobrym torem czy muszę zacząć od nowa i zagęszczać funkcję jeżeli.

Z góry Wielkie Dzięki :)Ten post został edytowany przez Autora dnia 18.11.13 o godzinie 10:39

konto usunięte

Temat: Zagęszaczanie Jeżeli... Problem z programem do...

No można by się zastanawiać nad sensem stosowania tak dużej ilości ifów ewentualnego zagnieżdżania, zresztą z tego co mi wiadomo jest to uważane za antywzorzec. Kontrolki wizualne mają w Delphi taką właściwość Tag typu integer, która może się wydawać nieistotna ale pomocna w przypadkach gdy tego typu checkboxów jest tyle ile liter w alfabecie. Wtedy to można szukać kontrolek przez FindComponent z formatki i jeszcze rzutować na TCheckBox, wykorzystując po prostu przypisaną im wartość Tag. Można też stworzyć tablicę array of TCheckBox i do każdego elementu przypisać odpowiedni checkbox, generalnie chodzi o czytelność kodu i łatwość jego rozbudowy.

Narazie jest uwzględnianie tylko 4 liter, co będzie jeśli będzie ich więcej? Zagnieżdżanie do kilkunastu lub więcej poziomów? Nie widzi mi się przynajmniej pod względem czytelności kodu.

konto usunięte

Temat: Zagęszaczanie Jeżeli... Problem z programem do...

Dzięki za odpowiedź, chodź pierwsza część to dla mnie czarna magia, to z tworzeniem tablic dam rade:) Tylko nie za bardzo rozumiem co mi to da, zapewne jest to związane z brakiem wiedzy. Ale będę drążył temat by rozwiązać problem:) Na razie cały czas w głowie mam "Jeżeli".

Myślę, że do tematu wrócę jak poszerzę swoją wiedzę, na razie to zacznę powtórkę od łatwiejszych problemów.Ten post został edytowany przez Autora dnia 19.11.13 o godzinie 20:52

konto usunięte

Temat: Zagęszaczanie Jeżeli... Problem z programem do...

Drobna optymalizacja:

Zamiast tych wszystkich IF-ów napisz:


s := '';
if checkbox1.checked then s:= s + a;
if checkbox2.checked then s:= s+ b;
if checkbox3.checked then s:= s+ c;
if checkbox4.checked then s:= s+ d;
if Length(s) = 0 then
begin
showMessage('błąd nie nic nie zaznaczono:)');
exit;
end;
Ten post został edytowany przez Autora dnia 19.11.13 o godzinie 22:58

konto usunięte

Temat: Zagęszaczanie Jeżeli... Problem z programem do...

Dziękuje:)

Następna dyskusja:

problem z odczytem pliku XML




Wyślij zaproszenie do