|
Registriert seit: 19. Jan 2008 Ort: Brhv 90 Beiträge Delphi 10.2 Tokyo Professional |
#1
Ich bin auf Win-11 umgestiegen, wie erwartet hat MS wieder noch mehr Möglichkeiten gesperrt.
Ich habe viel portable Programme, die ich gerne über PopUpMenü starte. Früher konnte man ein Verzeichnis mit den Namen \ \ verlinken und schon war ein Menü vorhanden. Das ist leider nur noch Geschichte. MS sei Dank. Ich habe mir selbst etwas gebastelt. TrayIcon mit einem PopUpMenü. Damit es aber flexibel bleibt, sollte es so funktionieren. Einfach das Hauptverzeichnis deklarieren und dann die .lnk Dateien auslesen, aber auch die Unterverzeichnisse lesen, als Untermenü erstellen und die Inhalte (.lnk) als Items zu runtime erstellen. Damit kann man einfach nur die .lnk erstellen, reinkopieren und schon hat man es im Menü. So weit, so gut. Das einzige Problem ist mein Event. Ich habe ein Event auf den Click deklariert. Soweit immer noch so gut. Ich lese die ganzen Infos aus der .lnk Datei, dafür brauche ich aber auch den Pfad. Bei einem einzigen Verzeichnisse wäre es gar kein Problem, ich habe aber viele Unterverzeichnisse. MenuItem bietet mir nicht an, den Pfad zu übergeben. Momentan verbiege ich es über Hints, was natürlich nicht der Sinn der Sache ist. Wie könnte ich es realisieren? (Bitte Rücksicht darauf nehmen, dass ich nur ein HobbyCoder bin) Hier das Relevante vom Code
Delphi-Quellcode:
Hier ist mein Event
TTask.Run(
procedure var Directories : TArray< string>; Dateien : TStringList; Reg : TRegistry; Item : TMenuItem; Bitmap : TBitmap; Icon : TIcon; {Vcl.Graphics} Directory : string; Skin : string; Titel : string; Datei : string; Index : Integer; ItemIndex : Integer; IconOK : Boolean; procedure DateiListe(Path, Ext: string; FileList: TStrings); var Datei : TSearchRec; begin if AnsiLastChar(Path) <> '\' then Path := Path + '\'; if FindFirst(Path + '*.' + Ext, faAnyFile, Datei) = 0 then begin repeat if (Datei.Attr <> faDirectory) and (Pos('_____', Datei.Name) = 0) then FileList.Add(Datei.Name); until FindNext(Datei) <> 0; FindClose(Datei); end; end; begin OleInitialize(nil); Directories := TDirectory.GetDirectories('D:\Tools\*\'); ItemIndex := 1; for Directory in Directories do begin ItemIndex := ItemIndex + 1; Path := Directory; if AnsiLastChar(Path) <> '\' then Path := Path + '\'; TThread.Synchronize(TThread.Current, procedure begin Item := TMenuItem.Create(PopupMenu1); Item.Caption := ExtractFileName(Directory); Item.ImageIndex := 42; PopupMenu1.Items.Add(Item); {MenüItem = Ordner} end); Dateien := TStringList.Create(); try DateiListe(Path, 'lnk', Dateien); {Liste der lnk Dateien erstellen} if Dateien.Count > 0 then begin for Index := 0 to Dateien.Count - 1 do begin Titel := Dateien[Index]; Titel := TPath.GetFileNameWithoutExtension(Titel ); {Titel = Name ohne Erweiterung, damit das Menü sauber aussieht} Datei := LnkDateiLesen(Path + Dateien[Index]); {Exe Datei auf der lnk Datei auslesen} Icon := TIcon.Create; Bitmap := TBitmap.Create; try try Icon := IconVonDatei(Datei); {Icon von der Exe Datei erfassen} Bitmap.Canvas.Brush.Style := bsClear; {Bitmap als Transparent deklarieren} Bitmap.Width := Icon.Width; Bitmap.Height := Icon.Height; Bitmap.Transparent := True; {Transparenz einschalten} Bitmap.Canvas.Draw (0, 0, Icon); except IconOK := False; end; TThread.Synchronize(TThread.Current, procedure begin Item := TMenuItem.Create(PopupMenu1); Item.Caption := Titel ; Item.OnClick := PopupClick; Item.Hint := ExtractFileName(Directory); //DAS IST MISST ImageList16x16.Add(Bitmap, nil); Item.ImageIndex := ImageList16x16.Items.Count - 1; PopupMenu1.Items[ItemIndex].Add(Item); end); finally FreeAndNil(Icon); FreeAndNil(Bitmap); end; end; end; finally FreeAndNil(Dateien); end; end;
Delphi-Quellcode:
Das Teil ist Misst : LnkFolder := Path + MenuItem.Hint;
procedure TForm1.PopupClick(Sender: TObject);
var MenuItem : TMenuItem; Target : string; Datei : string; Folder : string; LnkFolder : string; begin if not (Sender is TMenuItem) then begin Showmessage('Hm, if this was not called by Menu Click, who called this?!') ; ShowMessage(Sender.ClassName); exit; end; MenuItem := TMenuItem(Sender); {MenuItem empfangen} LnkFolder := Path + MenuItem.Hint; {Verzeichnis im dem sich die .lnk Dateien befinden bestimmen} //DAS IST NATÜRLICH AUCH MISST if AnsiLastChar(LnkFolder) <> '\' then LnkFolder := LnkFolder + '\'; {Verzeichnis muss mit \ enden} Target := LnkDateiLesen(LnkFolder + MenuItem.Caption + '.lnk'); {lnk Datei lesen und die exe Datei erfassen} Folder := ExtractFilePath(Target); {Den Ordner von der exe erfassen} Datei := ExtractFileName(Target); {exe datei erfassen} if MenuItem.Caption = 'Close' then Close else if Pos('SANDBOX', LnkFolder.ToUpper) > 0 then begin ShellExecute(Application.Handle, 'open', 'C:\Program Files\Sandboxie\Start.exe', PWideChar('/box:DefaultBox ' + Datei), PWideChar(Folder), SW_SHOWNORMAL); end else ShellExecute(HWND(nil), 'open', PWideChar(Datei), nil , PWideChar(Folder), SW_NORMAL); end; Path ist global deklariert, im Hint übergebe ich den Namen des Ordners, also auch ein Untermenüname. Das möchte ich besser lösen, finde aber keine Methode den Ordnernamen zu übergeben. Soweit es mir bekannt ist,bei Event kann ich keine Variable selbst deklarieren. Bitte um Rücksicht bei den Antworten, Programmieren nur mein Hobby. Damit ich es einfach erweitern kann möchte ich bei dem Aufbau bleiben, also bitte keine Änderungen die komplett neune Aufbau verlangen. Neuen Ordner erstellen, .lnk reinkopieren und schon taugt es in meinem PopUpmenü auf. .lnk auslesen und auf die exe verlinken. Ich bin manchmal etwas paranoid, manche Tools mag ich nur in de Sandboxie starten. Für brauchbare Ansätze wäre ich sehr dankbar. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |