[DELPHI] OnClick dynamicznie dodanej pozycji w TPopupMenu

0

Jak w temacie - w jaki sposób mogę ustawić jakąś procedure z parametrem?

 procedure TAD.AddMenuItem(itemName: string; ch : integer; pl : string);
var
  NewItem: TMenuItem;
begin
  NewItem := TMenuItem.Create(nil);
  with NewItem do
  begin
    Caption := itemName;
    if ch = 1 then Checked:=true;
    OnClick := Showmessage(pl); // tutaj
  end;
  PopupMenu1.Items.Add(NewItem);
end;
0

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;
0

No tak ale jeżeli 2 pozycje mają taki sam Caption a muszą wykonać procedurę różnymi parametrami?

0

Nie mogę dla każdej pozycji napisać osobnej procedury bo są to elementy generowane z plików tekstowych gdzie nazwa jest przypisywana wewnątrz pliku tekstowego i może być taka sama dla 2 różnych plików :( a ich liczba jest zmienna
;-(

0

A to nie możesz utowrzyć zmiennej globalnej używanej w procedurze - dla OnClicka i odpowiednio ją ustawiać na
wartość zmiennej Pl, a w procedurze odczytywać i odpowiednio reagować jeżeli trzeba. Innego pomyslu nie mam.

0

Omyłkowo napisałem w tym wątku http://4programmers.net/Forum/viewtopic.php?id=37326
żeby nie dublować postów proszę o pomoc tam :)

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1