Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Feststellen welches Menü item im submenü geklickt wurde (https://www.delphipraxis.net/88118-feststellen-welches-menue-item-im-submenue-geklickt-wurde.html)

EWeiss 10. Mär 2007 12:53


Feststellen welches Menü item im submenü geklickt wurde
 
Wieder Menü!

In VB kann ich einen Submenü für jeden eintrag einen Index zuweisen..
und damit vergleichen welcher eintrag geklickt wurde.

Delphi-Quellcode:
Private Sub mnuEffectes_Click(Index As Integer)
    Select Case Index ... bal, bla. bla ...
wie geht das in Delphi ?

umstellen ist schwierig man kennt die meisten functionen noch nicht.

gruss Emil

Thorben_K 10. Mär 2007 12:58

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Da ich mich mit VB net gut auskenne, bin ich mir net sicher ob das ist was du suchst, aber jeder Menu eintrag hat die eigenschaft TAG, die ist glaube ich was du suchst. Du musst den nur setzen, wird nicht automatisch gemacht

Thorben

EWeiss 10. Mär 2007 13:14

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von Thorben_K
Da ich mich mit VB net gut auskenne, bin ich mir net sicher ob das ist was du suchst, aber jeder Menu eintrag hat die eigenschaft TAG, die ist glaube ich was du suchst. Du musst den nur setzen, wird nicht automatisch gemacht

Thorben

Mit dem Tag ist ne gute Idee ;)
Kann man verwenden..

Nur wie komme ich jetzt an das submenuitem ?
Hab da nix gefunden.

Delphi-Quellcode:
case Vismodule1.Items.Tag of ...
gibt mir ja nur den Tag vom Vismodule1 nicht aber die von deren Submenü
was muss dann aber nach Vismodule1 ... stehen ?

gruss Emil

Muetze1 10. Mär 2007 13:32

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Der Parameter Sender ist die Instanz des SubMenus, welches geklickt wurde. Vergleiche dies doch einfach mit deinem Submenu-Items der Form. Wenn der Vergleich stimmt, der war's dann.

Wenn du ganz allgemein auf das MenuItem zugreifen willst, dann mache einen typecast von Sender auf TMenuItem...

EWeiss 10. Mär 2007 13:44

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von Muetze1
Der Parameter Sender ist die Instanz des SubMenus, welches geklickt wurde. Vergleiche dies doch einfach mit deinem Submenu-Items der Form. Wenn der Vergleich stimmt, der war's dann.

Wenn du ganz allgemein auf das MenuItem zugreifen willst, dann mache einen typecast von Sender auf TMenuItem...

Könnte das so funktionieren ?


Delphi-Quellcode:
procedure TVisForm.Vismodule1Click(Sender: TObject);
begin
  case Vismodule1.items[Vismodule1.MenuIndex].Tag of
    0: ;
    1: ;
    2: ;
    3: ;
    4: ;
    5: ;
    6: ;
  end;
end;
Hab da noch ncihts eingetragen das ich es testen könnte..
Habe den Tag's die jeweiligen Indexe übergeben.

gruss Emil

Muetze1 10. Mär 2007 13:52

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Entweder über Sender und Instanzenvergleich:

Delphi-Quellcode:
Procedure TBlubbv.Click(Sender: TObject);
Begin
  If ( Sender = miMeinMenuItem1 ) Then
    ShowMessage('Das war miMeinMenuItem1')
  Else If ( Sender = miMeinMenuItem2 ) Then
    ShowMessage('Das war miMeinMenuItem2')
  Else If ( Sender = miMeinMenuItem3 ) Then
    ShowMessage('Das war miMeinMenuItem3')
  Else
    ShowMessage('Das war irgendwas anderes...');
End;
Oder über den Tag:

Delphi-Quellcode:
Procedure TBlubb.Click(Sender: TObject);
Begin
  If Sender Is TComponent Then
  Begin
    Case TComponent(Sender).Tag Of
      1: ShowMessage('Tag = 1');
      2: ShowMessage('Tag = 2');
      3: ShowMessage('Tag = 3');
      4: ShowMessage('Tag = 4');
    End;
  End;
End;

EWeiss 10. Mär 2007 14:04

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Habe das mal nachvollzogen
komme aber nicht auf das submenuitem

Delphi-Quellcode:
procedure TVisForm.Vismodule1Click(Sender: TObject);
Begin
  If ( Sender = Spectrum1 ) Then
    ShowMessage('Das war Spectrum1')
  Else If ( Sender = VuBox1 ) Then
    ShowMessage('Das war VuBox1')
  Else If ( Sender = Peristalsis1 ) Then
    ShowMessage('Das war Peristalsis1')
  Else
    ShowMessage('Das war irgendwas anderes...');

end;
Er springt immer in 'Das war irgendwas anderes...'
Sobald ich mit der maus auf den eintrag Vismodule1 komme
Ein klick Event kann ich dann nicht mehr auslösen.

Auch nach den kommentieren dieser zeile komm ich niemals ins submenü ....


Verstehe nicht das es so kompliziert ist an den eintrag eines Menüs zu gelangen

Sorry das ich nochmal mit VB anfange..
Ich gebe im Designer einen Index für den Eintrag ein.
Dann wird beim aufruf direkt ne sub angelegt wo ein Index mit übergeben wird.

Delphi-Quellcode:
Private Sub mnuVis_Click(Index As Integer)

    DoEvents
    Select Case Index
    Case 0, 1, 2, 3, 4
        VisAll = False
    Case 5
        VisAll = True
    End Select
    mnuVis(Index).Checked = True
    CurFlame = Index
    For Index = 0 To 5
        If Index <> CurFlame Then
            mnuVis(Index).Checked = False
        End If
    Next Index
    If Index = 5 Then
        CurFlame = 4
    End If
    SaveSetting EMPLAYER, "Visual", "CurFlame", CurFlame

End Sub
Dann kann ich mit dem Index arbeiten ohne irgendwelche probleme
oder etwas anderes dafür zu initialisieren.

gruss

Nuclear-Ping 10. Mär 2007 15:43

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Ich kenne mich mit Delphi.NET zwar nicht aus, aber wieso weißt du nicht einfach für jedes SubMenu-Item den gleichen OnClick-Event zu?

In dem Event castest du den Sender einfach auf TMenuItem (oder wie das in Delphi.NET heisst) und schon hast du das geklickte Item.

Delphi-Quellcode:
procedure TVisForm1.FooMenuItemClick (Sender: TObject);
begin
  ShowMessage ((Sender as TMenuItem).Caption);
end;
Geht das nicht?

EWeiss 10. Mär 2007 15:56

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von Nuclear-Ping
Ich kenne mich mit Delphi.NET zwar nicht aus, aber wieso weißt du nicht einfach für jedes SubMenu-Item den gleichen OnClick-Event zu?

In dem Event castest du den Sender einfach auf TMenuItem (oder wie das in Delphi.NET heisst) und schon hast du das geklickte Item.

Delphi-Quellcode:
procedure TVisForm1.FooMenuItemClick (Sender: TObject);
begin
  ShowMessage ((Sender as TMenuItem).Caption);
end;
Geht das nicht?

Hi kenn mich in Delphi.NET auch nicht aus ;)
Aber das war sehr Hilfreich.

Jetzt funktioniert auch diese Abfrage!

Delphi-Quellcode:
procedure TVisForm.Vismodule1Click(Sender: TObject);
Begin
  If ( Sender = Spectrum1 ) Then
    ShowMessage('Das war Spectrum1')
  Else If ( Sender = VuBox1 ) Then
    ShowMessage('Das war VuBox1')
  Else If ( Sender = Peristalsis1 ) Then
    ShowMessage('Das war Peristalsis1')
  Else
    ShowMessage('Das war irgendwas anderes...');

end;
gruss Emil

Muetze1 10. Mär 2007 16:15

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von EWeiss
Hi kenn mich in Delphi.NET auch nicht aus ;)

Du hast aber bei deinem ersten Beitrag angegeben, dass du mit .NET arbeitest... :gruebel:

Zitat:

Zitat von EWeiss
Jetzt funktioniert auch diese Abfrage!

Und was hast du bezüglich dem Versuch zuvor verändert?

EWeiss 10. Mär 2007 16:31

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von Muetze1
Zitat:

Zitat von EWeiss
Hi kenn mich in Delphi.NET auch nicht aus ;)

Du hast aber bei deinem ersten Beitrag angegeben, dass du mit .NET arbeitest... :gruebel:

Zitat:

Zitat von EWeiss
Jetzt funktioniert auch diese Abfrage!

Und was hast du bezüglich dem Versuch zuvor verändert?

Sorry hab da wohl die falsche Sprache angegeben :oops: sollte natürlich Delphi sein
Habe jetzt alle OnClick ereignisse auf die sub gelegt.

Delphi-Quellcode:
procedure TVisForm.ModuleClick(Sender: TObject);
Var
 i : Integer;
 mi: TMenuItem;
 CurrentItem: Integer;

begin
   mi := Sender as TMenuItem;
   CurrentItem:= mi.tag;

   If ( Sender = Spectrum1 ) Then
    ShowMessage('Das war Spectrum1')
  Else If ( Sender = VuBox1 ) Then
    ShowMessage('Das war VuBox1')
  Else If ( Sender = Peristalsis1 ) Then
    ShowMessage('Das war Peristalsis1')
  Else
    ShowMessage('Das war irgendwas anderes...');

  for i := 0 to 6 do
        If i = CurrentItem Then
            mi.Checked := true
        else
            mi.Checked := false;

end;
Das funktioniert zwar ..
Aber wie kann ich jetzt außerhalb der form den Menüeintrag abfragen welcher angeklickt wurde ?
Wenn ich immer noch nicht weiss wie ich an die submenuitems gelange.

Auch wird mir so der eintrag nicht als checked makiert ...

gruss Emil

matashen 10. Mär 2007 16:35

Re: Feststellen welches Menü item im submenü geklickt wurde
 
procedure TVisForm.ModuleClick(Sender: TObject);
Var
i : Integer;
mi: TMenuItem;
CurrentItem: Integer;

begin
mi := Sender as TMenuItem;
CurrentItem:= mi.tag;

If ( Sender = Spectrum1 ) Then
Spectrum1.checked:= not spectrum.checked usw. usw.


[delphi]

Ich hoffe das hilft dir

EWeiss 10. Mär 2007 16:40

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von matashen
procedure TVisForm.ModuleClick(Sender: TObject);
Var
i : Integer;
mi: TMenuItem;
CurrentItem: Integer;

begin
mi := Sender as TMenuItem;
CurrentItem:= mi.tag;

If ( Sender = Spectrum1 ) Then
Spectrum1.checked:= not spectrum.checked usw. usw.


[delphi]

Ich hoffe das hilft dir

Verstehe ich nicht!
mi ist doch als TMenuItem declariert findet also den richtigen eintrag (Index) eingestellt im Tag des menüItem

Warum schaltet mi dann diesen eintrag nicht auf true
Der Tag wird doch auch erkannt!

gruss Emil

matashen 10. Mär 2007 16:43

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Der Tag ist eine Eigenschaft des Objects Submenuitem von Typ Integer(Glaub ich..).
Das Checked ist eine Eigenschaft des Objects Submenuitem von Typ Boolean(weis ich!).
Wenn du also den Tag einen Wert zuweist hat das noch lang nix mit der Eigenschaft Checked zu tun !

Gruß Matthias

EWeiss 10. Mär 2007 16:48

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von matashen
Der Tag ist eine Eigenschaft des Objects Submenuitem von Typ Integer(Glaub ich..).
Das Checked ist eine Eigenschaft des Objects Submenuitem von Typ Boolean(weis ich!).
Wenn du also den Tag einen Wert zuweist hat das noch lang nix mit der Eigenschaft Checked zu tun !

Gruß Matthias

Korrekt!

Ich rede aber nicht von bool, integer oder Tag .. sorry
sondern davon das mi als MenuItem declariert ist.

Also theoretisch alle eigenschaften des MenuItem besitzen muss!
Sonst könnte ich ja den Tag auch nicht abfragen oder ?

Warum wird dann wenn ich mi.checked := True angebe
der Menüeintrag nicht auf true gesetzt ? Wenn mi den Menüeintrag repräsentiert ?

begin
EDIT:

Dann brauche ich mi auch nicht declarieren da es in dem Fall unsinnig wäre
und die Tag eigenschaften bringen dann auch nichts.

