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

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.
0

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

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".

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.
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
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.

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;

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.


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

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ć.

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

0

Jak chcesz uzyskać pomoc to zadawaj konkretne pytania i konkretnie na pytania odpowiadaj;

Co ma wyświetlać komponent Image1 i skąd ma uzyskać ścieżkę?

0

Tak chociaż w zasadzie wszystko by dojść do wyświetlenia obrazka
bo naprawdę się staram kombinuje ale już dostaje małpiego rozumu,
tak jak mówię rzuciłam się z motyką na słońce ale chce to z czyjąś pomocą dokończyć

0

Możesz choć raz wprost odpowiedzieć na pytanie?

0

Przepraszam
Jak załadować słownik, co ma wyświetlać komponent Image1 i skąd ma uzyskać ścieżkę i jak powinna wyglądać prawidłowo funkcja LoadFromFile By wyświetlić w moim przypadku obrazek w komponencie TImage

0

Jak załadować słownik

Najpierw pokaż jak wyglądają dane w słowniku, bez wykropkowanych fragmentów - po prostu oryginalną jego treść;

co ma wyświetlać komponent Image1

Mnie się pytasz? To u ciebie w kodzie jest instrukcja ładowania obrazka do niego, więc to Ty mi powiedz co do niego chcesz załadować i skąd (z jakiego pliku i gdzie umieszczonego na dysku);

i jak powinna wyglądać prawidłowo funkcja LoadFromFile By wyświetlić w moim przypadku obrazek w komponencie TImage

Powinna dostać w argumencie ścieżkę do pliku graficznego; Sama ścieżka powinna mieć zwykłą, standardową budowę i może być albo względna (relatywna), albo bezwzględna (absolutna), byle faktycznie pod tą ścieżką znajdował się plik z obrazem.

0
C:\Pictures\b;DE;Gut Morgen;gut morgen;de\Podstawowe zwroty\Gut Morgen.mp3;PL;Dzień dobry;dzien dobry;pl\Podstawowe zwroty\Dzień dobry.mp3

Wszystko działa i się odtwarza prawidłowo
Potrzebuje tylko uzyskać dostęp do ścieżki graficznej i ją wyświetlić to jest ta agrafika w konstruktorze
wszystko jest dobrze tylko nie potrafię się do niej dostać

0

Z tego co widzę, za przechowywanie w pamieci całego słownika załadowanego z pliku odpowiada klasa TMDictionary; Daje ona dostęp do list Words oraz Languages; Obiekt klasy TMDictionary zadeklarowany jest jako pole klasy najpewniej formularza, o nazwie MDictionary; Obiekt ten nie jest nigdzie stworzony, więc nie można go użyć;

W konstruktorze formularza musisz najpierw utworzyć instancję klasy TMDictionary:

MDictionary := TMDictionary.Create('tutaj podać ścieżkę pliku słownika');

a po niej, możesz wyłuskać swoją ścieżkę, posługując się poniższą konstrukcją:

TWord(MDictionary.Words.Objects[0]).Grafika

To się nazywa rzutowanie - jest konieczne, bo w liście oprócz łańcuchów znaków, przechowujesz obiekty typu TWord, a sama lista przyjmuje obiekty ogólnego typu, czyli TObject; Żeby to było możliwe, pole Grafika w klasie TWord musi być w sekcji co najmniej public;

Teraz już można załadować słownik i pobrać ścieżkę grafiki dla komponentu Image1:

procedure TForm1.FormCreate(Sender: TObject);
var
  LFileName: String;
begin
  MDictionary := TMDictionary.Create('tu ścieżka pliku słownika');

  LFileName := TWord(MDictionary.Words.Objects[{tu indeks pozycji w liście}]).Grafika;
  Image1.Picture.LoadFromFile(LFileName);
end;

Według kodu który już masz, musisz znać ścieżkę do pliku słownika, a do pozyskania ścieżki do grafiki dla Image1 musisz w kwadratowych nawiasach podać indeks pozycji na liście słownika.

0

Ja wiem że bardzo chcesz pomóc za dziękuję
To wszystko mam podawałam

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;

Chodzi o to że to jest typ **tword
**

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

a ścieżka jest string trzeba tylko zrobić jak z funkcją play dlatego ją wyżej podałam wraz z przykładami bo inaczej nie ma do ścieżki dostępu

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


