Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Eigenes Favoriten-Menü (https://www.delphipraxis.net/18547-eigenes-favoriten-menue.html)

S2B 20. Mär 2004 16:19


Eigenes Favoriten-Menü
 
Hi,
ich möchte für meinen Browser ein eigenes Favoritenmenü machen. Wenn man auf "zu Links hinzufügen" klickt, soll das Programm eine Verknüpfung der Website in einen Ordner schreiben und den Inhalt des Ordners in einem Menü anzeigen, also wie die Favoriten im IE. Weiß da vielleicht jemand Rat?
Gruß
S2B

Luckie 20. Mär 2004 16:25

Re: Eigenes Favoriten-Menü
 
Die "Link"-Dateien (*.url) sind auch nur Ini-Dateien. Kuck sie dir mal mit dem Editor an. Ansonsten wo ist das Problem? Datei anlegen mit TIniFile auflisten mit FindFirst, FindNext und daraus die MenüItems dynamisch generieren.

S2B 20. Mär 2004 16:35

Re: Eigenes Favoriten-Menü
 
Wenn ich einen vom IE erstellten Link mit dem Editor öffne, bekomme ich eine ewig lange Textdatei. Es ist aber keine Ini-Datei. Aber sonst könnte ich mir schon vorstellen, dass es mit Ini-Dateien gehen würde, kann es aber erst heut Abend ausprobieren.
Meinst du das ungefähr so?

Code:
  ini.WriteString('Url','Link',Pfad);
  ini.WriteString('Url','Name',Name);
Gruß
S2B

MathiasSimmack 20. Mär 2004 17:26

Re: Eigenes Favoriten-Menü
 
Eine typische URL-Datei sieht ganz einfach so aus:
Code:
[InternetShortcut]
URL=http://nsis.sourceforge.net/
Alles andere kannst du ignorieren. Du musst also lediglich herausfinden, wo sich deine Favoriten befinden und die dort evtl. vorhandenen Verzeichnisse der Reihe nach durchgehen und in dein Menü einbinden. Oder du suchst dir eine passende Komponente. ;)

S2B 20. Mär 2004 17:33

Re: Eigenes Favoriten-Menü
 
Wie kann man dann den Eintrag aus der Ini-Datei ins Menü einbinden? Ich hab das grad mal probiert, habs aber nicht geschafft!
Gruß
S2B

MathiasSimmack 20. Mär 2004 17:38

Re: Eigenes Favoriten-Menü
 
Hm, kannst du ´nen Augenblick warten. Ich habe das schon mal gemacht, allerdings ist das Projekt beendet und archiviert. Ich müsste ein Beispiel also erst raussuchen. Es sei denn, ein anderer ist schneller ...

S2B 20. Mär 2004 17:40

Re: Eigenes Favoriten-Menü
 
Ich warte natürlich, mit DSL Flat is das möglich :mrgreen:.

MathiasSimmack 20. Mär 2004 18:27

Re: Eigenes Favoriten-Menü
 
Also, hier eine Lösung mit zwei Wegen. ;) Es geht nämlich auch ohne TIniFile, da der URL-Dateityp eigentlich im System bekannt ist. Wenn du aber auf Nummer Sicher gehen willst, machst du´s selbst:
Delphi-Quellcode:
{.$DEFINE TINIFILE}

procedure TForm1.OnURLMenuItemClick(Sender: TObject);
begin
  if(Sender is TMenuItem) and
    ((Sender as TMenuItem).Hint <> '') then
  ShellExecute(self.Handle,'open',pchar((Sender as TMenuItem).Hint),
    nil,nil,SW_SHOWNORMAL);
end;

procedure TForm1.LoadLocalFavorites;

  procedure scanit(const orgPath: string; parentMI: TMenuItem);
  var
    path : string;
    res : integer;
    ds  : TSearchRec;
    mii : TMenuItem;
{$IFDEF TINIFILE}
    ini : TIniFile;
{$ENDIF}
  begin
    path := GetCurrentDir;

    // zuerst alle Ordner, weil das Einträge für
    // Untermenüs werden
    res := FindFirst('*.*',faAnyFile,ds);
    while(res = 0) do
    begin
      if(ds.Attr and faDirectory <> 0) and
        (ds.Attr and faHidden = 0) and
        ((ds.Name <> '.') and (ds.Name <> '..')) then
      begin
        mii        := TMenuItem.Create(parentMI);
        mii.Caption := ds.Name;

        // rein ins Menü
        parentMI.Add(mii);

        if(SetCurrentDir(ds.Name)) then
          scanit(orgPath,mii);
      end;

      res := FindNext(ds); Application.ProcessMessages;
    end;
    FindClose(ds);

    // und jetzt alle URL-Dateien suchen
    res := FindFirst('*.url',faAnyFile,ds);
    while(res = 0) do
    begin
      if(ds.Name <> '.') and
        (ds.Name <> '..') and
        (ds.Attr and faDirectory = 0) then
      begin
        mii           := TMenuItem.Create(parentMI);
        mii.Caption   := ChangeFileExt(ds.Name,'');

{$IFDEF TINIFILE}
        ini := TIniFile.Create(path + '\' + ds.Name);
        if(ini <> nil) then
        try
          mii.Hint := ini.ReadString('InternetShortcut','URL','');
        finally
          ini.Free;
        end;
{$ELSE}
        mii.Hint      := '"' + path + '\' + ds.Name + '"';
{$ENDIF}
        mii.ImageIndex := 11;
        mii.OnClick   := OnURLMenuItemClick;

        // ab ins Menü damit
        if(mii.Hint <> '') and
          (mii.Caption <> '') then parentMI.Add(mii);
      end;

      res := FindNext(ds); Application.ProcessMessages;
    end;
    FindClose(ds);

    // und wieder einen Ordner nach oben
    if(path <> orgPath) then ChDir('..');
  end;


var
  cDummy,
  xPath : string;
begin
  // aktuelles Verzeichnis ermitteln
  cDummy := GetCurrentDir;

  // Favoritenordner des aktuellen Benutzers
  // ermitteln, ...
  xPath := GetSpecialFolder(CSIDL_FAVORITES);
  // ... & scannen
  if(xPath <> '') and
    (SetCurrentDir(xPath)) then scanit(xPath,mmFavoriten);

  // du kannst auch noch die Favoriten für
  // alle Benutzer anhängen, wenn du nach
  // "CSIDL_COMMON_FAVORITES" suchst
end;
Eine Funktion zum korrekten Ermitteln des Favoritenordners findest du hier im Forum. Der Eintrag im Hauptmenü der Form heißt bei mir mmFavoriten und dient als Parent für die gefundenen Ordner und URL-Dateien aus dem Favoriten-Verzeichnis.

Sorry, aber ich habe gleich noch gefuttert. ;)

S2B 20. Mär 2004 18:33

Re: Eigenes Favoriten-Menü
 
Danke für den Code. Ich werd ihn gleich mal ausprobieren. Alles davon verstehen werd ich wahrscheinlich nicht, aber is ja auch egal! :-D
Gruß
S2B

MathiasSimmack 20. Mär 2004 19:20

Re: Eigenes Favoriten-Menü
 
Nein, das ist nicht egal, denn du solltest es schon verstehen.
Wenn du den Code nämlich verstehst, kannst du ihn ggf. erweitern, vereinfachen oder auch verbessern.

Also, wenn Fragen sind, dann frage!

S2B 21. Mär 2004 09:57

Re: Eigenes Favoriten-Menü
 
Also ich versteh nicht ganz, was die zwei Versionen sein sollen. Außerdem versuche ich gerade, das ganze mit einem neuen Dateiformat (also nicht *.url) zu machen. Ich möchte eigentlich, dass die Ini-Datei so aussieht:

Code:
[URL]
Link=http://www.delphipraxis.net/
Name=Delphi-PRAXIS
Im Menü soll dann ein Eintrag erstellt werden, der "Delphi-Praxis" heißt und als OnClick den Browser "http://www.delphipraxis.net/" laden lässt. Ich hab schon eine Form erstellt, die die Ini-Datei schreibt. Jetzt versteh ich das nicht ganz mit dem

Code:
OnURLMenuItemClick(Sender: TObject);
Wenn ich den Code so reinschreib, dann kommt ein Fehler.
Kannst du mir da weiterhelfen?
Gruß
S2B

MathiasSimmack 21. Mär 2004 10:50

Re: Eigenes Favoriten-Menü
 
1. URL-Dateien tragen normalerweise den Namen, unter dem sie auch im Favoritenmenü auftauchen. Ein separater "name"-Eintrag in ihnen ist daher eigentlich nicht erforderlich. Will sagen: du nimmst den Namen der URL-Datei, entfernst die Endung ".url" und hast die Bezeichnung für den Menüeintrag.

2. Im Hint des Menüeintrags habe ich in Version 1 den Pfad und die Datei gespeichert. In Version 2 (s. Compilerschalter "TINIFILE") öffne ich die URL-Datei als INI und lese die Adresse aus und lege diese im Hint ab.
In deinen eigenen Dateien ist das aber wohl der Eintrag "Link", also musst du logischerweise den Befehl:
Delphi-Quellcode:
mii.Hint := ini.ReadString('InternetShortcut','URL','');
anpassen.

3. Das das Menü erst zur Laufzeit erzeugt wird, musst du den Einträgen auch eine Klickprozedur zuweisen. Und das ist "OnURLMenuItemClick". Diese prüft ob der "Sender" ein Menüeintrag ist, und ob er einen Hint hat. Wenn ja, wird "ShellExecute" benutzt um den Hint quasi zu starten. Je nach Version ist das entweder Pfad+URL-Datei (klappt, weil der URL-Typ im System bekannt sein sollte) bzw. direkt die Web-Adresse (klappt auch, weil das Protokoll bekannt sein und ein Programm/Browser zugewiesen sein sollte).

Wenn du bspw. den Namen für den Menüeintrag auch aus deiner Datei holen willst, dann musst du
Delphi-Quellcode:
mii.Caption   := ChangeFileExt(ds.Name,'');
(s. Code) durch den entsprechenden Lesebefehl ersetzen:
Delphi-Quellcode:
mii.Caption := ini.ReadString('URL','Name','');

Das Problem mit dem Fehler bei "OnURLMenuItemClick" habe ich jetzt nicht verstanden. Was passiert, wenn du was machst? :gruebel:

S2B 21. Mär 2004 11:05

Re: Eigenes Favoriten-Menü
 
Ich hab die Procedure TForm1.OnURLMenuItemClick eingefügt und dann kamen mehrere Fehler:

Code:
1.

//Da hat er die Procedure nicht gefunden.
  mii.OnClick   := OnURLMenuItemClick;

2.

//bei "self" kam ein Fehler.
  ShellExecute(self.Handle,'open',pchar((Sender as TMenuItem).Hint),
    nil,nil,SW_SHOWNORMAL);
Wie muss man die Procedure genau einbauen (du merkst, ich bin "neu" hier)? :oops:

Gruß
S2B

MathiasSimmack 21. Mär 2004 11:21

Re: Eigenes Favoriten-Menü
 
Ach so. Du musst die Prozedur noch als private- ... äh ... Methode/Prozedur deiner Form deklarieren:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    { ... }
  private
    procedure OnURLMenuItemClick(Sender: TObject);
    procedure LoadLocalFavorites;
  end;
Der tatsächliche Form-Name (vor dem Punkt) richtet sich damit nach dem Namen deiner Form. In meinem Fall "TForm1", bei dir kann das evtl. was ganz anderes sein.

S2B 21. Mär 2004 11:30

Re: Eigenes Favoriten-Menü
 
Mal wieder das gute alte Problem! Delphi gibt einen Fehler aus, ich weiß aber nicht, was falsch ist:

Code:
  mii.OnClick   := OnURLMenuItemClick;
Fehler: [Error] Unit1.pas(334): Undeclared identifier: 'OnURLMenuItemClick'

Sonst stimmt alles! Ich hoffe, dass du mir weiterhelfen kannst!
Gruß
S2B

S2B 21. Mär 2004 13:07

Re: Eigenes Favoriten-Menü
 
Kann mir denn niemand helfen??????

Christian S. 21. Mär 2004 13:18

Re: Eigenes Favoriten-Menü
 
Findest Du es nicht ein bisschen unverschämt, nach so kurzer Zeit schon eine Schiebeposting zu tätigen? :evil:

Zeige mal ein bisschen mehr von Deinem Code. Den Interface-Teil z.B. Sonst kann man ja nur raten.

S2B 21. Mär 2004 13:29

Re: Eigenes Favoriten-Menü
 
Sorry, aber ich wollt des Projekt heute abschließen und da hab ich wohl viel zu schnell weitergeschrieben... :wall: Sorry!!

Hier ein Teil meines Codes:

Code:
type
  TForm1 = class(TForm)
    {...} 
  private
    FOleInPlaceActiveObject: IOleInPlaceActiveObject;
    procedure MsgHandler(var Msg: TMsg; var Handled: Boolean);
    procedure OnURLMenuItemClick(Sender: TObject);
  {...}

