![]() |
Datei mit meinem Programm öffnen
Hallo,
ich weiß diese Frage gab es schon aber ich habe noch eine etwas speziellere Frage. Ich kann EINE Datei im Windows öffnen mit meinem Programm Source: FORMSHOW
Delphi-Quellcode:
Nur wollte ich jetzt gerne mehrere Dateien gleichzeitig öffnen mit meinem Programm.Also mehrere markieren und sagen öffnen mit...
if (paramcount > 0) and FileExists(paramstr(1)) then
begin FileList.Add(paramstr(1)); end; Ich habe schon versucht eine for schleife drum herum zu bauen die bis anzahl paramcount zählt aber das geht auch nicht. Kann mir bitte jemand helfen? Danke Alex |
Re: Datei mit meinem Programm öffnen
Zitat:
Delphi-Quellcode:
PS: Ich würde das in's Form.Create Ereigniss schreiben.
for i := 0 to paramcount-1 do
if FileExists(paramstr(i)) then FileList.Add(paramstr(i)); |
Re: Datei mit meinem Programm öffnen
Liste der Anhänge anzeigen (Anzahl: 1)
In dem Fall irrst du, MrKnogge. "paramstr(0)" ist die Anwendung selbst (sprich: Pfad und Name der Exe), ab "paramstr(1)" bis "paramcount" folgen die Parameter. Das hat mit den null-basierenden Geschichten von Delphi nichts zu tun, darum sieht die Abfrage der Parameter immer so aus:
Delphi-Quellcode:
Bei der Lösung dieses Problems:
for i := 1 to paramcount do
{ ... } Zitat:
Wenn du einen Dateityp registrierst (bzw. wenn du einfach nur "Öffnen mit ..." wählst), dann ruft Windows das zugeordnete/ausgewählte Programm auf und übergibt die Datei als Parameter. Wenn du mehrere Dateien auswählst, dann wird nur dein Programm mehrfach gestartet, und jeder Instanz wird wieder jede ausgewählte Datei als Parameter übergeben. Im Klartext: Wählst du 10 Dateien aus, startet Windows normalerweise dein Programm 10x und übergibt jedem Programm eine Datei als ersten Parameter (sofern in der Registry nicht anders angegeben, wenn du den Dateityp registriert hast). Um das zu verhindern musst du drei Sachen machen -
|
Re: Datei mit meinem Programm öffnen
Hallo Mathias,
danke für dein Tip. Das nur eine Instanz von meinem Programm gestartet wird, habe ich schon soweit programmiert. WM_COPYDATA habe ich auch verwendet aber weiß nicht ob das sorecht funktioniert. Wäre toll wenn du mir den Source mal zur Verfügung stellen könntest. Danke Alex |
Re: Datei mit meinem Programm öffnen
Gerade passiert. ;)
|
Re: Datei mit meinem Programm öffnen
danke schön hab mir grade dein source gezogen
ich gebe dir mal trotzdem mein beispiel-prog vielleicht siehst du ja auch ein fehler drinne.
Delphi-Quellcode:
Danke nochmal
dpr:
uses hSemaphore : DWORD; hWindow : DWORD; cdWork : TcsCopyDataStruct; dwMSGFilepath : DWORD; i : Integer; dwMSGFilePath := RegisterWindowMessage('{06007663-C0F6-4069-A835-D85AD31B5011}'); hSemaphore := CreateSemaphore(nil,1,1,'{E564BC8A-FBBE-42BF-B3A0-9C153FBBA03D}'); if not ((hSemaphore = 0) or ((hSemaphore <> 0) and (GetLastError = ERROR_ALREADY_EXISTS))) then begin Application.Initialize; Application.Title := 'ITA'; Application.CreateForm(TMain_Window, Main_Window); Application.Run; end else begin hWindow := FindWindow(nil,'ITA'); if hWindow <> 0 then begin for i := 1 to ParamCount do begin if (paramcount > 0) and FileExists(paramstr(i)) then begin cdWork.dwData := dwMSGFilepath; cdWork.cbData := Length(paramstr(i)) + 1; cdWork.lpData := AllocMem(cdWork.cbData); try CopyMemory(cdWork.lpData,@paramstr(i)[1],cdWork.cbData-1); SendMessage(hWindow,WM_COPYDATA,0,lParam(@cdWork)); finally FreeMem(cdWork.lpData,cdWork.cbData); end; end; end; end; //Application.MessageBox('Programm läuft bereits','Hinweis',0); end; Main_Window: public procedure WndProc (var Msg: TMessage); override; type PcsCopyDataStruct = ^TcsCopyDataStruct; TcsCopyDataStruct = packed record dwData : DWORD; cbData : DWORD; lpData : Pointer; end; procedure TMain_Window.WndProc(var Msg: TMessage); var cdWork : PcsCopyDataStruct; begin if msg.Msg = WM_COPYDATA then begin cdWork := PcsCopyDataStruct(msg.lParam); MP3FileList.Add(PChar(cdWork.lpData)); exit; end; inherited; end; FORMSHOW: for i := 1 to ParamCount do begin if (paramcount > 0) and FileExists(paramstr(i)) then FileList.Add(paramstr(i)); end; Alex |
Re: Datei mit meinem Programm öffnen
Zitat:
|
Re: Datei mit meinem Programm öffnen
@Alex_ITA01: Ich will dich nicht kritisieren, aber das Record
Zitat:
Dann solltest du zumindest den Tipp von MrKnogge beherzigen und den Parameter im "OnCreate" der Form auslesen. "OnShow" wird(soweit ich weiß :?) auch wirksam, wenn dein Programm im Hintergrund war und nun wieder angezeigt wird. Das heißt, im ungünstigsten Fall liest du den Parameter einige Male ein. "OnCreate" wird dagegen nur einmal ausgeführt: nämlich beim Erzeugen der Form. Dann beim Suchen des Fensters gehst du auf Nummer Sicher, wenn du auch den Klassennamen (= den Namen der Form angibst:
Delphi-Quellcode:
Und das hier ist aus zwei Gründen zuviel:
hWindow := FindWindow('TMain_Form','ITA');
Zitat:
Zitat:
Schau dir dazu mal den Projektquelltext meines Beispiels an. Ich habe bloß nicht geprüft ob der Semaphore Null ist. Den Rest findest du allerdings, und ich hatte keine Probleme damit. Kurz gesagt: Mir kommt dein Programmcode (bei allem Respekt) zu umständlich vor. :) Habe ich jetzt den Jackpot? :stupid: |
Re: Datei mit meinem Programm öffnen
Hallo,
ich würde dringend empfehlen, auf jeglichen eigenen Programmcode zu verzichten und statt dessen die Unit JclAppInst aus der ![]() Gründe:
|
Re: Datei mit meinem Programm öffnen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz