[ overflow @ 09.04.2004. 19:02 ] @
Ararrarararggh ...
Vec 3 (tri) sata pokusavam, ali bezuspesno, da napravim sledece. Imam neki dir, recimo "C:\test". U njemu se nalaze neki fajlovi. Ja zelim da napravim meni u kome ce biti izlistani svi fajlovi iz tog direktorijuma, a posto se klikne na stavku tako dobijenog menija potrebno je da se pokrene taj fajl.
Meni mora da sadrzi imena fajlova, ali bez ekstenzija. Pogadjate, pravim MLS (MultiLanguageSupport), ali umesto imena fajlova u meniju dobijam kuke i kvake (pa tako i po pokretanju tih fajlova pokrecem unknown fajlove) iako sam kroz debuger video da se sve upisuje na svoje mesto ... HELP.

Evo ga i moj kod ...

Code:

  ...
    aJezik: TAction;
    FLB : TFileListBox;
    LangMenu: TActionClientItem; // root menija u kome vrsim kreiranje stavki
  ...

procedure TfrmMain.FormCreate(Sender: TObject);
var
  aJezikAnc: TAction;
  aci: TActionClientItem;
  i: integer;
  jezik: string;
begin
  inherited;
  ...
  if Assigned(LangMenu) then
  begin
    FLB.Directory := programPath + 'lang\';
    LangMenu.Items.Clear;
    if FLB.Items.Count > 0 then
      for i := 0 to FLB.Items.Count - 1 do
      begin
        aJezikAnc := TAction.Create(self);
        aJezikAnc.Assign(aJezik);
        aJezikAnc.Tag := 5;
        jezik := Copy(flb.items[i], 1, length(flb.items[i]) - 4);
        aJezikAnc.Caption := jezik;
        aci := LangMenu.Items.Add;
        aci.Action := aJezikAnc;
        aci.Caption := jezik;
      end;
  end;
end;

procedure TfrmMain.aJezikExecute(Sender: TObject);
var act: TAction;
begin
  inherited;
  act := TAction(Sender);
  ShowMessage(act.Caption);
  // *****************
  //  SHOWMESSAGE ispisuje kuke i kvake!!!
end;
[ morlic @ 10.04.2004. 11:09 ] @


1) Ova linija

Code:
aJezikAnc.Assign(aJezik);


nije ispravna. U principu to radis samo da bi omogucio izvrsavanje akcije. Bolje zameni sa:

Code:

aJezikAnc.OnExecute := aJezikExecute;


2) Ono inherited ti takodje ne treba za izvrsavanje akcije

3) Ova linija ne treba tako da izgleda

Code:

jezik := Copy(flb.items[i], 1, length(flb.items[i]) - 4);
aJezikAnc.Caption := jezik;

vec

aJezikAnc.Caption :=  ChangeFileExt(flb.items[i], '');



Za ostatak bih morao da probam u Delphi-u. Probaj ove izmene pa da vidimo. U principu ne bi trebao da koristis TFileListBox vec da napravis u kodu odgovarajuci metod za listanje foldera (FindFirst i FindNext) ili da skines JCL paket sa neta u kome imas vec gotove metode.
[ -zombie- @ 11.04.2004. 06:47 ] @
uz sve već rečeno, problem "vidim kuke i kvake" verovatno nema nikakve veze sa kodom za akcije.

jedini deo koji vidim da bi mogao da pravi probleme je kod za odstranjivanje extenzije, ali to si već dobio uputstvo da koristiš ChangeFileExt().

(a da, moguće je i da FileListBox ne poznaje unikod, pa te on zeza, ali i za to si dobio preporuku ;)


a sad malo nagađanja. da li si uopšte siguran da problem nije samo u ShowMessage() funkciji (tj da samo ona ne prihvata unikod), a da ostali deo programa radi, tj da fajlove ipak može da otvori (naravno, da se setiš da vratiš extenziju, opet sa Change... ;).

ako se ipak ispostavi da se string negde u toku izvršavanja programa "pokvari", time što mu se izgubi informacija o enkodingu u kome je, ili time što mu se nepravilno odfikari neki bajt, probaj da napraviš log koji će u fajl trpati vrednost stringa (ime fajla) pre i posle svake izmene od strane tvog programa.


poželjno je ovaj fajl posle posmatrati iz nekog pismenijeg editora koji ume da radi razne konverzije između unikoda-UTFa-ASCIIa-ITDa.. ;)

(ultraedit je kul, sem što mu hex view nije baš uvek verodostojan)
[ morlic @ 11.04.2004. 10:25 ] @
Sto se tice kuka i kvaka jedna napomena. Ukoliko u folderu imas fajlova sa cirilicom mozes da zaboravis ovakvo resenje. Problem je u tome sto FindFirst i FindNext ne rade ispravno sa unicode nazivima gde se koristi ekstremnija varijanta jezika (npr. cirilica). U MSDN-u postoji nekoliko poglavlja vezanih za to. To je losa vest. Dobra vest je da se kroz NET platformu u potpunosti moze pristupiti takvim folderima i fajlovima. Ja sam licno radio u C# neki mali projekat i mogu reci da sam odusevljen. Jos u samom editoru (Visual Studio) mozes da kucas cirilicu kao sadrzaj stringa (editor ti nudi UTF-8 kao opciju prilikom upisa fajla na disk).

Mislim da Total Comander tek od 5.5 verzije ispravno barata sa cirilicom.