procedure TForm1.OnURLMenuItemClick(Sender: TObject);
begin
  if(Sender is TMenuItem) and
    ((Sender as TMenuItem).Hint <> '') then
  ShellExecute(self.Handle,'open',pchar((Sender as TMenuItem).Hint),
    nil,nil,SW_SHOWNORMAL);
end;

//Im Code zum Suchen der Links:
mii.OnClick := OnURLMenuItemClick;
Ich hoffe, dass jemand ne Antwort weiß! :pale:

Gruß
S2B

Christian S. 21. Mär 2004 13:35

Re: Eigenes Favoriten-Menü
 
Hm, so auf Anhieb sehe ich keinen Fehler. Ist die Funktion, die das Zeugs zuweist, auch ein Member von TForm1?

S2B 21. Mär 2004 13:39

Re: Eigenes Favoriten-Menü
 
Was soll "Member" in dem Zusammenhang heißen??? Ich kenn mich nicht so mit den ganzen Fachausdrücken aus, bin aber lernfähig :). Also wenn du meinst, dass sie in der Unit1 drinsteht, dann stimmt das! Wenn du meinst, dass man nur von der Unit1 drauf zugreift, dann stimmt das auch!
Gruß
S2B

Christian S. 21. Mär 2004 13:47

Re: Eigenes Favoriten-Menü
 
Hallo!

Mit "Member von TForm1" meine ich, ob die Prozedur irgendwo im private-, public- oder sonstwas-Bereich von TForm1 drin steht. :-) Oder ist die unabhänhig?

MfG
Peter

S2B 21. Mär 2004 13:49

Re: Eigenes Favoriten-Menü
 
Die steht im private-Bereich! Also müsste sie doch aufrufbar sein, oder????

Edit: Das stand ja vorher auch in meinem Code.

Christian S. 21. Mär 2004 13:58

Re: Eigenes Favoriten-Menü
 
Also die Funktion "LoadLocalFavorites" steht zumindest oben nicht im private-Bereich. Oder versteckt die sich im "{...}"?

S2B 21. Mär 2004 14:03

Re: Eigenes Favoriten-Menü
 
Die Funktion "LoadLocalFavorites" hab ich rausgeschmissen, weil ich sie nicht in meinem Code brauche. Oder vielleicht doch? :gruebel: Die läd doch die IE-Favoriten!?
Die andere steht, wie schon gesagt, im private-Bereich!
Gruß
S2B

Christian S. 21. Mär 2004 14:10

Re: Eigenes Favoriten-Menü
 
Die Funktion, in der das hier steht:
Zitat:

Delphi-Quellcode:
//Im Code zum Suchen der Links:
mii.OnClick := OnURLMenuItemClick;

muss eine Member-Funktion von TForm1 sein.

Oder Du schreibst:
Delphi-Quellcode:
mii.OnClick := Form1.OnURLMenuItemClick;

S2B 21. Mär 2004 14:21

Re: Eigenes Favoriten-Menü
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
dadrauf bin ich noch gar nicht gekommen!
zu 1) soll ich sie in den private-Bereich schreiben?
zu 2) Da kommt ein Fehler beim Ausführen. Siehe Bild.

Hoffe, dass du Rat weißt
Gruß
S2B

Christian S. 21. Mär 2004 14:24

Re: Eigenes Favoriten-Menü
 
(1) In den private-Bereich fände ich sinnvoll, weil kein anderes Objekt darauf zugreifen braucht.
(2) Noch nie gesehen, den Fehler. :? Kommt der in der Zeile, die ich eben auch zitiert habe?

S2B 21. Mär 2004 14:30

Re: Eigenes Favoriten-Menü
 
Nee, der Fehler bezieht sich auf die gesamte Form1! Des mit dem private-Bereich versuch ich mal!
Gruß S2B

Edit: Ich hab den Befehl in den private-Bereich geschrieben, das bringt aber nichts! Der Fehler ist weiterhin da.

Christian S. 21. Mär 2004 14:35

Re: Eigenes Favoriten-Menü
 
Komisch. Schau am Besten mal, ob Du in der Hilfe was zu dem Fehler findest. Ansonsten bin ich auch gespannt, was das ist.

S2B 21. Mär 2004 14:38

Re: Eigenes Favoriten-Menü
 
