Autor Beitrag
woully
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Mo 24.08.09 14:09 
Hi,

folgendes problem :

Wie kann ich eine Verknüpfung von einem Button aus einer Form auf den Desktop per drag/drop erstellen ?

Danke
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 24.08.09 14:14 
Hi,

Ich versteh deine Frage gerade nicht wirklich. Willst du einen Button auf dem Desktop verknüpfen?
Oder eine Datei?
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mo 24.08.09 14:14 
Sorry, ich hab den Satz jetzt 3x gelesen. Ich verstehe trotdem nicht, was Du willst. :gruebel:

Gruß,
Jens

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
woully Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Mo 24.08.09 14:18 
Hi,

ja sorry, stimmt ist ein bischen unverständlich...

Ich will einfach ein Button auf den Desktop verknüpfen..
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 24.08.09 14:22 
Wie willst du einen Button aus einer Anwendung auf den Desktop verknüpfen? XD
Kannst einen Screenshot machen ihn ausdrucken dann ausschneiden und anschließend auf deinen Bildschirm ver(knüpfen).
woully Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Mo 24.08.09 14:27 
hummm

schon versucht...
Der Onclick event wird aber nicht ausgeführt....;-)
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mo 24.08.09 14:27 
So wie ich ihn verstanden habe, will er eine Verknüpfung haben die dann in seinem Programm einen Button drückt ohne das Programm auszuführen. :shock: :D :roll:

Was willst du???

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 24.08.09 14:30 
Moin!

user profile iconwoully hat folgendes geschrieben Zum zitierten Posting springen:
Ich will einfach ein Button auf den Desktop verknüpfen..
Einen Button kannst du ganz sicher nicht als Verknüpfung auf den Desktop legen. :nixweiss:

Workaround: mach eine Verknüpfung zu einer Anwendung und gib ihr spezielle Parameter mit, die du in der laufenden Instanz als Indiz für den Buttonklick heranziehen könntest. :idea:

Aber, ehrlich gesagt, das hört sich nach einem ziemlich kaputten Konzept an... :? Was soll denn das werden, wenn´s fertig ist? :gruebel:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 24.08.09 14:34 
Oder verknüpf eine Anwendung die lediglich eine wm_user... Message an deine Hauptanwendung schickt.
In der Hauptanwendung führst du beim empfangen dieser Message einfach den btnclick aus.

Aber auch ich verstehe den Sinn nicht. Und selbst wenn du es über diesen Umweg machst bleibt es ein
Narses hat folgendes geschrieben:
kaputtes Konzept
woully Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Mo 24.08.09 14:48 
ok,

hatte mir schon gedacht das es nicht einfach wird...

Ich versuche euch mal das ganze zu erklären, damit ihr sieht was es geben soll.

Meine Anwendung ist unsichtbar, erstellt aber einen Trayicon in der Taskbar.
Bei einem Klick auf das Icon wird ein Popup menü Erzeugt mit mehreren Buttons.

Beim Onclick Event von den Buttons, wird :

1. Eine webservice Anfrage gestartet.
2. Eine Datei (.exe) heruntergeladen und auf die Festplatte kopiert.
3. Diese exe Datei wird gestartet.

So, und nun soll der Benutzer die möglichkeit haben, sich eine Verknüpfung von diesen Buttons aus dem popupmenü, auf den Desktop zu legen (per Drag and Drop.)
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 24.08.09 15:14 
Verknüpfung erstellen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
function CreateLink(const AFilename, ALNKFilename, ADescription, AArgument: string) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
  wsz : PWideChar;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PChar(AFilename));
    psl.SetDescription(PChar(ADescription));
    psl.SetWorkingDirectory(PChar(ExtractFilePath(AFilename)));
    psl.SetArguments(PChar(AArgument));
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      GetMem(wsz, MAX_PATH*2);
      try
        MultiByteToWideChar(CP_ACP, 0, PChar(ALNKFilename), -1, wsz, MAX_PATH);
        ppf.Save(wsz, true);
        result:=true;
      finally
        FreeMem(wsz, MAX_PATH*2);
      end;
    end;
  end;
end;


Den Pfad vom Desktop kannst du mit Suche in: Delphi-Forum, Delphi-Library GETSHELLFOLDER ermitteln. Dann musst du nur noch die Parameter auswerten:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.OnCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ParamCount -1 do
  begin
    if ParamStr(i) = '-deinParameter' then
      Button.Click;
  end;
end;
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 24.08.09 15:23 
Hmm also auf den Ersten blick sehe ich das sich das ganze im Oncreate befindet.

Aber die Anwendung läuft doch bereits. In dem Fall würde man sie dann extra Starten.

Naja wenn das so gewollt ist wurde der Quelltext ja schon 1A mitgeliefert. ;)
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 24.08.09 15:49 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Hmm also auf den Ersten blick sehe ich das sich das ganze im Oncreate befindet.

Aber die Anwendung läuft doch bereits. In dem Fall würde man sie dann extra Starten.

Naja wenn das so gewollt ist wurde der Quelltext ja schon 1A mitgeliefert. ;)


Naja, wenn die Anwendung noch nicht läuft kann man meinen Code verwenden, falls doch muss man halt die Parameter an die erste Instanz weiterleiten. Z. B. mit einem mutex (siehe Anhang)
Einloggen, um Attachments anzusehen!
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mo 24.08.09 16:55 
user profile iconwoully hat folgendes geschrieben Zum zitierten Posting springen:

So, und nun soll der Benutzer die möglichkeit haben, sich eine Verknüpfung von diesen Buttons aus dem popupmenü, auf den Desktop zu legen (per Drag and Drop.)


Warum denn das? Also ich möchte mir als Benutzer nicht den ganzen Desktop mit Verknüpfungen zu verschiedenen Programmfunktionen zumüllen. Ist doch mit dem PopUp Menu viel besser gelöst.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 24.08.09 17:00 
user profile iconDude566 hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconwoully hat folgendes geschrieben Zum zitierten Posting springen:

So, und nun soll der Benutzer die möglichkeit haben, sich eine Verknüpfung von diesen Buttons aus dem popupmenü, auf den Desktop zu legen (per Drag and Drop.)


Warum denn das? Also ich möchte mir als Benutzer nicht den ganzen Desktop mit Verknüpfungen zu verschiedenen Programmfunktionen zumüllen. Ist doch mit dem PopUp Menu viel besser gelöst.


Gibt bestimmt User die so eine Funktion haben möchten.
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Mo 24.08.09 17:32 
Tja nur lässt es sich schwer realisieren da wenn das alle Anwendungen machen eben i-wann kein Platz mehr da wäre.
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mo 24.08.09 17:44 
user profile iconthepaine91 hat folgendes geschrieben Zum zitierten Posting springen:
Tja nur lässt es sich schwer realisieren da wenn das alle Anwendungen machen eben i-wann kein Platz mehr da wäre.


Ich denke er wird die Verknüpfung auf Wunsch vom User (also als Option) erstellen lassen. Wenn ich der Meinung bin das so ein Icon meinen Desktop vollmüllt klicke ich einfach nicht auf den "Verknüpfung erstellen"-Button in der jeweiligen Anwendung, oder?
woully Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Do 10.09.09 16:36 
Hi,

So, Problem ist gelöst.

Klar waren es sonderwünsche von Kunden. Warum auch immer.

also, ich habe folgende function verwendet :
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
function TMPopup.CreateDesktopLink(strArgument : String;strName : String) : Boolean;

const
  IID_IPersistFile: TGUID = '{0000010b-0000-0000-C000-000000000046}';

var
  slShellLink    : IShellLink;   // ShellLink Interface
  pfPersistFile  : IPersistFile; // Shortcut (Link) Permanent speichern
  wszShortCut    : PWideChar;    // Buffer für den Shortcutnamen
  hRes           : HResult;      // Für Zwischenergebnisse
  sShortCut      : string;       // So heisst dann der Shortcut
  dwLen          : DWORD;
  strIconPath    : Widestring;
  pszIcon        : PChar;

begin
  Result := false;
  // COM Object der Klasse ShellLink erzeugen
  hRes := CoCreateInstance(CLSID_ShellLink,      // ID von ShellLink (Typ TGUID)
                           nil,
                           CLSCTX_INPROC_SERVER,
                           IID_IShellLinkA,      // Referenz auf die Funktion
                           slShellLink);         // Pointer auf IShellLink Interface
  if hRes <> S_OK then
  begin
    exit;
  end;
  slShellLink.SetPath(PChar(Paramstr(0)));
  slShellLink.SetArguments(Pchar(strArgument));
  strIconPath :=  ExtractFilePath(Paramstr(0))+'fluid-bit.ico';

  if fileExists(striconPath) then
  Begin
    pszIcon := strAlloc(MAX_PATH);
    try
      strpCopy(pszIcon,strIconPath);
      slShellLink.SetIconLocation(pszIcon,0);
    finally
      strDispose(PszIcon);
    end;
  end;
                           // Auf diese Datei geht der Link
  hRes := slShellLink.QueryInterface(IID_IPersistFile,pfPersistFile); // Pointer auf IPersist holen
  if hRes <> S_OK then
  begin
    exit;
  end;
  dwLen := (MAX_PATH+1)*2;
  wszShortcut := AllocMem(dwLen);
  try
    sShortCut := ChangeFileExt(strName,'.LNK');
    sShortCut := szDesktopFolder + '\' + ExtractFileName(sShortCut);
    StringToWideChar(sShortCut,wszShortCut,dwLen);
    hRes := pfPersistFile.Save(wszShortCut, TRUE); // Jetzt noch den Link speichern
  finally
    FreeMem(wszShortCut,dwLen);   // und den Platz wieder freigeben
  end;
  Result := (hRes = S_OK);
end;

Ich erzeuge einen Shortcut auf die eigene Software.
Dem Schortcut verpasse ich ein Argument.

Beim aufruf von dem shortcut weiss die Software dann was für Funktionnalitäten auszuführen sind.

Vielleicht eine unschöne Lösung, aber laufenden auf jeden Fall.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt