Chciałbym napisać w Delphi słownik, tzn. wpisuje słowo w jednym języku i wyskakuje słowo w drugim, nie chodzi o tłumaczenie zdań. Problem tkwi w tym że nie wiem jak zrobic baze danych słow. Czy ktos poda jakiś pomysł. Myślałem nad dwoma plikami tekstowymi, jeden ze slowami w j.polskim drugi w angielskim.
Możliwości masz bardzo dużo. Nawet można na plikach ini :) delphi XE3 ma już wbudowane komponenty obsługujące bazę SQLite.
Najłatwiej skorzystać z plików *.ini
bądź TStringList
.
Najwydajniej skorzystać z jakiejś lokalnej bazy danych zapisywanej do pliku.
Bazy SQL były by ciekawym rozwiązaniem, ale jeśli nie znasz jeszcze ich obsługi i przede wszystkim potrzebujesz to zrobić jak najprościej, to skorzystaj z plików INI
; Zrób w tym pliku tyle sekcji, ile jest liter i w każdej sekcji wpisz najlepiej alfabetycznie posortowane słowa; W programie utwórz obiekt klasy TINIFile
i sprawdź, czy w sekcji o literze takiej, jaka jest pierwsza szukanego słowa istnieje klucz o nazwie takiej, jakie szukane słowo; Dla przykładu:
; Plik INI
; Słownik polsko-angielski
[l]
{...}
liczba=number
{...}
wyszukasz w sekcji l
klucza o nazwie liczba
i jeśli taki klucz istnieje - zwracasz jego wartość (tu: number
); Aby sprawdzić, czy dane słowo istnieje w słowniku możesz wykorzystać dwie metody:
- sprawdzić, czy istnieje klucz o nazwie
liczba
za pomocą metodyiniFile.ValueExists
i jeśli istnieje - pobrać wartość tego klucza metodąiniFile.ReadString
, - bez sprawdzania istnienia klucza pobrać wartość klucza o nazwie
liczba
ustawiając wartość domyślną na pusty ciąg, po czym sprawdzić tą wartość - jeśli jest pusty ciąg to znaczy, że takie słowo nie istnieje w słowniku, a jeśli zwróci jakąkolwiek inną wartość to słowo istnieje;
Przykładowa funkcja zwracająca angielski odpowiednik słowaliczba
:
uses INIFiles;
function TranslateWord(const ASearchWord: String; var{/out} AEquivalent: String): Boolean;
var
iniDictionary: TINIFile;
begin
iniDictionary := TINIFile.Create('C:\Pol-Ang.ini');
try
AEquivalent := iniDictionary.ReadString(ASearchWord[1], ASearchWord, '');
Result := AEquivalent <> '';
finally
iniDictionary.Free();
end;
end;
wykorzystanie:
const
SEARCH_WORD = 'liczba';
var
sEquivalent: String;
begin
if TranslateWord(SEARCH_WORD, sEquivalent) then
Write('"', SEARCH_WORD,'" [PL] = "', sEquivalent, '" [ANG]')
else
Write('Search word is not found...');
ReadLn;
end.
Jest to bardzo proste rozwiązanie, jednak przy sporej ilości słów w słowniku może działać wolno.