Stowrzyć procedurę z parametrem Sender jak na przykład dla zwykłego przycisku i ją zadeklarowac w sekcji
public albo private, a następnie podac jej nazwę dla własności OnClick MenuItema. Poniżej masz przykład aby
uniknąć przyszłych pytań. Z tym że Ty operujesz na PopupMenu a ja dodawałem subitemy do pozycji w menu.
const
//...
LangDir = 'LANG\';
LangExt = '.lng';
//...
private
//...
AppPath : string;
LangFileName : string;
procedure LanguageClick(Sender : TObject);
//...
procedure TMainForm.FindLangFiles;
var
I : Integer;
Rec : Tsearchrec;
NewItem : TMenuItem;
StArr : TStringList;
begin
StArr := TStringList.Create;
try
if FindFirst(AppPath + LangDir + '*' + LangExt, faAnyfile, Rec) = 0 then
StArr.Add(Copy(Rec.Name, 1, Length(Rec.Name) - Length(LangExt)));
while FindNext(Rec) = 0 do
StArr.Add(Copy(Rec.Name, 1, Length(Rec.Name) - Length(LangExt)));
Findclose(Rec);
for I := 0 to StArr.Count - 1 do
begin
NewItem := TMenuItem.Create(Language1);
NewItem.Caption := StArr[I];
NewItem.Name := 'LngSubMenuItem' + IntToStr(I + 1);
NewItem.Checked := StArr[I] = LangFileName;
NewItem.OnClick := LanguageClick;
Language1.Add(NewItem);
end;
finally
Language1.Enabled := StArr.Count > 0;
StArr.Free;
end;
end;
procedure TMainForm.LanguageClick(Sender : TObject);
var
I : Integer;
begin
for I := 0 to Language1.Count - 1 do
Language1.Items[I].Checked := False;
with Sender as TMenuItem do
begin
Checked := True;
LangFileName := StringReplace(Caption, '&', '', [rfReplaceAll]);
end;
LoadLangFile(LangFileName);
end;
// i najlepiej w zdarzedniu OnShow dla głownej formatki:
AppPath := ExtractFilePath(Application.ExeName);
// wczytanie ustawień na przykład z pliku ini
if LangFileName <> '' then
begin
LoadLangFile(LangFileName);
end;
FindLangFiles;