Announcement

Collapse
No announcement yet.

PopupMenü Hilfe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PopupMenü Hilfe

    Ja, genau das meine ich. Wenn du die Dateiendung entfernst, wie willst du ein Programm dann starten? Schließlich ist die Endung ja irgendwo wichtig, damit Windows weiß, was es machen soll, wenn du "ShellExecute" aufrufst. Eine Möglichkeit gibt´s aber trotzdem, so dass du im Menü zwar keine Dateiendungen hast, der Start aber trotzdem klappt. Basierend auf dem Code von oben folgende Änderung:

    <PRE>
    else if((ds.Name <> '.') and (ds.Name <> '..')) then
    begin
    mii := TMenuItem.Create(parentmi);
    mii.Caption := <font color=#ff0000>ChangeFileExt(ds.Name,'');</font>
    <font color=#ff0000">mii.Hint := pfad + ds.Name;</font>
    mii.OnClick := OnMIClick;
    parentmi.Add(mii);
    end;
    </PRE>
    <b>ACHTUNG</b>: aus irgendeinem Grund verschwinden in meinem Code die zwei Anführungszeichen nach dem Komma. Korrekt wäre <b>ChangeFileExt(ds.Name,'')</b>. Merkwürdig |

    Und dazu die folgende neue Prozedur:
    <PRE>
    procedure TForm1.OnMIClick(Sender: TObject);
    var
    Text : string;
    begin
    Text := (Sender as TMenuItem).Hint; ShowMessage(Text);
    end;
    </PRE>
    Folgendes passiert: Die "Caption" speichert den Dateinamen <u>ohne</u> Endung, gleichzeitig wird aber im "Hint" der komplette Name inkl. Endung gesichert. Außerdem wird dem Ereignis "OnClick" die Prozedur "OnMIClick" zugewiesen, damit auch was passiert. Und in der Prozedur wird der Hint abgefragt und angezeigt. Anstelle der Dialogbox könntest du hier die "ShellExecute"-Anweisung einbauen, so dass die gewählte Datei letztlich gestartet wird.

    Gruß,
    Mathias

  • #2
    PopupMenü Hilfe

    Also ich habe ein PopupMenü und möchte in dieses eine Verzeichnisstruktur von C:\Test\ anzeigen (Unterordnern sollen als Untermenüs angezeigt werden, Dateien in den Ordnern sollen auch angezeigt werden). Natürlich soll es auch so sein das wenn ich auf die jeweilige Datei klicke (*.exe) das, das Programm ausgeführt wird. Wie stelle ich das an?
    Quellcode währe Cool. ThanX

    Ciau
    David Wenzlow

    Comment


    • #3
      Hi,<br>
      also eine Funktion zum Scannen deines Verzeichnisses, inkl. Dateien und Unterverzeichnisse, kannst du gern haben. Aber die Sache mit dem Einfügen in das Menü muss mal ein anderer machen. | Ich weiß zwar, wie das dynamisch für einen normalen Menüeintrag geht, aber mit Untermenüs hab´ ich das noch nicht versucht.<br><br>
      Hier erst mal mein Code-Vorschlag. Ist aus dem Kopf, kann sein, dass vielleicht ein klitze Bug drin steckt. (
      <pre>
      procedure ScanFolder(s: string);

      &nbsp;&nbsp;&nbsp;&nbsp;procedure Dir(orgPfad: string);
      &nbsp;&nbsp;&nbsp;&nbsp;var
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pfad : string;
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds : TSearchRec;
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Res : integer;
      &nbsp;&nbsp;&nbsp;&nbsp;begin
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentDir( pfad);

      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Res := findfirst('*.*',faAnyFile,ds);
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(Res = 0) do
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be gin
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;if(ds.Attr = faDirectory) and ((ds.Name <> '.') and (ds.Name <> '..')) then // @Hagen: )
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;begin
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ist ein Verzeichnis, also zum Menü hinzufügen
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// dann hinein springen und die Funktion neu aufrufen,
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// um die dortigen Dateien zu scannen
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChDir(ds.Name); Dir(orgPfad);
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;end
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;else
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;begin
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ist eine Datei, also zum Menü hinzufügen
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;end;

      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;Res := FindNext(ds);
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;en d;
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FindClose(d s);

      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pfad <> orgPfad) then ChDir('..'); // ein Verzeichnis aufwärts
      &nbsp;&nbsp;&nbsp;&nbsp;end;

      begin
      &nbsp;&nbsp;SetCurrentDir(s); // rein ins Verzeichnis
      &nbsp;&nbsp;Dir(s); // scannen
      end;
      </pre>
      Mathias

      Comment


      • #4
        hi Mathias

        (ds.Attr and faDirectory <> 0) wäre die richtigere Abfrage aber das Thema hat'me ja schon.

        Gruß Hage

        Comment


        • #5
          <b>Mist!</b> Doch noch ´n Fehler. )

          Mathias

          Comment


          • #6
            Wie das Thema hatten wir schon mal, ich habe das Forum durchsucht und nichts gefunden.

            Ciau
            David Wenzlo

            Comment


            • #7
              Nee, damit meinte Hagen mich, David. Wir hatten schon mal einen Disput zum Thema "FindFirst/FindNext/FindClose". ... Ich hab´ verloren. )<br><br>
              Ich hoffe, dir hilft erst mal der Code zum Einscannen deines Verzeichnisses. Du müsstest nur die Änderung vornehmen, die Hagen vorgeschlagen hat. Dann klappt´s auch mit Unterverzeichnissen usw.<br><br>
              Wie man das ganze in ein Menü einträgt, könnte ich dir zwar auch sagen. Aber das wären dann nur Ebene1-Einträge. Will sagen: ich weiß im Moment nicht, wie man Submenüs im Code erzeugt. Und darauf läuft´s ja hinaus. Wenn ich was finde, poste ich´s.<br><br>
              Mathias

              Comment


              • #8
                So David,<br><br>
                das Ding hier macht das, was du willst. Es hat allerdings den Nachteil, dass ein Menüeintrag im Popupmenü vorhanden sein muss. Das ist der Teil, den ich fett markiert habe. Will sagen: du könntest eine leere Popup-Menükomponente auf dein Formular packen und einen einzigen Eintrag einfügen, den du "mnuInsert" nennst. Dann rufst du die Funktion beispielsweise in "OnCreate" auf, und es sollte eigentlich klappen. Ich habe mein "Programme"-Verzeichnis mal gescannt. Ging prima. )<br><br>
                Die Frage wäre jetzt, wie kann man das umgehen; also das Menü von Grund auf neu erstellen - ohne diesen einen festen Eintrag.<br><br>Mathias

                Comment


                • #9
                  <PRE>
                  procedure&nbsp;TForm1.ScanFolder(s:&nbsp;string);
                  var
                  &nbsp;&nbsp;pii&nbsp;:&nbsp;TMenuItem;

                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;procedure&nbsp;Dir(orgPfad:&nbsp;string; &nbsp;parentmi:&nbsp;TMenuItem);
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;var
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;ds&nbsp;:&nbsp;TSearchRec;
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;Res&nbsp;:&nbsp;integer;
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;path&nbsp;:&nbsp;string;
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;mii&nbsp;:&nbsp;TMenuItem;
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;begin
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;path&nbsp;:=&nbsp;GetCurrent Dir;

                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;Res&nbsp;:=&nbsp;FindFirst(' *.*',faAnyFile,ds);
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;while(Res&nbsp;=&nbsp;0)&nbs p;do
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(d s.Attr&nbsp;and&nbsp;faDirectory&nbsp;>&nbsp;0)&nb sp;and&nbsp;((ds.Name&nbsp;<>&nbsp;'.')&nbsp;and&n bsp;(ds.Name&nbsp;<>&nbsp;'..'))&nbsp;then
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;begin
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;mii&nbsp;:=&nbsp;TMenuItem.Cre ate(parentmi);
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;mii.Caption&nbsp;:=&nbsp;ds.Na me;
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;parentmi.Add(mii);

                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;ChDir(ds.Name);&nbsp;Dir(orgPf ad,mii);
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;end
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;if((ds.Name&nbsp;<>&nbsp;'.')&nbsp;and&nbsp; (ds.Name&nbsp;<>&nbsp;'..'))&nbsp;then
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;begin
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;mii&nbsp;:=&nbsp;TMenuItem.Cre ate(parentmi);
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;mii.Caption&nbsp;:=&nbsp;ds.Na me;
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;parentmi.Add(mii);
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;end;

                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Res& nbsp;:=&nbsp;FindNext(ds);
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;FindClose(ds);

                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;if(path&nbsp;<>&nbsp;orgPfad )&nbsp;then&nbsp;ChDir('..');
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;end;
                  begin
                  &nbsp;&nbsp;<b>pii&nbsp;:=&nbsp;mnuInsert;</b>&nbsp;SetCurrentDir(s);&nbsp;Dir(s,pii);
                  end;
                  </PRE&gt

                  Comment


                  • #10
                    Aijaja DS.Attr and faDirectory <> 0 !!
                    In älteren Delphi Versionen ist DS.Attr type Integer. Angenommen das höchste Bit von SR.Attr wäre gesetzt, dann würde DS.Attr and faDirectory > 0 eine falsche Bedingung abfragen da DS.Attr eben immer < 0 wäre.

                    Gruß Hage

                    Comment


                    • #11
                      Menno Hagen, hab beim Posten den Haken vergessen.<br>Sei doch nich´ so pingelig.<br>)<br><br>David, Hagen hat recht, da fehlt ein bissel was, aber das liegt wahrscheinlich daran, dass ich mein Posting aufteilen musste. Eins hat nicht gereicht.<br><br>Mathias

                      Comment


                      • #12
                        Was fehlt den da?

                        Ciau
                        Davi

                        Comment


                        • #13
                          Siehe Zeile 15 meines letzten Code-Postings. Korrekt wäre:<br><br>
                          if(ds.Attr and faDirectory <font color=#ff0000>&lt;</font>&gt; 0) and ((ds.Name <> '.') and (ds.Name <> '..')) then<br><br>
                          usw. Hagen hat in seinem Posting auch erklärt, warum.<br>Mathias

                          Comment


                          • #14
                            Ich danke, euch...

                            Ciau
                            David Wenzlo

                            Comment


                            • #15
                              Könntet Ihr mir noch sagen wie ich die Dateierweiterungen *.exe, *.txt usw. Wegbekomme.

                              Danke

                              Ciau
                              D.A.W

                              Comment

                              Working...
                              X