wyżej jest cała funkcja ale jak widzę coś takiego

res := playfile(self.MediaPlayer1, tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).filename);
end:

to nie potrafię tego zrobić z Image1
Nie wiem jak poprawnie to zapisać z Image1
Trzeba poprawnie zamienić tword na string
i jak wtedy będzie wyglądać LoadFromFile

0

Ja wiem że bardzo chcesz pomóc za dziękuję

Zawsze mogę pomóc za złotówki, albo dolary;

Nie wiem jak poprawnie to zapisać z Image1

Najprościej jest skopiować to co masz i wkleić wewnątrz nawiasów wywołania metody LoadFromFile:

Image1.Picture.LoadFromFile(TWord(ListBox1.Items.Objects[selfListBox1.ItemIndex]).FileName);

Tyle że czytelność jest słaba, dlatego lepiej będzie łańcuch wpisać sobie do pomocniczej zmiennej, a tę z kolei podać w parametrze LoadFromFile:

var
  LFileName: String;
begin
  LFileName := TWord(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileName;
  Image1.Picture.LoadFromFile(LFileName);

Trzeba poprawnie zamienić tword na string

Nie zamienieć, a uzyskać dostęp do składowej obiektu; Zamiana kojarzy się z konwersją całego obiektu na jeden łańcuch znaków, a przecież nie o to chodzi.

0

Jest tak zdesperowana tyle nocy nie przespanych z tym jednym ja już klasy tworzyłam żebyś Ty do widział :) że z chęcią zapłacę ostatnie grosze by to ukończyć....

acha tylko że zamiast LFileName: String; daje agrafika : string ? bo ona jest tym rekordem [0]

0

Jeszcze w funkcji play jest aword typu tword nie trzeba umnie tego możesz zerknąć na ten Play poniżej

publiic
    procedure play(aword: tword);
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;

i w drugim Unit dicionary jest funkcja play

function playfile(aMplayer: TMediaPlayer; afilename: string): string;
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;
0

Zrobiłam tak:

procedure TForm1.FormCreate(Sender: TObject);
var
  agrafika: String;
begin
 agrafika:= TWord(ListBox1.Items.Objects[ListBox1.ItemIndex]).FileName;
  Image1.Picture.LoadFromFile(agrafika);
end;

Jeszcze czegoś brakuje bo do Listboxa się odwołuje bo jest komunikat po uruchomieniu List index out of bounds (-1)
ale to nic to przez to ze plik nie jest wczytany do ListBoxa ale po wczytaniu wszystko chodzi ale grafiki dalej nie pokazuje
to jest coś z tymi zmiennymi i typami
dla mp3

filename := afilename
dla grafiki
grafika := agrafika

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

ale już chyba blisko

0

Jeszcze czegoś brakuje bo do Listboxa się odwołuje bo jest komunikat po uruchomieniu List index out of bounds (-1)

Dostajesz ten błąd dlatego, że podczas tworzenia formularza, ListBox nie zawiera jeszcze zaznaczonej żadnej pozycji - stąd ItemIndex zwraca wartość -1; Wyjątek otrzymujesz podczas próby dostania się do pozycji o indeksie -1; Nawet gdyby w tym momencie ListBox posiadal jakąś zawartość to i tak jego pozycje indeksowane są od 0 do n-1, gdzie n to liczba pozycji listy;

ale to nic to przez to ze plik nie jest wczytany do ListBoxa

Dokładnie dlatego;

ale grafiki dalej nie pokazuje
to jest coś z tymi zmiennymi i typami

Podany kawałek kodu, pomimo złego formatowania, składniowo jest prawidłowy - przyczyna błędów na pewno znajduje się zupełnie gdzieś indziej; Obstawiam, że pole Grafika w obiekcie zawiera błędną ścieżkę i jeśli tak faktycznie jest to powinnaś dostać kolejny wyjątek w linii wywołania metody LoadFromFile.

0

ścieżka jest poprawna zrobiłam teraz tak poszłam za ciosem i starałam się zrobić tak samo jak w play
a więc dodałam funkcje podaje obie tą z play i tą co ja zrobiłam
na Unit dictionary dodałam w uses extCtrls obsługę TImage

procedure Listamp3(const APath: String; AFilesList: TStrings);
function pokazgrafike(aMgraf:TImage; agrafika: string):string;

oraz wykonanie

