Zmiana kodu by była możliwość dołożenia ścieżki do pliku w pliku konfiguracyjnym

2017-01-03 23:36
Martyna
0

Część
Proszę o pomoc ale na wstępie zaznaczam że kod nie jest mój ja nie jestem wstanie tego zrobić to za wysokie progi jak na razie dla mnie. Program polega na tłumaczeniu z PL na DE i odwrotnie chodzi dobrze
lecz próbuje po nitce do kłębka dojść do celu by dołożyć jeszcze wyświetlanie w nim grafiki

Program polega na tłumaczeniu:

pliki i tekst(słowa) są powiązane
pl.mp3 = de.mp3
pisownia(tekst) pl = pisownia(tekst) de
wymowa(uproszczona(tekst)) = wymowa(tekst) de

do tego dochodzi powiazanie
PL= pisownia pl, wymowa pl , pl.mp3
DE= pisownia de, wymowa de, de.mp3

plik .txt konfiguracyjny wygląda następująco:

1;DE;pisownia de; wymowa de; ścieżka do de.mp3;PL;pisownia pl; wymowa pl; ścieżka do pliku pl.mp3

w to chce włożyć jeszcze ścieżkę do pliku graficznego ja dodałam ją między:

.......;ścieżka de.mp3; ścieżka do pliku graficznego; PL.......

Chce by była powiązana z PL jak i DE Będzie jeden obrazek czy to będzie słowo PL czy DE i ztym proszę Was o pomoc i będę wdzięczna każdej o sobie która pomoże mi to zrobić

Każda rada będzie bezcenna a jak by to ktoś pomógł rozklepać i poskładać to będzie bajka bo jak pisałam idę po nitce do kłębka, zmieniając zmienne by zrozumieć kod, staram się ale to są za wysokie dla mnie progi i to droga przez mękę.

Teraz zapodam kod trochę skrócony i z moimi zmianami a w załączniku orginalny działający bez moich zmian

A więc wygląda to tak:
zaznaczyła co zmieniłam dołożyłam to tmpstrlist(5) w linii z intW1 i tak samo w IntW2 i tu wychodzą błędy

[dcc32 Hint] dictionary.pas(18): H2365 Override method tword.destroy should match case of ancestor TObject.Destroy
[dcc32 Hint] dictionary.pas(29): H2365 Override method TMdictionary.destroy should match case of ancestor TObject.Destroy
[dcc32 Error] dictionary.pas(147): E2066 Missing operator or semicolon
[dcc32 Error] dictionary.pas(147): E2010 Incompatible types: 'tword' and 'string'
[dcc32 Error] dictionary.pas(147): E2034 Too many actual parameters
[dcc32 Error] dictionary.pas(149): E2066 Missing operator or semicolon
[dcc32 Error] dictionary.pas(150): E2010 Incompatible types: 'tword' and 'string'
[dcc32 Error] dictionary.pas(150): E2034 Too many actual parameters

unit dictionary;

interface

uses classes, sysutils, MPlayer;

type
  tword = class
    number: integer;
    order: integer;
    ID: string;
    translation: tword;
    sciezka: string;     // po zmianie z filename na sciezka pojawił sie ten problem
    pisownia: string;
    wymowa: string;
    kodjezyka: string;
    constructor create(aid, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);
    destructor destroy; override;
  end;

type
  TMdictionary = class
  private
    directory: string;
  public
    languages: tstringlist;
    words: tstringlist;
    constructor create(afilename: string);
    destructor destroy; override;
  end;

implementation

function my_extractstrings(aseparator: char; atext: string; astringlist: tstringlist): integer;
var
  tmpStr: string;
  I: integer;
begin
  result := 0;
  tmpStr := '';
  for I := 1 to length(atext) do
    if atext[I] = aseparator then
    begin
      astringlist.Add(tmpStr);
      tmpStr := '';
      inc(result);
    end
    else
    begin
      tmpStr := tmpStr + atext[I];
    end;
  if tmpStr <> '' then
  begin
    astringlist.Add(tmpStr);
    inc(result);
  end
end;