was ich verstehe das er unterumständen die eigenschaften der anderen menüs nicht erkennt
da er hier ja nur das aktuelle angeklickte Menü erkennt.
Aber das muss mindestens auf True gesetzt werden können.
end EDIT

gruss Emil

matashen 10. Mär 2007 16:55

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Bist du schon mal mit dem debugger durchegegangen was der Code macht.

Habs mal mit dienem Code bei mir versucht nachzustellen. Klappt wunderbar.

EWeiss 10. Mär 2007 16:58

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von matashen
Bist du schon mal mit dem debugger durchegegangen was der Code macht.

Habs mal mit dienem Code bei mir versucht nachzustellen. Klappt wunderbar.

Was mein Schnipsel ?
Ja er geht auch durch ohne ärger.
Schaltet aber den eintrag nicht auf true = checked

Keine ahnung warum.

EDIT:
Die MessageBox hat das problem verursacht.

Aber funktionieren tut das ganze immer noch nicht.
Habe immer noch nicht die info wie ich an die submenuitems gelange
Es gibt nix im inet keine Seite hat ein Sample wo man sich das mal anschauen kann.

Auch hier gibt es nix ;)
Wär mal was für die codelib

gruss

matashen 10. Mär 2007 17:23

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Liste der Anhänge anzeigen (Anzahl: 1)
mein letzter Versuch.(Mein Badewasser wird grad kalt !


hab dir schnell was zusammengebastelt und angehängt.

Vielleicht kannst du damit dein Problem finden

EWeiss 10. Mär 2007 17:47

Re: Feststellen welches Menü item im submenü geklickt wurde
 
Zitat:

Zitat von matashen
mein letzter Versuch.(Mein Badewasser wird grad kalt !


hab dir schnell was zusammengebastelt und angehängt.

Vielleicht kannst du damit dein Problem finden

Danke für deine mühe ;)

Ich habe es jetzt so gelößt.

Delphi-Quellcode:
procedure TVisForm.ModuleClick(Sender: TObject);
Var
 IntI       : Integer;
 mi         : TMenuItem;
 CurrentItem : Integer;

begin
   mi         := Sender as TMenuItem;
   CurrentItem := mi.tag;
   mi.checked := True;

  If ( Sender = Spectrum1 ) Then
    ShowMessage('Das war Spectrum1')
  Else If ( Sender = VuBox1 ) Then
    ShowMessage('Das war VuBox1')
  Else If ( Sender = Peristalsis1 ) Then
    ShowMessage('Das war Peristalsis1')
  Else If ( Sender = Polygone1 ) Then
    ShowMessage('Das war Polygone')
  Else If ( Sender = CompactDisc1 ) Then
    ShowMessage('Das war CompactDisc')
  Else If ( Sender = Plasma1 ) Then
    ShowMessage('Das war Plasma')
  Else If ( Sender = Water1 ) Then
    ShowMessage('Das war Water');

    for IntI := 0 to 6 do
      if IntI <> CurrentItem then
      case IntI of
      0:
        Spectrum1.checked := False;
      1:
        VuBox1.checked := False;
      2:
        Peristalsis1.checked := False;
      3:
        Polygone1.checked := False;
      4:
        CompactDisc1.checked := False;
      5:
        Plasma1.checked := False;
      6:
        Water1.checked := False;
      end;
end;
Mein problem bleibt aber bestehen.

Innerhalb der form ist das nun geklärt aber ich muss das submenuItem auch
außerhalb der Form erkennen können welcher index(eintrag) nun gewählt ist.
Da ich hier eine case anweisung einbauen muss welche daraufhin das
im Menu gewählte Visualisierungs-Modul ausführt.

Geht das generell oder muss ich mir da externe variablen einrichten ?

gruss

matashen 10. Mär 2007 18:19

Re: Feststellen welches Menü item im submenü geklickt wurde
 
So bin wieder sauber :)


Wenn du das mit TVisForm.Spectrum1.checked prüfst mußt du nichts eintragen. Du kannst von jeder Form der Anwendung aus auf jede andere Form zugreifen. Du darfst nur nicht vergessen die entsprechende Zielform anzugeben, sonst geht die aktuelle form von self.spectrum1.checked aus und das gibts dann ja nicht.

Gruß Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz