Dzień dobry.
Czy dał by ktoś radę naprowadzić mnie trochę co robię nie tak?
Do istniejącego Menu dodaję dynamicznie dodatkową pozycję 'Wczytaj' wraz z submenu sczytywanymi z danych zawartych w plikach *.txt znajdujących się w katalogu X.
Do StatusBar1 próbuje przekierować informację o pozycji użytkownika w Menu.
Po otwarciu Menu StatusBar wyświetla Captiony poszczególnych pozycji menu tylko gdy w nich są zagnieżdżone kolejne menu. Jeżeli pozycja w menu jest ostatnia to nic się nie dzieje. Pomimo że, procedura jest OnClick działa jako OnMoseMove. Samo kliknięcie w pole Menu nic nie powoduje.
Zależy mi, aby po kliknięciu w 2021 (jak na zdjęciu) w StatusBar1 Był tekst: Agroplus + NOX + 2021.
Procedura OnPopup:
procedure TForm1.PopupMenu1Popup(Sender: TObject);
Var
Path, Path1, Got : String;
Lamane, Kropka, Dlugosc, i, j : integer;
TF : TextFile;
Str1, Str2 : String;
Dlugosc1, Dlugosc2 : integer;
Seppos1, Seppos2 : integer;
Wyraz1, Wyraz2 :String;
begin
// jeśli już istnieje to usuń
If PopUpMenu1.ComponentCount=2 Then
begin
PopUpMenu.Items[3].Destroy;
end;
// dodanie nowego elementu menu 'Wczytaj'
MenuItem := TMenuItem.Create(PopUpMenu);
MenuItem.Caption:='Wczytaj';
PopUpMenu.Items.Add(MenuItem);
// tworzenie submenu z plików zawartych w katalogu
j := 0;
For Path in TDirectory.GetFiles(OpenPictureDialog1.filename) do
begin
Lamane := Pos('/', Path);
Got := Copy(Path, Lamane+1);
Kropka := Pos('.', Got);
Got := Copy(Got, 1, Kropka-1);
Subitem := TMenuItem.Create(MenuItem);
Subitem.Caption := Got;
MenuItem.Add(Subitem);
AssignFile(TF, path);
Reset(TF);
i := 0;
while not Eof(TF) do
begin
//pobieranie pierwszysch wyrazów w pliku txt
ReadLn(TF, Str1);
Dlugosc1 := Length(Str1);
SepPos1 := Pos(';', Str1);
Wyraz1 := Copy(Str1, 1, SepPos1-1);
//tworzenie sub.submenu z pierwszysch wyrazów w pliku txt
Subitem2 := TMenuItem.Create(MenuItem);
Subitem2.Caption := Wyraz1;
MenuItem.Items[j].OnClick := Cos; // działa od najechania kursorem a nie przy OnClick
MenuItem.Items[j].Add(Subitem2);
//pobieranie drugich wyrazów w pliku txt
Dlugosc1 := Length(Str1);
SepPos1 := Pos(';', Str1);
Wyraz1 := Copy(Str1, SepPos1+1, Dlugosc1);
SepPos1 := Pos(';', Wyraz1);
Wyraz2 := Copy(Wyraz1, 1, SepPos1-1);
// tworzenie sub.sub.submenu z drugiego wyrazu
Subitem3 := TMenuItem.Create(MenuItem);
Subitem3.Caption := Wyraz2;
MenuItem.Items[j].items[i].OnClick := Cos2; //jak wyżej
Menuitem.Items[j].items[i].Add(Subitem3);
inc(i);
end;
inc(j);
CloseFile(tf);
end;
end;
Powyższa część kodu działa prawidłowo. Problem pojawia się niżej. Obie poniższe procedury uruchamiane są po najechaniu kursorem na pole Menu, a kliknięcie w menu nie wywołuje żadnej reakcji oprócz jego zamknięcia.
Procedura 1 OnClick dla SubMenu:
procedure TForm1.Cos (Sender : TObject);
var
i : Integer;
begin
MenuItem := Sender as TMenuItem;
i := Pos('&', MenuItem.Caption);
if i > 0 then
begin
MenuName := LeftStr(MenuItem.Caption, i-1) + RightStr(MenuItem.Caption, Length(MenuItem.Caption)-i);
end;
if i = 0 then
begin
MenuName := MenuItem.Caption;
end;
StatusBar1.SimpleText := MenuName + ' + ' + MenuItem.Hint;
end;
Procedura 2 OnClick dla SubMenu:
procedure TForm1.Cos2 (Sender : TObject);
var
i : integer;
begin
MenuItem := Sender as TMenuItem;
i := Pos('&', MenuItem.Caption);
if i > 0 then
begin
MenuName2 := LeftStr(MenuItem.Caption, i-1) + RightStr(MenuItem.Caption, Length(MenuItem.Caption)-i);
end;
if i = 0 then
begin
MenuName2 := MenuItem.Caption;
end;
StatusBar1.SimpleText := MenuName + ' + ' + MenuName2 + ' + ' + MenuItem.Hint;
end;
Próbowałem ominąć problem korzystając ze zdarzenia OnClose w PopUpMenu. To już taka desperacka metoda była, polegająca na strzelaniu czym popadnie na ślepo i oczywiście nie trafiona, zmienne pozostają puste.
Procedura PopupMenu1Close
procedure TForm1.PopupMenu1Close(Sender: TObject);
begin
MenuItem := TMenuItem(Sender);
MenuName3 := MenuItem.Caption;
StatusBar1.SimpleText := PopUpMenu1.Items.Hint + ' + ' + MenuName3;
end;