Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / мультиязычность в выпадающем меню / 10 сообщений из 10, страница 1 из 1
03.11.2018, 15:18
    #39727586
VladimirVVP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
Мне нужно вывести список файлов из папки в выпадающем меню
известно, что все файлы с расширением *.ini
колличество файлов не известно (может менятся)
при клике по имени должно происходить событие(нужно ini записать адрес выбранного файла).

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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 адрес выбранного файла

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure ckliclang (Sender: string);
var
ini:TiniFile;
begin
 ini :=TIniFile.Create(ExtractFilePath (ParamStr (0))+'languagesOptions.ini');
 ini.WriteString('lang','directlang',??????????);
 ini.free ;
end;
begin
...
Рейтинг: 0 / 0
03.11.2018, 15:27
    #39727589
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
Сложить полные имена файлов в список.
В меню добавлять пункты только с именем и тэгом, равным индексу в массиве.
В обработчике клика доставать по тэгу полное имя из списка.

Какой из этих пунктов не очевиден или слишком сложен для тебя?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.11.2018, 19:02
    #39727648
VladimirVVP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
Dimitry Sibiryakov,
авторВ обработчике клика доставать по тэгу полное имя из списка.
не пойму как
...
Рейтинг: 0 / 0
03.11.2018, 19:23
    #39727651
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
VladimirVVP,

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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];
...
...
Рейтинг: 0 / 0
04.11.2018, 00:05
    #39727713
AleksR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
VladimirVVP,

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


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




теги и доп массивы при этом не нужны, и кода - минимум
...
Рейтинг: 0 / 0
05.11.2018, 16:50
    #39728142
VladimirVVP
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
Работает...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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;
...
Рейтинг: 0 / 0
05.11.2018, 18:11
    #39728189
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
VladimirVVP,

Код: pascal
1.
2.
  subfiLangi.Caption := ExtractFileName(fiLang[i]);
  Delete(subfiLangi.Caption, Length(subfiLangi.Caption) -3 , 4);


ну ё... есть же ExtractFilePath(). ..
...
Рейтинг: 0 / 0
05.11.2018, 18:12
    #39728190
Фэйтл Эра
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
...а, ты знаешь, это у тебя "оптимизиция" такая...
...
Рейтинг: 0 / 0
05.11.2018, 19:44
    #39728217
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
VladimirVVP
Код: pascal
1.
Delete(subfiLangi.Caption, Length(subfiLangi.Caption) -3 , 4);

Я бы писал так
Код: pascal
1.
subfiLangi.Caption := ChangeFileExt(subfiLangi.Caption, '');


И кстати, раньше свойства нельзя было передавать как var параметры
...
Рейтинг: 0 / 0
06.11.2018, 01:50
    #39728307
AleksR
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
мультиязычность в выпадающем меню
VladimirVVP,

ну и TStringList; тут все-такие лишнее звено, загугли TSearchRec и сделай по человечески, примерно так:
на OnPopup у твоего пункта меню Язык (назовем его mmLanguage, почему бы его не сделать в design-time?)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / мультиязычность в выпадающем меню / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]