{ Tdictionary }
constructor TMdictionary.create(afilename: string);
var
  tmpfile: tstringlist;
  tmpstrlist: tstringlist;

  I: integer;
  Count: integer;

  intW1: integer;
  intW2: integer;

  kodjezyka1: string;
  kodjezyka2: string;

  begin
  self.languages := tstringlist.create;
  self.directory := extractfilepath(afilename);

  words := tstringlist.create;
  words.OwnsObjects := true;

  tmpfile := tstringlist.create;
  tmpstrlist := tstringlist.create;
  try
    tmpfile.LoadFromFile(afilename);
    for I := 0 to tmpfile.Count - 1 do
    begin
      tmpstrlist.Clear;
      Count := my_extractstrings(';', tmpfile[I], tmpstrlist);
      if Count = 10 then
      begin
                              //tmpstrlist(5)  (dołożyłam)
        intW1 := self.words.Addobject(inttostr(I * 2), tword.create(tmpstrlist[0], tmpstrlist[2], tmpstrlist[3],
                      tmpstrlist[4],tmpstrlist(5), tmpstrlist[1], nil, I * 2, 1));

                               //tmpstrlist(5) (dołożyłam)
        intW2 := self.words.Addobject(inttostr(I * 2 + 1), tword.create(tmpstrlist[0],tmpstrlist(5), tmpstrlist[7], 
                      tmpstrlist[8],tmpstrlist[9], tmpstrlist[6], nil, I * 2 + 1, 2));

        tword(self.words.Objects[intW1]).translation := tword(self.words.Objects[intW2]);
        tword(self.words.Objects[intW2]).translation := tword(self.words.Objects[intW1]);

        kodjezyka1 := tmpstrlist[1];
        kodjezyka2 := tmpstrlist[6];

        if self.languages.IndexOf(kodjezyka1) < 0 then
          self.languages.Add(kodjezyka1);

        if self.languages.IndexOf(kodjezyka2) < 0 then
          self.languages.Add(kodjezyka2);
      end;
    end;
  finally
    tmpfile.free;
    tmpstrlist.free;
  end;

end;

destructor TMdictionary.destroy;
begin
  self.languages.free;
  self.words.free;
  inherited;
end;

{ tword }

constructor tword.create(aid, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);
begin
  self.ID := aid;
  self.sciezka := afilename;
  self.pisownia := atext;
  self.wymowa := aphonics;
  self.kodjezyka := alanguage;
end;

destructor tword.destroy;
begin
  ///
  inherited;
end;

end.

Pozostało 580 znaków

2017-01-04 01:56
Martyna
0

Jednym z błędów są tu nawiasy okrągłe zamiast kwadratowych ale reszta błędów dalej tu pozostała

Pozostało 580 znaków

2017-01-04 02:12
1

lista parametrów konstruktora obiektu Tword nie jest zgodna deklaracją tej metody

tword.create(tmpstrlist[0], tmpstrlist[2], tmpstrlist[3],tmpstrlist[4],tmpstrlist(5), tmpstrlist[1], nil, I * 2, 1)
constructor create(aid, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);

Dwa pierwsze błędy to literówki.
Jeśli chodzi o nazwy funkcji i metod to formalnie Delphi jest CaseInsenstive , ale tutaj jest mała niekonsekwencja kompilatora Delphi.
Metoda "Destroy" klasy bazowej Tobject jest zadeklarowana jako "Destroy", a w kodzie jest "destroy" i kompilator zgłasza "hint".

edytowany 3x, ostatnio: furious programming, 2017-01-04 02:34

Pozostało 580 znaków

2017-01-04 02:33
0

Poza tym, typy danych nie są zgodne:

  • do argumentu ATranslation typu TWord podajesz TmpStrList[1] typu String,
  • do argumentu ANumber typu Integer podajesz nil typu Pointer,
  • podajesz o jeden argument za dużo.

Pozostało 580 znaków

2017-01-04 06:06
Martyna
0

D Z I ĘK J Ę
Cały czas nie wiedziałam skąd wiadomo która pozycja odpowiada czemu, w pliku konfiguracyjnym była pierwsza pozycja nie wykorzystana miało to być indeksowanie wyszło mi wiec coś takiego : zamieniłam tylko nazwy zmiennych

type
  tword = class
    number: integer;
    order: integer;
    grafika: string;      // zmiana zID
    translation: tword;
    filename: string;
    text: string;
    phonics: string;
    language: string;
                       //agrafika
    constructor create(agrafika, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);

    destructor destroy; override;

 intW1 := self.words.Addobject(inttostr(I * 2), tword.create(tmpstrlist[0], tmpstrlist[2], tmpstrlist[3],
            tmpstrlist[4], tmpstrlist[1], nil, I * 2, 1));
                                                                     // jak wyżej [0]
        intW2 := self.words.Addobject(inttostr(I * 2 + 1), tword.create(tmpstrlist[0], tmpstrlist[6], tmpstrlist[7],
            tmpstrlist[8], tmpstrlist[5], nil, I * 2 + 1, 2));

constructor tword.create(agrafika, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);
begin
  self.grafika := agrafika;  //grafika := agrafika
  self.filename := afilename;
  self.text := atext;
  self.phonics := aphonics;
  self.number := anumber;
  self.language := alanguage;
  self.order := aorder;
end;

SPRAWDZONE W LABEL (wyświetlenie tekstu z tej pozycji) D Z I A Ł A :) :) :)
PANIE WSKAŻ MI DROGĘ A BĘDE TWOIM CZYNEM :) :) :)

Mam tylko problem z ładowaniem grafiki w TImage
Burzy się że nie jest zadeklarowana i aword i grafika i słusznie bo tak jest
pomożecie jeszcze to dokończyć?

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile(aword.grafika);
end;

procedure TForm1.PokazGrafike(aword:Tword);    \\ nie wiem jak to złożyć

Zrobiłam tak ale daj jest to samo

 { Private declarations }
  public
    mdictionary: TMdictionary;
    procedure PokazGrafike (aword: Tword);

procedure TForm1.PokazGrafike(aword:Tword);
begin
 Image1.Picture.LoadFromFile:= aword.grafika;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile(aword.grafika);
end;

Błędy które wychodzą:

[dcc32 Error] Unit1.pas(151): E2035 Not enough actual parameters
[dcc32 Error] Unit1.pas(151): E2014 Statement expected, but expression of type 'string' found
[dcc32 Error] Unit1.pas(156): E2003 Undeclared identifier: 'aword'
[dcc32 Error] Unit1.pas(156): E2029 'END' expected but ')' found
edytowany 1x, ostatnio: furious programming, 2017-01-04 16:29

Pozostało 580 znaków

2017-01-04 16:31
0
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile(aword.grafika);
end;

Jak sama widzisz, konstruktor posiada jedynie parametr Sender, natomiast AWord to parametr innej metody (konkretnie metody PokazGrafike), więc nie ma do niego dostępu; Dlatego występuje błąd kompilacji o nieznanym identyfikatorze AWord.


edytowany 1x, ostatnio: furious programming, 2017-01-04 16:32

Pozostało 580 znaków

2017-01-04 16:53
Martyna
0

Te procedury zrobiłam ja i raczej nie wystarczy
Jako wczytanie zwykłego tekstu wystarczy chodzi i jest powiązane tak jak ma być

Przyjrzałam się afilename z constructora poniżej to odpowiada za wczytywanie plików mp3 i to co zrobiłam nie wystarczy. Nie wiem czy słusznie ale próbuję to samo zrobić z agrafika nie umiem.

