Program do koniungacji czasowników włoskich

0

Witam po krótkiej przerwie.
Oczywiście, że docenię każdą pomoc, również Twoją @lampasss tylko samo napisane o jakiś parametrach niewiele mi mówi więc musiałbyś jaśniej :)

Nie miałem czasu przez 2 dni prawie, żeby cokolwiek ruszyć. Zrobiłem tylko coś takiego co nie działa i chciałbym prosić o pomoc (wskazówkę może, gdzie popełniam błąd). Mianowicie dodałem do bazy tabelę IrregularVerbsPresentIndicative, która ma przechowywać jak sama nazwa wskazuje czasowniki nieregularne w czasie tarazniejszym (podstawowy czasownik i jego odmianę).

Stworzyłem w tabeli kolumny, basic_form, io_form, tu_form itd. i dodałem takei coś bazując na poprzednim (działającym) przykładzie.

function TMainForm.IrregularVerbsChecker: Boolean;
begin
	Wynik := SQLiteBaza.GetTable(
	'SELECT basic_form FROM IrregularVerbsPresentIndicative WHERE basic_form = ' + QuotedStr(Verb));
	if Wynik.Count > 0 then result := true;
	Wynik.Free;
end;    

Potem jej wywołanie (zmienna Wynik jest globalna przynajmniej chwilowo bo sprawdzam tylko na razie czy zadziała).

if IrregularVerbsChecker then
  lblFirstSingularPresentIndicative.Caption := Wynik.FieldByName['io_form']

chciałem żeby tylko jedna rubryka chociaż się zmieniła żeby sprawdzić czy działa, ale jest błąd ciągle i nie wiem czemu w sumie, bo napisane jest to praktycznie tak samo jak to Twoje :)

0

jest błąd ciągle - to może napisz, co to za błąd :P
A poza tym - wrzuć nową bazę jako załącznik, ułatwisz mi w ten sposób pracę.

0

Też wróciłem teraz do domu dopiero i nie ruszyłem nic od wczoraj dlatego nie mam żadnych pytań. Jedyne to to co próbuję zrobić czyli ta procedura nieregularnych czasowników. Nie wiem czemu ten kod w SQLu nie działa. Jeżeli się zrobił mały syf w kodzie to wybacz - próbowałem wielu rzeczy i czasem mogłem, gdzieś zapomnieć usunąć coś :)

0

Hej
Przez te 2 dni bawiłem się trochę i udało mi się stworzyć funkcję do czasowników zwrotnych tylko jest jeden problem, bo funkcja nie działa jak należy jeżeli jako pierwszy zostanie podany czasownik zwrotny. Jeżeli najpierw jest zwykły czasownik, a jako drugi doda się czasownik zwrotny to wszystko działa. Tylko, że nie wiem czemu tak się dzieje.

Ale po kolei. Najpierw dodałem 6 Labeli, które mają za zadanie wyświetlać formę zwrotną (mi, ti, si, ci, vi, si). Formy te pojawiają się przed czasownikiem głównym więc stworzyłem następujące procedury:

LabelPositionChanger - procedura ma za zadanie przesunąć labele wyświetlające odmienione czasowniki, ponieważ jeżeli czasownik nie jest zwrotny to formy zwrotne nie są wyświetlane więc czasownik występuje bezpośrednio po zaimku.

procedure TMainForm.LabelPositionChanger(X: Integer);
begin
	lblFirstSingularPresentIndicative.Left := X;
	lblSecondSingularPresentIndicative.Left := X;
	lblThirdSingularPresentIndicative.Left := X;
	lblFirstPluralPresentIndicative.Left := X;
	lblSecondPluralPresentIndicative.Left := X;
	lblThirdPluralPresentIndicative.Left := X;
end; 

X to po prostu liczba, w którym miejscu mają być labele

Druga procedura to ReflexivePronounVisibility. Jej zadaniem jest wyświetlanie, bądź chowanie labeli form zwrotnych.

procedure TMainForm.ReflexivePronounVisibility(const X : Boolean);
begin
	lblMi.Visible := X;
	lblTi.Visible := X;
	lblSi.Visible := X;
	lblCi.Visible := X;
	lblVi.Visible := X;
	lblSi_plural.Visible := X;
end;  

Tutaj X jest parametrem, który po prostu mówi czy panel ma być widoczny czy nie.

Funkcja ReflexiveVerbChecker ma za zadanie sprawdzić czy podany czasownik jest zwrotny. Włoski czasowniki zwrotne zakończone są na -arsi, -ersi, -irsi i funkcja sprawdza najpierw końcówki czasownika głównego, a potem wykonuje odpowiedni instrukcje.

function TMainForm.ReflexiveVerbChecker: Boolean;
begin
  if (CheckedVerbsFunction(4) = 'arsi') or (CheckedVerbsFunction(4) = 'ersi')
  or (CheckedVerbsFunction(4) = 'irsi') then
  begin
  	Result := true;
  	ReflexivePronounVisibility(True);
  	LabelPositionChanger(80)
  end
  else
  begin
  	Result := False;
    ReflexivePronounVisibility(False);
    LabelPositionChanger(56);
  end;
end;  

Przy testowaniu programu właśnie znalazłem problem, nad którymi pracuję, ale na razie bezskutecznie. Otóż tak jak napisałem już, gdy najpierw podam czasownik zwrotny po uruchomieniu programu to wyświetla formy zwrotne, ale nie odmienia czasownika. Nad tym SQLem też pracuję powoli i po przejrzeniu masy poradników myślałem nad przejściem na komponenty do SQLite3, bo nigdzie praktycznie nie mogę znaleźć komend do tego wrappera co trochę utrudnia, bo nie wiem, gdzie w mojej procedurze robię błąd.

Edit: Jeszcze pomyślałem, że pokaże procedurę główną, b o może to w niej jest problem chociaż wątpię.

procedure TMainForm.MainConjugation;
begin
  ReflexiveVerbChecker;
  AreConjugation;
  EreConjugation;
  IreConjugation;
end; 
2

Dziwnie wszystko nazywasz.

LabelPositionChanger - procedura ma za zadanie przesunąć labele wyświetlające odmienione czasowniki, ponieważ jeżeli czasownik nie jest zwrotny to formy zwrotne nie są wyświetlane więc czasownik występuje bezpośrednio po zaimku.

ChangeLabelPosition

Druga procedura to ReflexivePronounVisibility. Jej zadaniem jest wyświetlanie, bądź chowanie labeli form zwrotnych.

Lepiej ReflexivePronounVisible, a może jeszcze lepiej EnableReflexivePronoun

Funkcja ReflexiveVerbChecker ma za zadanie sprawdzić czy podany czasownik jest zwrotny.

IsVerbReflexive

0

Dzięki :) Chociaż kwestia nazewnictwa to chyba sprawa drugorzędna :)

Edit: Analizuję ten kod i chyba wiem czego to jest przyczyna. Możliwe, że po sprawdzeniu warunku z czasownikiem zwrotnym program próbuje wykonać jedną z trzech procedur Ire, Era, Are, ale nie może tego zrobić, bo czasownik zwrotny nie kończy się na are, era, ire :)

Będę nad tym pracował teraz, bo dziś mam dużo czasu i dam znać potem jakie są efekty

1

@soob: prawidłowe nazewnictwo to kwestia tak samo ważna jak prawidłowy przepływ sterowania. Co prawda ”dziwne” identyfikatory nie zepsują programu, jednak skutecznie mogą utrudnić jego zrozumienie, a tym samym rozwijanie czy poprawianie. Zapoznaj się z powszechnie przyjętą konwencją nazewnictwa – Object Pascal Style Guide.

2

Obecnie nie będe wysyłał kodu, bo zrobiłem tak wiele przemianek itd, że na chwilę obecną program nie działa, ale to po prostu moje próby i błedy. Nawet jak coś działa to próbuję zrozumieć czemu tak działa, a inaczej nie i po prostu trochę "pobrudziłem" kod

Kiedyś-tam możesz zacząć korzystać z narzędzi wersjonowania (Git/SVN/Mercurial), ale póki co możesz korzystać z "wersji dla ubogich" - czyli przed grzebaniem robić sobie kopie projektu. Możesz je chociażby numerować, albo np. wstawiać datę. W ten sposób po pierwsze zawsze możesz się cofnąć do wcześniejszej wersji, a po drugie nie ma ryzyka, że coś popsujesz. Niekoniecznie musisz takie "ślady" zostawiać codziennie, ale fajnie jest sobie zrobić snapshota po udanym odpaleniu danej funkcjonalności.

Ciekawostka - jak widać na poniższym obrazku, Lazarus sam w sobie oferuje opcję tworzenia kopii zapasowych. Jeśli masz ją uaktywnioną, w folderze projektu pojawia się katalog backup, który przechowuje kopie zgodnie z ustawieniami określonymi w Tools->Options.
screenshot-20190126211104.png

A co do samego SQL - widzę, że masz z tym jakiś problem. Uwierz mi - to jest naprawdę prosty temat, a obsługa podanego przeze mnie wrappera jest naprawdę trywialna. Dlatego, jeśli chcesz, to wrzuć tutaj z 2-3 konkretne tematy, z którymi masz problem (typu "jak z bazy 1 pobrać jakąś wartość" albo "jak dodać słowo do bazy 2"), wrzuć też te bazy (chyba, że to są te same, które były wcześniej), a postaram Ci się zrobić gotowce. Zobaczysz, że to jest naprawdę łatwe, dasz radę :)

1

Udało mi się zrobić to co chciałem, ale tego jest tyle, że ten post pewnie będzie bardzo długi, ale trudno - jak będziesz chciał się odnieść to to zrobisz, a jeśli nie to i tak wdzięczny jestem za pomoc. Zacznę od tego nieszczęsnego SQLa :)

Otóż próbowałem zrobić funkcję, która by sprawdzała czy wpisane słowo znajduje się w tabeli IrregularVerbsPresentIndicative, a jeśli tak to wpisuje w Labele konkretne pola. Tabela jest w tej samej bazie co wcześniej żeśmy robili i posiada pola typu basic_form, io_form, tu_form itd. Moja funkcja wygląda tak:

function TMainForm.IsVerbIrregular: Boolean;
begin
	Wynik := SQLiteBaza.GetTable(
	'SELECT basic_form FROM IrregularVerbsPresentIndicative WHERE basic_form = '
	+ QuotedStr(Verb));
	if Wynik.Count > 0 then
  begin
    result := true;
    Wynik.Free
  end else
  begin
  result := false;
	Wynik.Free;
  end;
end;

Potem mam takie coś

lblFirstSingularPresentIndicative.Caption := Wynik.FieldByName['io_form'];

I nie wiem co robię tu źle? Jak mam inaczej odnieść się do tego pola io_form?

Druga sprawa to te czasowniki zwrotne. Miałem bardzo duży problem z tym dzisiaj, bo długo nie wiedziałem dlaczego funkcja dodaje mi dodatkowe -a do czasowniki. Może trochę wyjaśnię sytuacje. Czasowniki zwrotne w języku włoskim kończą się na -arsi, -ersi, -irsi więc pomyślałem, że zamiast pisać osobną procedurę do ich koniugacji to zrobię procedurę, która sprawdza końcówkę czasownika potem usuwa końcówkę -si i dodaje -e po to żeby później procedury do koniugacji zwykłej mogły go odmienić jak regularny, np:

chiedersi -- procedura -- > chieder --> chieder + e --> chiedere i czasownik chiedere bez problemu odmienia procedura EreConjugation

A tak wygląda procedura:

procedure TMainForm.ReflexiveToRegularVerb;
begin
  if (CheckedVerbsFunction(4) = 'arsi')
  or (CheckedVerbsFunction(4) = 'ersi')
  or (CheckedVerbsFunction(4) = 'irsi') then
  begin
    Delete(Verb, Length(Verb)-1, 2);
    Insert('e', Verb, Length(Verb)+1);
  end;
end;  

Nie wiem czy to dobre rozwiązanie, ale mnie się podoba, bo nic innego nie mogłem wymyślić, a to wydaje się logiczne i mam nadzieję, że takie jest ;)
Problem jednak pojawiał się, bo dopóki miałem zmienną WordLength to korzystałem z niej w tej procedurze i nie mogłem zrozumieć dlaczego dodaje mi -a dodatkowe czyli np. miałem chiedera, a działo się tak dlatego ponieważ zmienna WordLength "pamiętała" długość słowa przed obcięciem go tą procedurą i potem procedury do koniugacji nie umiały tego rozgryźć :P Zastąpiłem wszędzie tę funkcję procedurą Length(Verb) i działa. Matko nie wiem czy to ma sens co piszę, bo dla mnie w głowie ma, ale ja pisałem ten program więc trochę łatwiej mi się w tym połapać.

Drugi błąd, który nie dawał mi spokoju to taki, że po napisaniu już tej procedury do czasowników zwrotnych wszystko działało, ale pojawił się problem, bo gdy wpisałem jakiś czasownik zwrotny (niech będzie znowu to chiedersi) to program ładnie je odmieniał, ale gdy nie zmieniłem nic w komponencie VerbEdit tylko klikałem drugi raz przycisk OK to wtedy program odmieniał mi ten czasownik jak regularny czyli usuwał po prostu te Labele do zwrotnych. Długo nie wiedziałem czemu, ale później analizował kod na spokojnie i zrozumiałem, że po tym jak używam procedury ReflexiveToRegularVerb to ta zmienna Verb nie jest już chiedersi tylko chiedere więc nie dziwota, że program za drugim razem działał inaczej.

Naprawiłem to chyba najgłupszym możliwym sposobem (ale działającym), mianowicie stworzyłem drugą zmienną VerbCopy, która przechowuje oryginalną zmienną Verb przed wykonaniem procedury i pod koniec działania procedury MainConjugation dodałem taką linię Verb := VerbCopy czyli po prostu przywracam jej oryginalną wartość.

Dzięki bardzo za rady co do backupu :D Muszę zacząć to wykorzystywać

0

Może to kosmetyka, ale w function TMainForm.IsVerbIrregular możesz Wynik.Free; dać poza if/else. Teraz masz to wpisane dwa razy, a przecież zwolnienie tego obiektu nastąpi niezależnie od tego, czy dane słowo wystąpiło w bazie, czy nie.

W zakresie SQL - nie mam teraz czasu, żeby sprawdzać Twój kod, ale zrobię szybkie przekopiowanie (z lekką edycją) czegoś, co sam mam w jakimś swoim projekcie. Myślę, że przez analogię sobie poradzisz. Nie jest to raczej wzór kodu, którym się należy chwalić, był kiedyś pisany doraźnie/na szybko, ale co ważne - działa :D

var
    Baza: TSQLiteDatabase;
    Odpowiedz: TSQLiteTable;

  Baza := TSQLiteDatabase.Create(Form1.OpenDialog1.FileName);
  Odpowiedz := Baza.GetTable('SELECT * from slownik');

for Ster := 1 to Odpowiedz.Count do
      begin
        Form1.StringGrid1.Cells[0, Ster] := Odpowiedz.FieldAsString(Odpowiedz.FieldIndex['slowo']);
        Form1.StringGrid1.Cells[1, Ster] := IntToStr(Length(Form1.StringGrid1.Cells[0, Ster]));
        Form1.StringGrid1.Cells[2, Ster] := Odpowiedz.FieldAsString(Odpowiedz.FieldIndex['odpowiednik']);
        Form1.StringGrid1.Cells[3, Ster] := IntToStr(Length(Form1.StringGrid1.Cells[2, Ster]));
        Form1.StringGrid1.Cells[4, Ster] := Odpowiedz.FieldAsString(Odpowiedz.FieldIndex['komentarz']);
        if (Ster < Odpowiedz.Count) then Odpowiedz.Next;
      end;

  Odpowiedz.Free;     
  Baza.Free;                                                                      
0
cerrato napisał(a):

Może to kosmetyka, ale w function TMainForm.IsVerbIrregular możesz Wynik.Free; dać poza if/else. Teraz masz to wpisane dwa razy, a przecież zwolnienie tego obiektu nastąpi niezależnie od tego, czy dane słowo wystąpiło w bazie, czy nie.

Racja :)

Co do tego SQLa to chyba sobie serio daruję, bo ja robiłem już tak jak Ty w tym przykładzie. Używałem i FieldAsString i FieldIndex (mimo, że nie bardzo wiem co to jest ten indeks w tym wypadku) i nic nie działa. Zawsze ten sam błąd

Trochę mnie to denerwuje, bo nawet jak przekopiuję jakiś kod z internetu to i tak nie działa, a ja nie potrafię powiedzieć czemu, mimo że jak sam mówisz jest to trywialne :/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.