powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / мультиязычность в выпадающем меню
10 сообщений из 10, страница 1 из 1
мультиязычность в выпадающем меню
    #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
мультиязычность в выпадающем меню
    #39727589
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложить полные имена файлов в список.
В меню добавлять пункты только с именем и тэгом, равным индексу в массиве.
В обработчике клика доставать по тэгу полное имя из списка.

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

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


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

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


И кстати, раньше свойства нельзя было передавать как var параметры
...
Рейтинг: 0 / 0
мультиязычность в выпадающем меню
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / мультиязычность в выпадающем меню
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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