Nawet nie wiem czy idę słuszną drogą (całość budowy tego jest w tym pierwszym kodzie w którym były błędy ale na tamte błędy nie patrzeć są poukładane, chodzi o budowę afilename której tam nie ruszałam i jest poprawna i jak to przegryźć z moją agrafika

constructor tword.create(agrafika, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);
begin
  self.grafika := agrafika;  
  self.filename := afilename;

Pozostało 580 znaków

2017-01-04 22:15
Martyna
0

Program już nic nie podkreśla
ale jest problem: takiego komunikatu przy ładowaniu obrazka w programie:

Access Violation at adress 006058F6 in module :project2.exe' Read of adress 00000000C

Zamieszczę jeszcze raz kod gdyby ktoś się mógł przyjrzeć bo ja już nawet własną klasę stworzyłam ale nic to nie dało było tak samo. Jak ktoś by się mógł przyjrzeć ostatni raz będę wdzięczną

Unit1

{ Public declarations }
  end;

var
  Form1: TForm1;
  tmpWord: tword;
   aword:tword;
  const
allId = 'All';

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1.Picture.LoadFromFile(aword.grafika);
end;

procedure TForm1.Wczytajplikkonfiguracyjny1Click(Sender: TObject);
var
  I: integer;
begin
  if self.OpenDialog1.Execute then
  begin
    self.LabeledEditFile.text := self.OpenDialog1.filename;
    freeandnil(self.mdictionary);
    self.mdictionary := TMdictionary.Create(self.OpenDialog1.filename);
    self.ComboBox1.Items := self.mdictionary.languages;
    self.ComboBox1.Items.Insert(0, allId);
    self.ComboBox1.ItemIndex := 0;
    self.filllistbox(self.ComboBox1.text);
  end;
end;

procedure TForm1.Zamknij1Click(Sender: TObject);
begin
  self.close;
end;

Unit Dictionary

unit dictionary;

interface

uses classes, sysutils, MPlayer;

type
  tword = class
    number: integer;
    order: integer;
    grafika: string;
    translation: tword;
    filename: string;
    text: string;
    phonics: string;
    language: string;

    constructor create(agrafika, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);

    destructor destroy; override;
  end;

type
  TMdictionary = class
  private
    directory: string;
  public
    languages: tstringlist;
    words: tstringlist;
    constructor create(afilename: string);
    destructor destroy; override;
  end;

const
  playOK = 'OK';

implementation

function my_extractstrings(aseparator: char; atext: string; astringlist: tstringlist): integer;
var
  tmpStr: string;
  I: integer;
begin
  result := 0;
  tmpStr := '';
  for I := 1 to length(atext) do
    if atext[I] = aseparator then
    begin
      astringlist.Add(tmpStr);
      tmpStr := '';
      inc(result);
    end
    else
    begin
      tmpStr := tmpStr + atext[I];
    end;
  if tmpStr <> '' then
  begin
    astringlist.Add(tmpStr);
    inc(result);
  end
end;

{ Tdictionary }
constructor TMdictionary.create(afilename: string);
var
  tmpfile: tstringlist;
  tmpstrlist: tstringlist;

  I: integer;
  Count: integer;

  intW1: integer;
  intW2: integer;

  language1: string;
  language2: string;
begin
  self.languages := tstringlist.create;
  self.directory := extractfilepath(afilename);

  words := tstringlist.create;
  words.OwnsObjects := true;

  tmpfile := tstringlist.create;
  tmpstrlist := tstringlist.create;
  try
    tmpfile.LoadFromFile(afilename);
    for I := 0 to tmpfile.Count - 1 do
    begin
      tmpstrlist.Clear;
      Count := my_extractstrings(';', tmpfile[I], tmpstrlist);
      if Count = 9 then
      begin

 intW1 := self.words.Addobject(inttostr(I * 2), tword.create(tmpstrlist[0], 
 tmpstrlist[2], tmpstrlist[3],tmpstrlist[4], tmpstrlist[1], nil, I * 2, 1));

 intW2 := self.words.Addobject(inttostr(I * 2 + 1), tword.create(tmpstrlist[0], 
 tmpstrlist[6], tmpstrlist[7],tmpstrlist[8], tmpstrlist[5], nil, I * 2 + 1, 2));

 tword(self.words.Objects[intW1]).translation := tword(self.words.Objects[intW2]);
 tword(self.words.Objects[intW2]).translation := tword(self.words.Objects[intW1]);

        language1 := tmpstrlist[1];
        language2 := tmpstrlist[5];

        if self.languages.IndexOf(language1) < 0 then
          self.languages.Add(language1);
        if self.languages.IndexOf(language2) < 0 then
          self.languages.Add(language2);
      end;
    end;
  finally
    tmpfile.free;
    tmpstrlist.free;
  end;

end;

destructor TMdictionary.destroy;
begin
  self.languages.free;
  self.words.free;
  inherited;
end;

{ tword }
                         //agrafika
constructor tword.create(agrafika, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);
begin
  self.grafika := agrafika;  //grafika := agrafika
  self.filename := afilename;
  self.text := atext;
  self.phonics := aphonics;
  self.number := anumber;
  self.language := alanguage;
  self.order := aorder;
end;

destructor tword.destroy;
begin
  ///
  inherited;
end;

end.

Pozostało 580 znaków

2017-01-05 22:25
Martyna
0

Chyba znalazłam rozwiązanie swojego problemu tylko potrzebuję Waszej pomocy:
Trochę namieszam ale mam nadzieje że zrozumiecie:
By umnie odtworzyć obrazek nie wystarczy:

procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.Picture.LoadFromFile(aword.grafika);
end;

Chodzi by zamienić typ tword na string

A dlaczego bo moja ścieżka jest ukryta tutaj

constructor create(agrafika, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);
                                                                                                                                                      //tutaj
 intW1 := self.words.Addobject(inttostr(I * 2), tword.create(tmpstrlist[0], 
 tmpstrlist[2], tmpstrlist[3],tmpstrlist[4], tmpstrlist[1], nil, I * 2, 1));
                                                                                                                                                       //tutaj
 intW2 := self.words.Addobject(inttostr(I * 2 + 1), tword.create(tmpstrlist[0], 
 tmpstrlist[6], tmpstrlist[7],tmpstrlist[8], tmpstrlist[5], nil, I * 2 + 1, 2));
{ tword }
constructor tword.create(agrafika, atext, aphonics, afilename, alanguage: string; atranslation: tword; anumber, aorder: integer);
begin
  self.grafika := agrafika;     // tutaj
  self.filename := afilename;
  self.text := atext;
  self.phonics := aphonics;
  self.number := anumber;
  self.language := alanguage;
  self.order := aorder;
end;

W Programie jest też odtwarzanie mp3 które też by wczytać ścierzkę zamienia Tword na string
Nie wiem jak to pochytać z Image moja wiedza jest jeszcze ograniczona poza tym to nie mój kod jak pisałam na początku
Zamieszczę w skrócie przykład z play a reszta kodu jest w postach wyżej.
Z góry dziękuję za każdą pomoc

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
  res: string;
begin
    res := playfile(self.MediaPlayer1, tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).filename);
end:

A teraz w całości co najważniejsze z play

 public
    languages: tstringlist;
    words: tstringlist;
    constructor create(afilename: string);
    destructor destroy; override;
  end;

const
  playOK = 'OK';

function playfile(aMplayer: TMediaPlayer; afilename: string): string;
procedure Listamp3(const APath: String; AFilesList: TStrings);

implementation

function playfile(aMplayer: TMediaPlayer; afilename: string): string;
begin
  result := playOK;
  if not fileexists(afilename) then
  begin
    result := 'Brak pliku ' + afilename + ' .. !!!';
    exit;
  end;
  aMplayer.close;
  aMplayer.filename := afilename;
  aMplayer.Open;
  aMplayer.play;
end;
procedure TForm1.play(aword: tword);
begin
  if not fileexists(aword.filename) then
  begin
    showmessage('Brak pliku ' + aword.filename + ' .. !!!');
    exit;
  end;
  self.MediaPlayer1.close;
  self.MediaPlayer1.filename := aword.filename;
  self.MediaPlayer1.Open;
  self.MediaPlayer1.play;
end;
procedure TForm1.ButtonPlayClick(Sender: TObject);

begin
  if self.ListBox1.ItemIndex >= 0 then
  begin
    tmpWord := tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]);
    self.LabelInfo.Caption :=
      'pisownia : ' + tmpWord.text + #13 + #10 + //
      'wymowa : '   + tmpWord.phonics;
     self.play(tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]));
  end;
end;

Pomoże mi ktoś to złożyć jak zrobić to by to
Image1.Picture.LoadFromFile zadziałało

Pozostało 580 znaków

2017-01-05 22:59
0

Już Ci pisałem, że ten kod:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.LoadFromFile(aword.grafika);
end;

jest nieprawidłowy i kompilator wyrzuci błąd o nieznanym identyfikatorze AWord; Do metody LoadFromFile musisz przekazać łańcuch znaków, a w tym miejscu (czyli w konstruktorze formularza) nie masz dostępu do żadnego obiektu typu TWord, więc nie masz skąd pobrać ciągu Grafika;

Najpierw musisz załadować słownik, a dopiero później używać istniejących w pamięci obiektów typu TWord; Poza tym nie wiadomo czym jest Image1 oraz co i skąd ma wyświetlać.


Pozostało 580 znaków

2017-01-05 23:20
Martyna
0

Mogę prosić Byś w tym mi pomógł w miarę możliwości chęci i czasu
Ja dopiero zaczęłam naukę ale to to jeszcze nie ten poziom.
Do ukończenia zostało tylko to no jeszcze edytor dopracować plików konfiguracyjnych ale to już mam w zasadzie nie kończę tylko z powodów czy uda mi się te fotki otworzyć czy nie.
Bardzo bym prosiła

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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