Chlape, ak by som nemenil zamestnávateľa a holka mi nechľastala na kamkovici, asi by som nerobil tento altruistický krok, ale nedá sa mi neodpovedať :) Ten tvoj kód je hrozný bordel! Neber to osobne. Keď som začínal v profy oblasti, tiež som tým prešiel a to som vyhrával celoštátne súťaže - šéf sa usmial so slovami "humus".
Takže:
1. Netuším ako to má fungovať, stále mi to hádže výnimky.
2. Netuším čo to má robiť, preto nehodnotím tvoj kód podľa logických častí (ako si ho rozdelil na metódy), ale len podotnem ku každému niečo - týmto chcem, aby si sa niečomu naučil, keďže predpokladám, že s programovaním začínaš:
Dobré rady:
1. Píš komentáre, aj keby to malo byť posledné, čo si v živote napísal.
2. Keď bacáš komponenty na form, snaž sa im dať relevantný názov s prefixom ich triedy, teda napr. ButtonOK, LabelOtazka, SplitterGrid apod. Rovnako aj pomenuvaj premenne, napr. namiesto I pouzivaj Index, namiesto Pom: TFormField zadaj FormField: TFormFiel, takto bude jednoduchšie čítať kód aj pri rozsiahlejších kódoch.
3. Ak pracuješ s metódami, zoradzuj ich podľa toho, ako si ich definoval v triede (prehliadnejšie a môžeš rýchlo chodiť po kóde klávesami CTRL+SHIT+šípka hore / dole):
type
TMojaTrieda = class
private
procedure Jeden;
procedure Dva;
protected
function Kuko: Boolean;
end; // TMojaTrieda
procedure TMojaTrieda.Jeden;
...
procedure TMojaTrieda.Dva;
...
function TMojaTrieda.Kuko: Boolean;
...
4. Boolové fcie sa dajú písať aj elegantnejšie:
function JePrvyZnakCislo(const Retazec: String): Boolean;
begin
Result := ((Length(Retazec) > 0) and (Retazec[1] in ['0'..'9'])); // Staci jeden riadok
{ NIE - i ked to nie je spatne
if (Length(Retazec) > 0) and (Retazec[1] in ['0'..'9']) then
Result := True
else
Result := False;
}
end;
5. Uvažuj keď kódiš! Skús rozmýšľat (netreba veľa rozumu a hneď poznať smernikovú aritmetiku, stačí logika) optimálne aj v cykloch, napr. tvoja haluz:
{ TVOJE:
result:=false;
for I := 1 to length(t) do if t[i]='{' then result:=true;
}
{
// pr. 1: Ukoncit po najdeni prvej zatvorky
Result := (Length(T) = 0);
if (not Result) then
begin
for Index := 1 to Length(Retazec) do
begin
if Retazec[Index] = '{' then
begin
Result := True;
Exit; // Ukonci FOR
end; // IF
end; // FOR
end; // IF
}
// Relevantnejsie riesenie
Result := (Pos('{', Retazec) > 0);
Prechádza sa celá dĺžka reťazca! Ak sa narazí na prvú zátvorku, výsledok fcie bude TRUE. Potom sa už nikde nemení na iný!!! Načo dôjsť do konca? A za ďalšie, hľadanie sub-reťazca je fcia známa už Turbo Pascalu (pr. 2)
6. Fcia odzátvrokuj je pekný bordel. Keďže si nedal komentár, dá sa len z kódu vyčítať čo robí:
- Prepíše všetky iné zátvorky za guľaté
- Zistí, či sa nachádzajú guľaté zátvorky ak nie vráti pôvodný reťazec.
Ak si to myslel takto, tak si mal najprv zistiť, či sa nachádzajú guľaté zátvorky a až potom, ak nie, odstráňovať tie druhé! Ak sa totiž v reťazci nenachádzajú, zbytočne sa odstránia, aj keď pre túto vetvu programu to nie je podstatné.
Ale i tak pochybujem, že tá fcia má robiť to, ako je napísaná... Skús naštudovať toto (fcia na prepísanie textu je z Delphi, nie je najrýchlejšia pri malých reťazcoch, ale skús si to s 1GB a budeš prekvapený :)
// *****************************************************************************
function TFormMain.Odzavorkuj(const Retazec: String): String;
// ---------------------------------------------------------------------------
procedure NahradZatvorky(var Vystup: String; const SadaZatvoriek: String;
const ZaZatvorku: Char);
var
Index: Integer;
begin
if Length(SadaZatvoriek) > 0 then
begin
for Index := 1 to Length(SadaZatvoriek) do
Vystup := AnsiReplaceText(Vystup, SadaZatvoriek[Index], ZaZatvorku);
end; // IF
end;
// ---------------------------------------------------------------------------
const
LaveZatvorky = '[{</';
PraveZatvorky = ']}>\';
begin
Result := Retazec;
NahradZatvorky(Result, LaveZatvorky, '('); // Nahradime lave zatvorky
NahradZatvorky(Result, PraveZatvorky, ')'); // Nahradime lave zatvorky
Memo1.Lines.Add(Result);
end;
7. V Delphi existuje fcia StrToBool, nemusíš ju písať.
8. Pri výpočte mocniny si nemyslel na všetky možnosti. Okrem toho, snaž sa aj argumenty prispôsobiť realite. Ak maš LONGINT^LONGINT, tak určite pri brutálnom čísle RESULT pretečie, preto sa to dá napísať aj napr. takto:
function TFormMain.NMocnina(const Zaklad: Integer; Exponent: Byte): Longint;
begin
if Exponent < 0 then
raise Exception.Create('Interná chyba: Záporný exponent!');
Result := 1;
if Exponent > 0 then
begin
while Exponent > 0 do
begin
Result := Result * Zaklad;
Dec(Exponent);
end; // WHILE
end; // IF
end;
9. Asi by som pokračoval, ale keďže ma volali na pivo, tak sa na to vybodnem :) Dúfam, že som ťa neodplašil - zapamätaj, kritika nie je zlá, len sa treba prekúsať svojim egom a ťažiť z nej. Mne to chvíľku trvalo, ale bola to tá najlepšia škola!