Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 мультиязычность в выпадающем меню  [new]
VladimirVVP
Member

Откуда:
Сообщений: 17
Мне нужно вывести список файлов из папки в выпадающем меню
известно, что все файлы с расширением *.ini
колличество файлов не известно (может менятся)
при клике по имени должно происходить событие(нужно ini записать адрес выбранного файла).

fiLang:TStringList;
i,s: integer;
mnFile: TMenuItem;
subfiLangi: TMenuItem;

st:string;
begin
 mnFile := TMenuItem.Create (Form1.MainMenu);
 mnFile.Caption := 'Языки';
 Form1.MainMenu.Items.Add(mnFile);
 fiLang := TStringList.Create;
 fiLang.Text := GetFilesList('languages','*.ini',false);
 s := fiLang.Count-1;
 for i:=0  to s  do
 begin
      subfiLangi:= TMenuItem.Create (Form1.MainMenu);
      subfiLangi.Caption := (fiLang[i]);
      subfiLangi.OnClick := @clicklang;
      mnFile.Add(subfiLangi);
 end;
 fiLang.free  ;
end;

Список файлов в выпадающем меню выводит, но только с полным адресом... а мне нужно только имя этого файла

И вот тут я не могу понять как мне получить в procedure ckliclang адрес выбранного файла

procedure ckliclang (Sender: string);
var
ini:TiniFile;
begin
 ini :=TIniFile.Create(ExtractFilePath (ParamStr (0))+'languagesOptions.ini');
 ini.WriteString('lang','directlang',??????????);
 ini.free ;
end;
begin
3 ноя 18, 15:18    [21723275]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46152

Сложить полные имена файлов в список.
В меню добавлять пункты только с именем и тэгом, равным индексу в массиве.
В обработчике клика доставать по тэгу полное имя из списка.

Какой из этих пунктов не очевиден или слишком сложен для тебя?

Posted via ActualForum NNTP Server 1.5

3 ноя 18, 15:27    [21723279]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
VladimirVVP
Member

Откуда:
Сообщений: 17
Dimitry Sibiryakov,
автор
В обработчике клика доставать по тэгу полное имя из списка.

не пойму как
3 ноя 18, 19:02    [21723358]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 97
VladimirVVP,

тэг - это свойства компонента (TComponent) типа Integer, предназначение - "для пользователя, на всякий случай".
Вот и пришел этот случай.
Храни в tag индекс элемента массива, содержащего полные пути. Сам массив наполняй в момент построения меню.

var
  aFiles : array of string;
...
procedure ...Построение_меню();  
begin
  while (перебор файлов) do begin 
...
    SetLength(aFiles, Length(aFiles) + 1);
    aFiles[High(aFiles)] := полное_имя_очередного файла;
    Новый_Элемент_Меню.tag := High(aFiles) 
...

procedure <Класс формы>.ОбработчикСобытияЭлементаМенюOnClick(Sender: TObject);  
var
  fFullFileName : string;
...
begin
  fFullFileName :=  aFiles[FullTComponent(Sender).Tag];
...
3 ноя 18, 19:23    [21723366]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
AleksR
Member

Откуда:
Сообщений: 77
VladimirVVP,

При формировании меню удобно сделать так:
subfiLangi.Caption := ExtractFileName(fiLang[i]);
subfiLangi.Hint := (fiLang[i]);

а в процедуре обработчике OnClick(Sender)
получить имя так:
 LangFilename :=  (Sender as TMenuItem).Hint;



теги и доп массивы при этом не нужны, и кода - минимум
4 ноя 18, 00:05    [21723466]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
VladimirVVP
Member

Откуда:
Сообщений: 17
Работает...

procedure Form1_OnShow (Sender: TObject; Action: string);
var
fiLang:TStringList;
i,s: integer;
mnFile: TMenuItem;
subfiLangi: TMenuItem;
st:string;
begin
 mnFile := TMenuItem.Create (Form1.MainMenu);
 mnFile.Caption := 'Язык';
 Form1.MainMenu.Items.Add(mnFile);
 fiLang := TStringList.Create;
 fiLang.Text := GetFilesList('languages','*.ini',False);
 s := fiLang.Count-1;
for i:=0  to s  do
 begin
  subfiLangi:= TMenuItem.Create (Form1.MainMenu);
  subfiLangi.Caption := ExtractFileName(fiLang[i]);
  Delete(subfiLangi.Caption, Length(subfiLangi.Caption) -3 , 4);
  subfiLangi.Hint := (fiLang[i]);
  mnFile.Add(subfiLangi);
  subfiLangi.OnClick := @clicklang;
end;
  fiLang.free  ;
end;


procedure clicklang (sender: string);
var
ini:TiniFile;
y:string;
begin
y:=TMenuItem(Sender).Hint;
showmessage(y);
ini :=TIniFile.Create(ExtractFilePath (ParamStr (0))+'languagesOptions.ini');
ini.WriteString('lang','directlang',y);
ini.free ;
end;
5 ноя 18, 16:50    [21724337]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 97
VladimirVVP,

  subfiLangi.Caption := ExtractFileName(fiLang[i]);
  Delete(subfiLangi.Caption, Length(subfiLangi.Caption) -3 , 4);

ну ё... есть же ExtractFilePath()...
5 ноя 18, 18:11    [21724427]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 97
...а, ты знаешь, это у тебя "оптимизиция" такая...
5 ноя 18, 18:12    [21724428]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10605
VladimirVVP
Delete(subfiLangi.Caption, Length(subfiLangi.Caption) -3 , 4);
Я бы писал так
subfiLangi.Caption := ChangeFileExt(subfiLangi.Caption, '');

И кстати, раньше свойства нельзя было передавать как var параметры
5 ноя 18, 19:44    [21724516]     Ответить | Цитировать Сообщить модератору
 Re: мультиязычность в выпадающем меню  [new]
AleksR
Member

Откуда:
Сообщений: 77
VladimirVVP,

ну и TStringList; тут все-такие лишнее звено, загугли TSearchRec и сделай по человечески, примерно так:
на OnPopup у твоего пункта меню Язык (назовем его mmLanguage, почему бы его не сделать в design-time?)
var
  FSearchRec  : TSearchRec;
  FindResult  : integer;

FindResult := FindFirst(ProgramWorkSpace_Dir + '*.ini',
                      SysUtils.faAnyFile + SysUtils.faHidden +
                      SysUtils.faSysFile + SysUtils.faReadOnly,
                      FSearchRec);
  try
    while FindResult = 0 do
    begin
      subfiLangi := TMenuItem.Create(mmLanguage);
      mmLanguage.Add(subfiLangi);
      subfiLangi.Caption := FSearchRec.Name;
      subfiLangi.Hint := ProgramWorkSpace_Dir + subfiLangi.Caption;
      subfiLangi.OnClick := mmDefaultLangOnClick;
      FindResult := FindNext(FSearchRec);
    end;
  finally
    FindClose(FSearchRec);
  end;
6 ноя 18, 01:50    [21724760]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить