Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Startmenü Einträge (https://www.delphipraxis.net/64535-startmenue-eintraege.html)

mOzZzI 4. Mär 2006 21:49


Startmenü Einträge
 
Hallo miteinander!

Ich versuche, im OnCreate Ereignis meines Programmes den Ordner "C:\Dokumente und Einstellungen\All Users\Startmenü\" auszulesen und in einer ListView anzuzeigen...klappt aber nicht so recht...

Danach möchte ich z.B. einen Ordner unter "C:\...\Startmenü" erstellen und Dateien in diesen Ordner hineinsetzen, die der Benutzer ausgewählt hat...

Jetzt meine Frage: Wie stelle ich das ungefähr an? :gruebel:

Mfg Philipp

alcaeus 4. Mär 2006 22:31

Re: Startmenü Einträge
 
Es gibt in HKCU einen Eintrag, welcher besagt wo das Startmenue gespeichert ist. Diese Eintraege liegen in HKCU\Software\Microsoft\Windows\CurrentVersion\Exp lorer\User Shell Folders. Einfach mal reingucken ;)

Greetz
alcaeus

ichbins 5. Mär 2006 01:45

Re: Startmenü Einträge
 
Genau. Du liest diesen Key einfach ein (in der Delphi-Hilfe (zumindest bis V7) ist sogar ein ausführliches Beispiel und scannst dann das Dir. Dazu gibts auch massig Funktionen:
Delphi-Quellcode:
procedure getdirsindir(const verzeichniss:string;var dirs:tstringlist);
var
  sd:string;
  s:tsearchrec;
  i:integer;
begin
  dirs:=tstringlist.Create;
  sd:=dirup(verzeichniss);
  if findfirst(sd+'*.*',faanyfile,s)<>0 then begin
    sysutils.findclose(s);
    exit;
  end;
  dirs.add(s.Name);
  while findnext(s)=0 do
    dirs.Add(s.name);
  i:=0;
  while i<dirs.count do begin
    if ((dirs[i]='..') or (dirs[i]='.')) then begin
      dirs.Delete(i);
      i:=i-1;
    end else
      if not directoryexists(sd+dirs[i]) then begin
        dirs.Delete(i);
        i:=i-1;
      end;
    inc(i);
  end;
  sysutils.findclose(s);
end;

function getfilesindir(const verzeichniss,filter:string;var files:tstringlist):extended;
var
  sd:string;
  s:tsearchrec;
  i:integer;
  e:extended;
  flt:string;
begin
  if filter='' then
    flt:='*.*'
  else
    flt:=filter;
  e:=0;
  sd:=dirup(verzeichniss);
  result:=0;
  files:=tstringlist.Create;
  if findfirst(sd+flt,faanyfile,s)<>0 then begin
    sysutils.findclose(s);
    exit;
  end;
  files.add(s.Name);
  while findnext(s)=0 do begin
    files.Add(s.name);
    e:=e+s.Size;
  end;
  i:=0;
  while i<files.count do begin
    if ((files[i]='..') or (files[i]='.')) then begin
      files.Delete(i);
      i:=i-1;
    end else
      if directoryexists(sd+files[i]) then begin
        files.Delete(i);
        i:=i-1;
      end;
    inc(i);
  end;
  result:=e;
  sysutils.findclose(s);
end;

function gettreeindir(const root:string;var files,dirs:tstringlist;filter:string):extended;
var
  sd:string;
  i,j:integer;
  fls,unterverzeichnisse:tstringlist;
  flt:string;
  groesse:extended;
begin
  groesse:=0;
  if filter='' then
    flt:='*.*'
  else
    flt:=filter;
  sd:=dirup(root);
  files:=tstringlist.Create;
  dirs:=tstringlist.Create;
  dirs.Add(sd);
  i:=0;
  while i<dirs.Count do begin
    getdirsindir(dirs[i],unterverzeichnisse);
    for j:=0 to unterverzeichnisse.Count-1 do
      dirs.Add(dirup(dirs[i])+unterverzeichnisse.Strings[j]);
    inc(i);
  end;
  for i:=0 to dirs.Count-1 do begin
    groesse:=groesse+getfilesindir(dirs[i],flt,fls);
    for j:=0 to fls.Count-1 do
      files.Add(dirup(dirs[i])+fls.strings[j]);
  end;
  result:=groesse;
end;

Luckie 5. Mär 2006 13:36

Re: Startmenü Einträge
 
Ich würde nicht darauf vertrauen, dass der Registry Eintrag immer dort ist und auch immer Gültigkeit hat. Ich würde da besser die API Funktion nehmen:
Delphi-Quellcode:
const
  CSIDL_FLAG_CREATE = $8000;
  CSIDL_ADMINTOOLS = $0030;
  CSIDL_ALTSTARTUP = $001D;
  CSIDL_APPDATA    = $001A;
  CSIDL_BITBUCKET  = $000A;
  CSIDL_CDBURN_AREA = $003B;
  CSIDL_COMMON_ADMINTOOLS = $002F;
  CSIDL_COMMON_ALTSTARTUP = $001E;
  CSIDL_COMMON_APPDATA = $0023;
  CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
  CSIDL_COMMON_DOCUMENTS = $002E;
  CSIDL_COMMON_FAVORITES = $001F;
  CSIDL_COMMON_MUSIC = $0035;
  CSIDL_COMMON_PICTURES = $0036;
  CSIDL_COMMON_PROGRAMS = $0017;
  CSIDL_COMMON_STARTMENU = $0016;
  CSIDL_COMMON_STARTUP = $0018;
  CSIDL_COMMON_TEMPLATES = $002D;
  CSIDL_COMMON_VIDEO = $0037;
  CSIDL_CONTROLS   = $0003;
  CSIDL_COOKIES    = $0021;
  CSIDL_DESKTOP    = $0000;
  CSIDL_DESKTOPDIRECTORY = $0010;
  CSIDL_DRIVES     = $0011;
  CSIDL_FAVORITES  = $0006;
  CSIDL_FONTS      = $0014;
  CSIDL_HISTORY    = $0022;
  CSIDL_INTERNET   = $0001;
  CSIDL_INTERNET_CACHE = $0020;
  CSIDL_LOCAL_APPDATA = $001C;
  CSIDL_MYDOCUMENTS = $000C;
  CSIDL_MYMUSIC    = $000D;
  CSIDL_MYPICTURES = $0027;
  CSIDL_MYVIDEO    = $000E;
  CSIDL_NETHOOD    = $0013;
  CSIDL_NETWORK    = $0012;
  CSIDL_PERSONAL   = $0005;
  CSIDL_PRINTERS   = $0004;
  CSIDL_PRINTHOOD  = $001B;
  CSIDL_PROFILE    = $0028;
  CSIDL_PROFILES   = $003E;
  CSIDL_PROGRAM_FILES = $0026;
  CSIDL_PROGRAM_FILES_COMMON = $002B;
  CSIDL_PROGRAMS   = $0002;
  CSIDL_RECENT     = $0008;
  CSIDL_SENDTO     = $0009;
  CSIDL_STARTMENU  = $000B;
  CSIDL_STARTUP    = $0007;
  CSIDL_SYSTEM     = $0025;
  CSIDL_TEMPLATES  = $0015;
  CSIDL_WINDOWS    = $0024;

////////////////////////////////////////////////////////////////////////////////
//  GetShellFolder
//  Returns the special shell folders
//  uses: ActiveX, ShlObj;

function GetShellFolder(CSIDL: integer): string;
var
  pidl             : PItemIdList;
  FolderPath       : string;
  SystemFolder     : Integer;
  Malloc           : IMalloc;
begin
  Malloc := nil;
  FolderPath := '';
  SHGetMalloc(Malloc);
  if Malloc = nil then
  begin
    Result := FolderPath;
    Exit;
  end;
  try
    SystemFolder := CSIDL;
    if SUCCEEDED(SHGetSpecialFolderLocation(0, SystemFolder, pidl)) then
    begin
      SetLength(FolderPath, max_path);
      if SHGetPathFromIDList(pidl, PChar(FolderPath)) then
      begin
        SetLength(FolderPath, length(PChar(FolderPath)));
      end;
    end;
    Result := FolderPath;
  finally
    Malloc.Free(pidl);
  end;
end;

mOzZzI 5. Mär 2006 13:42

Re: Startmenü Einträge
 
Ok, ich habe es jetzt mit der API funktion von luckie gemacht...

Jetzt ist noch, wie kann ich darin Dateien in diesen Ordner hineinsetzen, die der Benutzer ausgewählt hat...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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