Wątek przeniesiony 2016-12-07 21:37 z Delphi i Pascal przez furious programming.

Program do nauki języka - oprogramowanie przycisku sprawdzania

0

Dobry wieczór.

Robię mini program pomocny w nauce języka w zasadzie wszystko już mam
poza jednym buttonem "sprawdzam".
I tu pytanie do Was o pomysły jak zrobić by po odegraniu mp3 np.: słówko polskie - klik na button "sprawdzam" odgrywa się słówko niemieckie i odwrotnie.

Słówka czy zwroty polskie jak i niemieckie są to mp3 załadowne w lisboxie jako playlista i odtwarzane losowo. Plik słówko polskie jak i niemieckie mogą być w tym samym folderze aczkolwiek będą posegregowane tematycznie np. liczebnik czy praca itp.

Jak najprościej a z głową zrobić by pl.mp3 = de.mp3
Dziękuję

0

Tworzysz zmienną globalną np.: jOjczysty : Boolean; .
Po rozegraniu słówko polskie będzie ustawiało tą zmienną na True, w przeciwnym wypadku na False.
Jeżeli ma True będzie oznaczało, że ostatni zagrany utwór był po polsku, więc button Sprawdź będzie grał wtedy w języku obcym, jeżeli będzie False - w języku polskim.
Przykład w Buttonie Sprawdź:

If jOjczysty then
 Graj(NazwaPliku + 'de.mp3')
 else
 Graj(NazwaPliku + 'pl.mp3'); 

Tylko zamiast Graj dajesz procedurę odpowiednią, do tego, czego używasz do odtwarzania.
Jeśli dobrze zrozumiałem, to powinno działać.

0

Tak dobrze zrozumiałeś i dziękuję za odpowiedz tylko tych plików trochę będzie i nie mogę do każdego dodawać kodu w programie

0

Jak najprościej a z głową zrobić by pl.mp3 = de.mp3

Już pisaliśmy Ci wiele razy w poprzednich wielu wątkach - odpowiednia struktura katalogów; Podział na dwa główne drzewa, czyli na dwa główne katalogi pl i en, a w nich pliki o identycznych nazwach, tak aby jedyną różnicą w parach ścieżek była nazwa katalogu głównego;

Po raz n-ty pytasz o to samo i wymyślenie kolejego nicku nic Ci nie da, skoro i tak nie korzystasz z podanych wskazówek.

0

Wiem i dziękuję i doceniam pomoc. Tylko pliki o tych samych nazwach nie są wyjściem, bo szybko tworząc pliki mp3 popełnię błąd będę się zastanawiać 10 x gdzie go wkleić to był Pl czy De to nie ma sensu bez obrazy przynajmniej mi się tak wydaje a kto pyta nie błądzi, prawda? Co do pytań może zadaje inaczej tylko staram się by był bardziej zrozumiany

0

musisz stworzyć powiązanie pomiędzy plikiem MP3 w języku polskim a plikiem MP3 w w języku obcym . A jak to zrobić ?? jeden sposób podał @furious programming
a dokładniej to masz cztery struktury danych :
pierwsza : tabela z plikami MP3 w języku polskim
druga: tabela tekstowa ze słowami w języku polskim
trzecia : tabela z plikami MP3 w języku niemieckim
czwarta : tabela tekstowa ze słowami w językiem niemieckim

pierwsza i druga są w relacji jeden do jeden, jedno słowo , jeden plik , więc w aplikacji można zastąpić tę relację jedną tabelą
trzecia i czwarta, podobnie
problemem jest połączenie dwóch tabel , tabela ze słowem polskim i odpowiednim plikiem MP3 w języku polskim i tabeli ze słowem niemieckim i odpowiadającym mu pliku MP3 w języku niemieckim .
Bez dodatkowej struktury definiującej takie powiązania nie da rady . Taką strukturą można zaprojektować na wiele sposobów , plik "csv", plik "ini" albo tabela w bazie danych

0

to chyba sobie podaruje może za rok się uda :( ale dużo mi podpowiedziałeś za co Dziękuję dużo rozjaśniłeś w punktach jak to małymi kroczkami poskładać o to chodziło

0

Może jeszcze raz powtórzę, bo jak widać wciąż nie dotarło - odpowiednia struktura katalogów, sensowne nazewnictwo plików, warstwa translacji na poziomie konfiguracyjnych plików INI; To wszystko, rozwiązanie czytelne, łatwe do modyfikowania i rozszerzania oraz co w tym przypadku ważne - bardzo proste w implementacji;

Sensowna struktura katalogów - główny katalog np. o nazwie words, w nim podkatalogi danych języków, czyli np. pl i en; Odpowiednie nazewnictwo plików zwiększy przejrzystość - czyli pliki powinny nosić nazwy odpowiadające słowu w nich zapisanemu (np. pierwszy.mp3 i jego odpowiednik - first.mp3); Połączenie odpowiedniej struktury katalogów i dobrego nazewnictwa plików nie będzie stanowić problemu w odczytywaniu ścieżek i tym samym używania plików;

Ostatnia sprawa - translacja słów w celu określenia ścieżek; Tyle konfigów, ile języków ma obsługiwać program; Dla przykładu niech będą to języki polski i angielski - stworzyć należy pliki pl.ini oraz en.ini ten pierwszy o takiej strukturze:

[WORDS]
pierwszy=first
drugi=second
trzeci=third

; ...

a ten drugi o takiej:

[WORDS]
first=pierwszy
second=drugi
third=trzeci

; ...

Chcąc przetłumaczyć polskie słowo na angielskie, należy w pliku pl.ini odczytać wartość klucza o nazwie takiej, jakie słowo przetłumaczyć chcemy; I odwrotnie - mając angielskie słówko, należy w pliku en.pl odczytać wartość klucza o posiadanej nazwie; Mając już przetłumaczone słówko, należy zbudować ścieżkę do pliku dźwiękowego w podany niżej sposób:

typ składowej ścieżki język polski język angielski
główny katalog words\ words\
podkatalog języka pl\ en\
nazwa pliku pierwszy first
rozszerzenie .mp3 .mp3
pełna ścieżka względna

| words\pl\pierwszy.mp3 | words\en\first.mp3
To wszystko - koncepcja prosta, niezbyt wydajna, ale łatwa w implementacji.

0

Dziękuję za porady jesteście WIELCY

Tylko jak zrobić by program za pomocą buttonaClick wiedział z której ścieżki czytać i jak tam i jak tam Play w tym wszystkim dodać z MediaPlayera, ja już nad siedze i krucho ale się nie poddaje.
Dla Was to pestka dla mnie masakra ale ślicznie i tak dziękuję Wam za pomoc idę dalej kombinować i pozdrawiam.

Każda pomoc dalej mile widziana bo to masakra

0

Tylko jak zrobić by program za pomocą buttonaClick wiedział z której ścieżki czytać [...]

Jeśli program będzie używał jedynie ścieżek względnych to wystarczy umieścić katalogi językowe w tym samym folderze co plik wykonywalny aplikacji, a w programie (w kodzie) skorzystać ze ścieżek, które podałem w tabelce w poprzednim swoim poście;

Przyda się też określić miejsce dla plików konfiguracyjnych ze spisem słów; Wcześniej nic na ten temat nie pisałem (liczyłem na to, że sama coś zaproponujesz...), więc załóżmy, że będą się znajdować w osobnym podkatalogu, np. o nazwie lang;

Struktura plików podkatalogów powinna wyglądać tak (w komentarzach ścieżki względne):

- application.exe    // application.exe
+ lang               // lang\
  - pl.ini           // lang\pl.ini
  - en.ini           // lang\en.ini
+ words              // words\
  + pl               // words\pl\
    - *.mp3          // words\pl\*.mp3
  + en               // words\en\
    - *.mp3          // words\en\*.mp3

I teraz aby przetłumaczyć słówko, należy otworzyć odpowiedni plik konfiguracyjny i odczytać wartość klucza o nazwie takiej, jakie słówko chcemy przetłumaczyć; Przykładowy kod:

type
  TLanguageKind = (lkPolish, lkEnglish);

const
  LANG_NAMES: array [TLanguageKind] of String = ('pl', 'en');

  function TranslateWord(const AWord: String; ALanguage: TLanguageKind): String;
  var
    LLangFile: TIniFile;
  begin
    LLangFile := TIniFile.Create(Format('lang\%s.ini', [LANG_NAMES[ALanguage]]));
    try
      Result := LLangFile.ReadString('WORDS', AWord, '');
    finally
      LLangFile.Free();
    end;
  end;

I teraz wywołanie funkcji TranslateWord w poniższy sposób:

var
  LTranslatedWord: String;
begin
  LTranslatedWord := TranslateWord('pierwszy', lkPolish, lkEnglish);

spowoduje otwarcie pliku lang\pl.ini, pobranie tłumaczenia słowa pierwszy (co da słówko first) i zwrócenie go przez funkcję; Aby odwrócić ten proces, należy podać rodzaje języków odwrotnie:

LTranslatedWord := TranslateWord('first', lkEnglish, lkPolish);

Natomiast funkcja budująca ścieżkę do pliku dźwiękowego na podstawie danego słówka może wyglądać np. tak:

function GetWordSoundPath(const AWord: String; ALanguage: TLanguageKind): String;
begin
  Result := Format('words\%s\%s.mp3', [LANG_NAMES[ALanguage], AWord]);
end;

Wywołanie funkcji w poniższy sposób:

var
  LSoundPath: String;
begin
  LSoundPath := GetWordSoundPath('pierwszy', lkPolish);

spowoduje zwrócenie przez funkcję ścieżki words\pl\pierwszy.mp3 dla podanego w parametrze słówka pierwszy;

To tylko przykłady kodów dla programu, który obsługuje na sztywno dwa języki - polski i angielski; Jeśli Twój program ma obsługiwać dowolną liczbę języków to trzeba będzie się również zastanowić nad mechanizmem obsługującym wiele plików z podkatalogu lang oraz wiele podkatalogów w folderze words.

0

To się nazywa POMOC.
Ale dalej jednego nie rozumiem.
Mamy wczytane pliki do ListBoxa plik losowa się odtwarza i kończy.
Jak zrobić by buton sprawdzam wiedział co było odtworzone ostatnio , odczytał właściwy plik INI i odtworzył plik przypisany w pliku INI. kolejny klik wbutton wraca z powrotem np. pierwszy mp3. klik odtwarza się first.mp3 kolejny klik (sprawdzamy first) odtwarza się pierwszy.mp3 i tak w kółko dopóki pliku next nie wcisne ale to już mam zrobione. O plikach INI nawet tu jest dużo jak odczytać zapisać itd. Ale nie wiem jak włożyć to w ten button i dodać jeszcze MediaPlayer Open i Play

to mi potrzebne tylko do jednego języka + polski to mi wystarcza. Tylko ten button mnie doprowadza szewskiej pasji. Kombinuje na wszystkie sposoby, łeb mi paruję dostaje wścieklizny, depresji i wszystkiego naraz :) Ale szczerze BARDZO DZIĘKUJĘ ZA POMOC

0

Jak zrobić by buton sprawdzam wiedział co było odtworzone ostatnio [...]

Trzeba użyć jakiejś zmiennej lub pola klasy i sobie zapamiętać ostatnio odegrane słowo (słowo, nie plik);

[...] odczytał właściwy plik INI i odtworzył plik przypisany w pliku INI.

Mając zmienną z ostatnio odegranym słowem, można go użyć do przetłumaczenia na inny język, określenia ścieżki pliku dla przetłumaczonego słowa i odegrania dźwięku z pliku spod tej ścieżki; To opisałem w poprzednim poście;

PS: Pliki INI nie zawierają nazw plików, a jedynie pary słów (oryginał i tłumaczenie); Na ich podstawie można określić ścieżki plików dźwiękowych, co pokazałem w swoim poprzednim poście.

0

Tylko jak zapisać taką zmienną o samej nazwie nie ścieżce najlepiej wyświetlić nazwę w labelu ale tylko po to by przed dalszym pisaniem wiedzieć że to działa.
moja procedura play poniżej:

procedure TForm2.Button8Click(Sender: TObject);
begin
MediaPlayer1.FileName := ListBox1.Items[Random(ListBox1.Items.Count) - 0];
  MediaPlayer1.open;
  MediaPlayer1.Play;
end;

tak to chyba wyświetlić w labelu

self.Label2.caption := 'nazwa zmiennej'


pomóż proszę tylko tą zmienna tu zapisać wiem wiem masakra ze mną tylko to jeszcze zrobić a program dzięki Waszej pomocy to mistrzostwo świata, wielu osobom się przyda niby nic a jakże będzie pomocny.

Poza tym mam też pytanie z babskiej ciekawości gdyż stworzenie plików mp3 też trochę zajmuje czasu ale jakby kupić licencje np syntezatora Ivo a program miał tylko tworzyć pliki INI lub inne ze słówkami i jego odpowiednikami w drugim języku, nie było prościej? To czysta ciekawość bo za dużo mnie to nerwów kosztuje i wstydu by Wam zawracać dupę by teraz odpuścić

0

nie wiem czy dobrze zrozumiałem, wybierasz z listboxa losowo jakiś plik a w labelu chcesz wyświetlić odpowiadające mu słowo ?

0

tak dokładnie jego odpowiednik(tłumaczenie) tylko pliki nie mogą być zapisane w kodzie programu bo będzie się to zmieniać jedne dodawane inne usuwane ale to już poza programem

za pomocą buttonClick (sprawdzam) świra z tym dostaje

0

czy w listboxie masz pliki ze słowami polskimi ?
w jaki sposób wiążesz plik polski z plikiem niemieckim , na podstawie wpisów w plikach INI ?

0

Nie w Labelu pokazać chce odtworzyć jego odpowiednik mp3 który jest też w tym listboxie (playliście)

0

Napisz klarowniej, bo nic z tego nie rozumiem . Wstawiaj przecinki, bo zdania bez interpunkcji są niezrozumiałe.

0

Tak kolega doradził by zrobić to w plikach INI budowa plików INI

[WORDS]
pierwszy=first
drugi=second
trzeci=third
[WORDS]
first=pierwszy
second=drugi
third=trzeci

aa struktóra katalogów:

application.exe    // application.exe
+ lang               // lang\
  - pl.ini           // lang\pl.ini
  - en.ini           // lang\en.ini
+ words              // words\
  + pl               // words\pl\
    - *.mp3          // words\pl\*.mp3
  + en               // words\en\
    - *.mp3          // words\en\*.mp3

Przepraszam, tak wszystkie pliku są na listboxie jako playliście jak i polski tak w drugim języku.
Za pomocą buttonClick (sprawdzam, przetłumacz) chce odtworzyć jego odpowiednik w drugim języku też plik.mp3 będący również wczytany w listboxie

Gdy on się odtworzy np. plik first.mp3 klik w buuton odtworzy się jego odpowiednik "pierwszy.mp3" kolejny klik w ten button odtworzy się first aż do kliknięcia w button (next, następne słówko)

0

we wcześniejszym poście podałem podałem maila, wyślij spakowany projekt, bo dalej nie mogę zrozumieć.
Piszesz że w listboksie masz oba pliki, w jaki sposób w jednym wierszu umieszczasz ścieżki z nazwami obu plików

0

wysyłam maila ale dostaje wiadomość że nie dotarła wiadomość do adresata.
właśnie nie umieszczam bo nie wiem jak to zrobić

Nie ma tam plików INI ani buttona "sprawdzam" wysłałam tylko to co działa

0

doszło , przyjrzę się temu, ale to już raczej jutro

0

Strasznie dziękuję BARDZO BARDZO

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