[delphi] zamiana slow

0

cześć

Pracuje nad programikiem, który zamienia słowa z polskiego na angielski. Zrobiłem zapis słów polskich do pliku ini i je wczytuje. Słowa są zapisane bez spacji i ze spacją tzn
1 zapis to domauto
2 zapis to dom
auto
Zamiana słów pojedynczych jest prosta zrobiłem

  if (edit2.text = 'auto') then  slowo:=slowo+  'car';
  memo1.text:=slowo;

problem mam z tym słowem bez spacji bo zrobiłem

for c:=1 to length(edit2.text) do
begin
if (edit2.text[c] = 'auto') then  slowo2:=slowo2 +  'car';
if edit2.text[c] = 'dom' then slowo2 := slowo2 +'home';

 end;
memo3.text:=slowo2;
end;

proszę o pomoc

0

Nie wiem co chcesz osiągnąć, bo trochę zakręcenie napisałeś, ale pobawiłem się chwilę w robienie
prostego słownika i polecam użyć takiego kodu jak poniżej. Najpierw plik ini ze słowami wygląda tak:

[slowa]
auto=car
autko=mini car
cosik=something

A kod, który ładuje słowa do odpowiednich StringList i pozwala na wyszukiwanie bez względu na
wielość liter, a także wyszukuje słowa, których tylko początek został wpisany na przykład "aut".
Drugi przycisk tłumaczy w drugą stronę z anelskiego na polski, o ile takie rozwiązanie Ci pasuje.
Jeżeli nie, znasz już ideę, więc nie problem stworzyć drugi plik INI ze słowami angielskio polskimi
i odpowiednio go wczytać. Mam nadzieję, że o to Tobie chodziło i kod się przyda. Odpisz czy tak.

  public
  AppPath : string;
  IniFIle : TIniFIle;
  PolList, EngList : TStringList;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
// Wczytanie słownika oraz przygotowanie listy słów angielskich
var
I : integer;
begin
Application.Title := Caption;
EngList := TStringList.Create;
PolList := TStringList.Create;
AppPath := ExtractFIlePath(Application.ExeName);
IniFIle := TIniFIle.Create(AppPath + 'slownik.ini');
IniFIle.ReadSection('slowa', PolList);
IniFIle.ReadSectionValues('slowa', EngList);
for I := 0 to EngList.Count - 1 do
begin
EngList[I] := Copy(EngList[I], Pos('=', EngList[I]) + 1, Length(EngList[I]));
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
// z polskiego na angielski
var
I : integer;
PolStr, EngStr : string;
begin
if Edit1.Text <> '' then
begin
Memo1.Clear;
for I := 0 to PolList.Count - 1 do
begin
PolStr := PolList[I];
if (AnsiLowerCase(Copy(Edit1.Text, 1, Length(Edit1.Text)))) =
AnsiLowerCase(Copy(PolStr, 1, Length(Edit1.Text))) then
begin
EngStr := EngList[I];
Memo1.Lines.Add(PolStr + ' = ' + EngStr);
end;
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
// z angielskiego na polski
var
I : integer;
PolStr, EngStr : string;
begin
if Edit1.Text <> '' then
begin
Memo1.Clear;
for I := 0 to EngList.Count - 1 do
begin
EngStr := EngList[I];
if (AnsiLowerCase(Copy(Edit1.Text, 1, Length(Edit1.Text)))) =
AnsiLowerCase(Copy(EngStr, 1, Length(Edit1.Text))) then
begin
PolStr := PolList[I];
Memo1.Lines.Add(EngStr + ' = ' + PolStr);
end;
end;
end;
end;

Sorrki za brak formatowania kodu, ale pisałem w pospiechu, dojdziesz co i jak :)

0

bawiłem się podobnie i niemile się zaskoczyłem kiedy INI odmówił mi zapisu powyżej 64k tekstu.

0
JacobTheLiar napisał(a)

bawiłem się podobnie i niemile się zaskoczyłem kiedy INI odmówił mi zapisu powyżej 64k tekstu.

Też miałem kiedyś z tym problem,. ale dotyczł on Delphi w wersji 3, pod siódemką chyba tego
problemu nie ma. A nawet jak tak to zawsze można uzyć komponentu IniFIles32, który jest o
ile wierzyć autorowi pozbawiony tego problemu. Komponent można ściągnąć z www.torry.net,
a konkretnie z pod adresu http://www.torry.net/vcl/system/registry/ini32.zip - później wypakować
i wrzucić plik inifiles32.pas do katalogu z programem, a w kodzie - w sekcji uses zamiast IniFiles
wpisać IniFiles32, a zamiast typu TIniFile użyć TIniFile32. Ale jak pisałem ten problem dotyczy trójki.

0

dzięki wielkie olesio :)

a mam jeszcze pytanie
czy jak mam jakiś ciąg np autokoautogaraz w label1 to czy można to rozbić na osobne słowa ?? tzn do label1=autoko label2=auto label3 garaz??

0

Bez separatora cięzko wyodrębnić słowa, zaŁÓżmy że użyjesz znaku "|" i poniższego kodu to do
kolejnych elementów StringListy trafią osobne słowo, a później przypisujesz je do Label Caption:

function Explode(Str: string; Separator: string = ';'): TStringList;
var
X: Integer;
begin
Result := TStringList.Create;
X := Pos(Separator, Str);
while X > 0 do begin
Result.Add(Copy(Str, 1, X-1));
if X <= Length(Str) then
Str := Copy(Str, X + Length(Separator), Length(Str));
X := Pos(Separator, Str);
end;
if (Length(Str) > 0) then
Result.Add(Str);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Tekst : string;
TempList : TStringList;
begin
Tekst := 'autko|auto|garaz';
TempList := TStringList.Create;
TempList.Clear;
TempList := Explode(Tekst, '|');
Label1.Caption := TempList[0];
Label2.Caption := TempList[1];
Label3.Caption := TempList[2];
TempList.Free;
end;

W nowszych wersjach Delphi [na przykład w siódemce] można prościej. Na przykład w taki sposób:

var
Tekst : string;
TempList : TStringList;
begin
Tekst := 'autko|auto|garaz';
TempList := TStringList.Create;
TempList.Delimiter := '|';
TempList.DelimitedText := Tekst;
Label1.Caption := TempList[0];
Label2.Caption := TempList[1];
Label3.Caption := TempList[2];
TempList.Free;
end;

Napisz czy takie rozwiązania Tobie odpowiadają.

0

tak działa idealnie ten kod dla delphi7 bo takie mam :)

bardzo dziękuję Olesio za pomoc :)

0

Dzięki bardzo Olesio !

0

Prosze bardzo, cieśzę się że mogłem Wam pomóc. Tylko dodam, że jednak dla plików INI które mają
powyzej 64KB należy użyć wspomnianego komponentu IniFIle32 (adres na końcu posta). Bo zapis no
i odczyt pojedynczej sesji działą ok, ale już funkcje takie jak ReadSection oraz ReadSectionValues nie
wczytają wszystkich sekcji w sposób prawidłowy: http://www.torry.net/vcl/system/registry/ini32.zip

0

dzięki Olesio jeszcze raz :)

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