So einen Fehler hatte ich schon mal! Da war meine Form9 betroffen. Die hab ich aus meinem Projekt rausgeworfen und wieder reingeschmissen und dann gings wieder! Das geht jetzt aber nicht, weil von anderen Formen auf die Form1 zugegriffen wird (andere Befehle als Hide, Show usw. Ich erkundige mich in der Hilfe!
Gruß
S2B

Edit: Ich hab in der Hilfedatei nichts gefunden! Der Fehler ist dem Compiler irgendwie unbekannt...

fkerber 21. Mär 2004 14:51

Re: Eigenes Favoriten-Menü
 
Hi!

Schreib das da unter implementation und schon ist der Fehler weg:

Delphi-Quellcode:
{$R *.dfm}
Ciao fkerber

Christian S. 21. Mär 2004 14:53

Re: Eigenes Favoriten-Menü
 
:wall:

S2B 21. Mär 2004 15:11

Re: Eigenes Favoriten-Menü
 
Vielen Dank! Das muss ich wohl ausversehen gelöscht haben bei dem vielen einfügen und ersetzen!
Gruß
S2B

S2B 21. Mär 2004 15:22

Re: Eigenes Favoriten-Menü
 
Sorry, aber ich versteh noch was an dem Code von MathiasSimmack nicht. Wenn ich scanit ausführen will, was muss ich dann für den ersten Paramenter eingeben? :gruebel:
Wäre schön, wenn ihr mir noch kurz eine Antwort geben könntet!
Gruß
S2B

S2B 21. Mär 2004 15:36

Re: Eigenes Favoriten-Menü
 
Es hat sich geklärt! Ich hab einfach '' eingegeben!
Nochmal danke an alle!
Gruß
S2B

djpaull 11. Mär 2008 09:31

Re: Eigenes Favoriten-Menü
 
Ich bin auch grad dabei meine Favs zu erstellen. Habe den Code von MathiasSimmack im Beitrag #8 (Seite 1) genutzt. Habe alles soweits es ging deklariert. Nur in der Zeile
Delphi-Quellcode:
  xPath := GetSpecialFolder(CSIDL_FAVORITES);
kommt ein Fehler : nicht deklarierter Bezeichner 'GetSpecialFolder'. Habe das hier gefunden. Nur komme ich nicht weiter. Wenn ich das hier

Delphi-Quellcode:
function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;
einbinde, sagt mir Delphi in der Zeile
Delphi-Quellcode:
  xPath := GetSpecialFolder(CSIDL_FAVORITES);
"Nicht genug wirkliche Parameter". Was habe ich vergessen?

djpaull 11. Mär 2008 09:39

Re: Eigenes Favoriten-Menü
 
[Edit]
OOPS! Doppelpost. IE hatte nen Fehler. Musste noch mal schreiben.Sorry :oops:
[/Edit]


Bin dabei eigene Favs zu erstellen. Benutze den Code vom Beitrag #8. Habe Problem in der Zeile
Delphi-Quellcode:
  xPath := GetSpecialFolder(CSIDL_FAVORITES);
- Nicht deklarierter Bezeichener 'GetSpecialFolder'. Habe das hier gefunden. Wenn ich die Funktion
Delphi-Quellcode:
function form1.GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
  // get IMalloc interface pointer
  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  // retrieve path
  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  // free memory allocated by SHGetSpecialFolderLocation
  pMalloc.Free(pidl);
end;
einbinde, kommt Fehler "Nicht genug Parameter" in der Zeile mit
Delphi-Quellcode:
xPath := GetSpecialFolder(CSIDL_FAVORITES);
. Was fehlt da noch?

toms 11. Mär 2008 09:41

Re: Eigenes Favoriten-Menü
 
Da es zum Thema passt. Der Embedded WebBrowser kommt auch mit einer Favoriten Komponente. Siehe Demo


PS: GetSpecialFolder(hWindow: HWND; Folder: Integer) hat 2 Parameter.

djpaull 11. Mär 2008 09:49

Re: Eigenes Favoriten-Menü
 
Tja EmbeddedBrowser ist wohl offline - The site database is unavailable.

Ja, schon. Nur ich weiss nicht, was soll da noch rein bei
Delphi-Quellcode:
GetSpecialFolder(???, CSIDL_FAVORITES);
?

taaktaak 11. Mär 2008 09:52

Re: Eigenes Favoriten-Menü
 
Moin, Moin,
na, steht da doch: HWND - also bestimmt das Handle des aufrufenden Fensters, also deines Formulars...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 Uhr.
Seite 1 von 2  1 2      

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