function pokazgrafike(aMgraf:TImage; agrafika: string):string;
 begin
   AmGraf.Picture.LoadFromFile(agrafika);
 end;

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;

oraz z głównego Unitu

procedure TForm1.ListBox1DblClick(Sender: TObject);
var
  res: string;
  res2:string;
  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;
    res := playfile(self.MediaPlayer1, tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).filename);
    res2:=pokazgrafike(self.Image1, TWord(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).grafika);

    if res <> playOK then
    begin
      showmessage(res);
      exit;
    end;
  end
  else
    showmessage('Nie wybrano słowa ..');
end;

Zastanawia mnie ta linijka w kodzie wyżej

 tmpWord := tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]);

Jak jest tak to po ListBox1DblClick wyskakuje komunikat

unknow picture file extension (.mp3)
teraz bo coś pozmieniałam zamiast .(mp3) wyskakuje to samo tylko bez mp3 (.)

0

sorki bo wyżej podałam lista mp3

jeszcze raz obie

function playfile(aMplayer: TMediaPlayer; afilename: string): string;
function pokazgrafike(aMgraf:TImage; agrafika: string):string

reszta bez zmian

0
  //to filename na końcu jest powiązane z plikiem i rekordem z mp3, więc umnie musi być grafika
res := playfile(self.MediaPlayer1, tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).filename);
res2:=pokazgrafike(self.Image1, TWord(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).grafika);

a to dlatego:

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

wiec jeśli u mnie jest filename (na końcu) to komunikat brzmi:
unknow picture file extension (.mp3)

jeśli jest** grafika **komunikat brzmi
unknow picture file extension (.)

w uses jest** jpeg**.

0

unknow picture file extension (.mp3)

Wiesz w ogóle co ten komunikat znaczy?

nieznane rozszerzenie pliku graficznego (.mp3)

Nie dziw się, że ten wyjątek się pojawia, skoro próbujesz załadować plik dźwiękowy zamiast graficznego;

Musisz do metody Image.Picture.LoadFromFile podać ścieżkę do pliku graficznego, czyli np. do pliku z rozszerzeniem .jpg, .png, .bmp czy innego, byle z obrazem, a nie dźwiękiem.

0

Może tu jest problem:

begin
  self.languages := tstringlist.create;
  self.directory := extractfilepath(afilename);     // Tutaj afilename to to przeciez ma związek z rekordem z pliku konfiguracyjnego
                                                                          
  words := tstringlist.create;
  words.OwnsObjects := true;

  tmpfile := tstringlist.create;
  tmpstrlist := tstringlist.create;
  try
    tmpfile.LoadFromFile(afilename);               // wczytujemy mp3(afilename) ale nie jpeg (agrafika)    
    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));

Tylko jak tu dodać agrafika

tmpfile.LoadFromFile(afilename); 

żeby to miało ręce i nogi o ile to jest to

Bo to już musi być to skoro wywala takie komunikaty

Nie śpię kolejną noc szukając rozwiązania ale tylko z Waszą pomocą mogę dać radę

0

Tak wiem i tak mam ścieżka jest poprawna bo skopiowana z właściwości pliku

C:\Pictures\b.jpg;DE;Gut Morgen;gut morgen;de\Podstawowe zwroty\Gut Morgen.mp3;PL;Dzień dobry;dzien dobry;pl\Podstawowe zwroty\Dzień dobry.mp3
C:\Pictures\a.jpg;aus widerszejn;de\Podstawowe zwroty\Auf Wiedersehen.mp3;PL;Do widzenia;do widzenia;pl\Podstawowe zwroty\Do widzenia.mp3

zobacz jak odwołam się do **grafika
**wtedy jest
Unknow picture file extension (.)

a to jest poprawne odwołanie

zmieniłam z file name na plikmp3 bo to filename doprowadzało do obłedu

res := playfile(self.MediaPlayer1, tword(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).plikmp3);
res2:=pokazgrafike(self.Image1, TWord(self.ListBox1.Items.Objects[self.ListBox1.ItemIndex]).grafika);

zmieniłam to tu

type
  tword = class
    number: integer;
    order: integer;
    grafika: string;
    translation: tword;
    plikmp3: string;   // było filename
    text: string;
    phonics: string;
    language: string;

i tu

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

bo nie wiadomo było czy to magiczne słowo czy zmienna i powodowało nie zrozumienia

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