![]() |
Kontextmenü, Parameterübergabe, Dateiupload
Schönen Guten Tag zusammen,
da mich meine Delphi Erfahrung an einer Stelle nicht weiterbringt, habe ich mich mal registriert. Zur Problem Erklärung: Ich habe ein recht fortgeschrittenes Programm (von Aufwand und Zeit) welches in der Lage ist, via OpenDialog eine PDF zu nehmen und via Http wo hochzuladen.
Code:
Das funktioniert auch einwandfrei. Das Problem das ich habe bezieht sich auf eine Erweiterung des ganzen. Ich habe mein Programm in die Registry eingetragen und .pdf Dateien Damit verknüpft. Wenn man jetzt einen Rechtsklick macht auf eine PDF öffnet sich das Kontextmenü mit einem Eintrag meines Programms. Führt man dies aus, startet mein Programm und ich bekomme eine Showmessage mit dem Pfad und Namen der PDF. Funktioniert auch alles bis dahin. Jetzt soll aber eben dieser Pfad genommen werden undeben diese Datei und dann, man kanns eraten, soll die PDF hochgeladen werden.
procedure TForm1.PDFoeffnen();
var pdffileupl, pdffiletmp: String; begin pdffiletmp:=''; if PDFUploaded then pdffileupl:=pdffile else pdffileupl:=''; Ini:=TIniFile.Create(rootpath+'cospace.ini'); try begin OpenDialog1.InitialDir:= Ini.Readstring('Optionen', 'PDFStandartOpenPath',''); OpenDialog1.execute; end; finally ini.free; end; pdfpathfile:=OpenDialog1.FileName; pdffiletmp:=Extractfilename(pdfpathfile); if pdffiletmp<>'' then begin pdffile:=pdffiletmp; cosupload(); GetInfo(); PDFFileProc(pdfpathfile, Extractfilepath(Application.exeName)+'archive\'+pdffile,'move'); btnPDFoeffnen.Enabled:=False; end else begin btnPDFoeffnen.Enabled:=True; end; Opendialog1.FileName:=''; end; Schaut so aus:
Code:
Beide bisher gezeigten Codes laufen auf den Upload hinaus, welcher sich unter cosupload verbirgt.procedure TForm1.PDFoeffnenKontext(StrParam1: String); var SR : TSearchRec; Result: integer; pdffileupl, pdffiletmp: String; begin showmessage(StrParam1); if FindFirst(StrParam1, faAnyFile, SR)=0 then begin Result:=SR.Size; FindClose(SR); showmessage(inttostr(Result)); end; pdfpathfile:=StrParam1; pdffiletmp:=Extractfilename(pdfpathfile); if pdffiletmp<>'' then begin pdffile:=pdffiletmp; cosupload(); PDFFileProc(pdfpathfile, Extractfilepath(Application.exeName)+'archive\'+pdffile,'move'); btnPDFoeffnen.Enabled:=False; end else begin btnPDFoeffnen.Enabled:=True; end; end; Und da ist der Wurm drin.
Code:
showmessage('Test A') wird mir noch angezeigt, danach gibts folgenden Fehler:procedure TForm1.cosupload(); begin try Showmessage('Test A'); pbStatus.visible:=true; Showmessage('Test A1'); s3:=''; Showmessage('Test A2'); Form1.lbStatuschng.caption:='PDF wird hochgeladen'; Showmessage('Test A3'); lbstatuschng.Font.Color:=clGreen; Showmessage('Test A4'); lbStatusLED.Font.Color:=clGreen; Showmessage('Test A5'); lbStatusLED.Visible:=True; Showmessage('Test A6'); lbPDFName.Caption:=pdffile; Exception Error EAccessViolation : Zugriffsverletzung bei Adresse 00404394 in Modul 'Cospace.exe'. Lesen von Adresse FFFFFFFC Kann sich das jemand erklären? Bitte um Hilfe. Mit freundlichem Gruß jacko1988 PS.: Gibt es einen Spoiler Code im Forum? |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Funktioniert es, wenn Du testhalber vor dem Aufruf von cosupload() ein Application.ProcessMessages einfügst?
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Deine TForm1-Instanz wurde auch "richtig" erstellt?
Also vor Aufruf von PDFoeffnenKontext. PS: Du weißt aber, daß OpenDialog1.Execute einen Rckgabewert hat, welcher dir sagt, ob darin auf OK geklickt wurde? Das solltest du besser mal verwenden und stattdessen dieses ganze wirre Zeugs, mit den Strings, abschaffen, denn da sieht doch keiner durch. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Vielen dank für diese raschen antworten.
@DeddiH Nein, es gibt wieder den selben Fehler. @himitsu Das Programm befindet sich zum Testzeitpunkt im Compilierten und gestarteten Modus. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Ist denn das Fenster zu dem Zeitpunkt schon sichtbar?
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Das hatte ich nicht gefragt und ich war schon davon ausgegangen, daß es kompiliert war und das Programm lief ... sonst hätte diese Funktion auch nicht aufgerufen werden können. :zwinker:
Zitat:
Also, ist die Fenster-Instanz erstellt und wenn ja wie? Wann und wie/wo wird diese Methode aufgerufen? |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Um das einmal zu präzisieren: wir hegen beide den Verdacht, dass die pbStatus-Instanz zum Aufruf-Zeitpunkt noch nicht existiert bzw. vollständig initialisiert ist.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Das Programm wird gestartet, Form1 ist sichtbar.
Form1 wird durch OnFormCreate erstellt. Doch die ist vorhanden. Es ist möglich über PDFoeffnen() eine PDF hochzuladen, nicht jedoch über PDFoeffnenKontext() |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Und der Fehler tritt nachweislich in der pbStatus-Zeile auf (im Debugger durchgesteppt)?
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Ja.
Nehme ich pbStatus.visible:=true; aus dem Code raus, dann hängst bei Form1.lbStatuschng.caption:='PDF wird hochgeladen';. Nehme ich alles bis zum eigentlichen Upload raus, gibt es keine Fehlermeldung, aber auch keinen Upload. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Also wenn das Formular samt aller darauf befindlichen Komponenten bereits zu sehen ist, fällt mir im Moment auch nichts mehr ein. Möglicherweise handelt es sich um einen Seiteneffekt, der durch Code verursacht wird, den Du nicht gepostet hast, aber das ist reine Kaffeesatzleserei. Ich würde noch das "Form1." vor lbStatuschng entfernen, aber das ist wohl hier nicht die Ursache.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
hmmm...
kann jetzt schlecht knapp 3000 Codezeilen posten. Aber vielleicht kann jemand den Code Testen, zumindest den der dafür verantwortlich ist eine pdf hochzuladen, bzw. den Code für 1. Kontextmenü 2. Parameterübergabe 3. Was tun mit der PDF Wäre furchtbar nett wenn sich jemand findet. Edit: Mir fällt gerade noch eine möglichkeit ein. Ist es möglich dem OpenDialog nur per Code zu sagen das er diese Datei öffnen soll? Irgendwas muss OpenDialog doch machen was ich so Manuel mit der Parameterübergabe nicht mache. Mit freundlichen Grüßen jacko1988 |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Der OpenDialog macht (wie der Name schon vermuten lässt) lediglich ein Dialogfenster auf um eine Datei auszuwählen. Den Punkt hast du schon erledigt.
3000 Zeilen würde ich auch nicht posten sondern in ein zip File packen und hier als Anhang rein. Am interessantesten wäre aber der Part, wo du den ParamStr ausliest und die Funktion aufrufst. Ich vermute, das passiert in der dpr. Dann wäre dieser Dateiinhalt der wichtigste. Und ich teile die Meinung von DeddyH und himitsu, dass da noch nicht alles richtig initialisiert wurde. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Zitat:
Zitat:
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Wenn man absolute Pfade verwendet, sollte das Arbeitsverzeichnis aber keine Rolle spielen.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Hier der ParamStr-Code:
Code:
Wenn nicht alles initialisiert ist, wieso ist es dann möglich über OpenDialog den Upload zu vollziehen{$R *.res} {$R 'Win7UAC.res'} var StrParam1: String; begin if (ParamCount>0) and (FileExists(ParamStr(1))) then begin Form1.PDFoeffnenKontext(ParamStr(1)); end; davor und danach (wobei das danach Wurst ist)? |
AW: Kontextmenü, Parameterübergabe, Dateiupload
DIrekt nach den $R sieht das aber ganz nach dem dort oben beschriebenen aus - Form1 ist noch nicht initialisiert!
Vielleicht bringst Du den Code besser in FormCreate oder FormShow unter und nicht am Anfang des Hauptprogrammes? |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Wenn ich den Code in Unit 1 reinbringe, wird der Code auch nicht mehr ausgeführt. Woher auch. Wenn der im Hauptcode nicht ist, kann die Procedure in Form 1 nicht aufgerufen werden.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Delphi-Quellcode:
Wieso sollte sich das nicht aufrufen lassen?
procedure TForm1.FormShow(Sender: TObject);
begin if (ParamCount>0) and (FileExists(ParamStr(1))) then PDFoeffnenKontext(ParamStr(1)); end; |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Hab den Code aus dem Project Code rausgenommen und in Form1.Show gefügt.
Wenn ich jetzt per Kontexmenü einen Parameter Aufruf starte, passiert gar nichts. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Gar nichts = es öffnet sich kein Fenster, der Prozess wird nicht einmal gestartet? Oder "gar nichts" = "nicht das, was du erwartet hast"?
Außerdem: hast Du mal nen Breakpoint in die erste Zeile in FormShow gesetzt und geschaut, ob das aufgerufen wird? Hätte Dir auch schon zu Anfang geholfen, weil Du dann in den Watches gesehen hättest, dass Form1 = nil :) |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Wenn die Instanz Form1 nicht erzeugt wurde und diese Instanz aber angesprochen werden soll, dann knallt es eben.
Zeig doch mal die gesamte dpr, da ist irgendwo auch der Teil, wo die Instanz Form erzeugt wird, aber wohl erst nach deinem Aufruf. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Wenn in der Methode nichts passiert, ist möglicherweise der Handler nicht mit dem Ereignis verknüpft. Das kann man aber im Objektinspektor leicht feststellen.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Code:
program Test;
uses MidasLib, Windows, Forms, Dialogs, SysUtils, AdrbookUnit in 'AdrbookUnit.pas' {Form3}, LogFileUnit in 'LogFileUnit.pas' {Form4}, uLkJSON in 'uLkJSON.pas', MainUnit in 'MainUnit.pas' {Form1}, OptionsUnit in 'OptionsUnit.pas' {Form2}, IdSSLOpenSSL in 'C:\Programme\CodeGear\RAD Studio\5.0\source\Indy\Indy10\Protocols\IdSSLOpenSSL.pas', InfoUnit in 'InfoUnit.pas' {Form5}; {$R *.res} {$R 'Win7UAC.res'} var Semaphore: THandle; begin if (ParamCount>0) and (FileExists(ParamStr(1))) then begin Form1.Show; end; Semaphore := CreateSemaphore(nil, 1, 1, PChar(MainUnit.MyGUID)); if (GetLastError = ERROR_ALREADY_EXISTS) then PostMessage (HWND_BROADCAST, MainUnit.ActivationMessage,0,0) else begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.Title := 'Test Programm'; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm5, Form5); Application.Run; end; CloseHandle(Semaphore); end. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Delphi-Quellcode:
begin
if (ParamCount>0) and (FileExists(ParamStr(1))) then begin Form1.Show; //<-- Hier gibt es noch kein Form1... end; Semaphore := CreateSemaphore(nil, 1, 1, PChar(MainUnit.MyGUID)); if (GetLastError = ERROR_ALREADY_EXISTS) then PostMessage (HWND_BROADCAST, MainUnit.ActivationMessage,0,0) else begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.Title := 'Test Programm'; Application.CreateForm(TForm1, Form1); //<-- ...denn hier wird es erst erzeugt Application.CreateForm(TForm5, Form5); Application.Run; end; CloseHandle(Semaphore); end. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Soweit kann ich folgen.
Aber wie muss das denn dann aussehen? Ich meien ich habe einen Semaphore Code drinne, der muss auch unbedingt bleiben. Wahrscheinlich seh ich vor lauter Code den Schnipsel nicht. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Kann er ja auch. Du sollst doch nur das ParamStr-Gedöns aus der *.dpr herausnehmen und im Hauptformular verarbeiten.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
So schauts aus nun, nur bekomme ich die Showmessage nicht.
Im OnShow Ereigniss der Form1 ist OnShow eingetragen.
Code:
procedure TForm1.FormShow(Sender: TObject);
var StrParam1 : String; begin if (ParamCount>0) and (FileExists(ParamStr(1))) then begin showmessage(StrParam1); //Form1.PDFoeffnenKontext(ParamStr(1)); end; end; |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Setz doch mal einen Breakpoint in die erste Zeile und schau, ob dort auch angehalten wird.
P.S.: benutze doch bitte Delphi-Tags, das ist der Helm im Beitragseditor. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Habe nen Breakpoint gesetzt.
Prgramm via Delphi compiliert, Parameterübergabe ausgeführt: Keine Reaktion. Es passiert nichts, nichtmal in Delphi. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Kannst Du mal die *.dfm von Form1 hier posten? Irgend etwas scheint ja damit nicht zu stimmen.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Liste der Anhänge anzeigen (Anzahl: 1)
Jop. als txt angehangen.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Das sieht soweit korrekt aus. Aber dann müsste doch der Haltepunkt auch angesprungen werden. Hast Du evtl. die Release-Konfiguration aktiviert? Falls ja, stell doch mal auf Debug um, erzeuge das Projekt neu und versuch es noch einmal mit dem Haltepunkt.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Projekt -> Optionen
Compiler -> Build-Konfiguration := Debug Ich setze einen Halte punkt in Zeile 736: das ist die Zeile NACH begin von TForm1.FormShow(Sender: TObject) Ich compiliere. Beim compilieren hält er an diesem Punkt. Ich drücke F9. Programm startet. Ich führe die Parameterübergabe aus, nichts passiert. |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Wird der Haltepunkt ausge'x't? Irgendwelche Compilermeldungen? Und was meinst Du mit "Parameterübergabe ausführen"?
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Beim Haltepunkt ist ein kleiner grüner Pfeil.
Dann ein bleuer Pfeil richtung rechts wenn die Stelle beim Compilieren erreicht wird. Springt aber sofort weiter und nichts. Parameterübergabe starten heisst folgendes: Das Programm läuft. Ich wechsel in einen x-beliebigen Ordner, klicke mit der rechten Maustaste auf eine PDF, wähle mein Programm aus dem Kontextmenü. Dann sollte eig. das Showmessage erscheinen und mir den Dateipfad und Namen anzeigen |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Gib doch zum Testen einfach unter Start-Parameter einen Dateinamen ein.
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Start Parameter? wie was wo?
|
AW: Kontextmenü, Parameterübergabe, Dateiupload
Das Problem ist doch jetzt gerade folgendes:
Die Programm-Instanz, die du gerade im Debugger überwachst, ist nicht die Instanz, die läuft, wenn du per Kontext-Menü eine Datei auswählst. Darum überprüfst du das ja auch mit dem Semaphore und schickst eine Nachricht und diese Instanz (die einzige Instanz, die deinen Wunsch - die PDF-Datei - kennt) wird wieder beendet. Aber wo schickst du denn den Dateinamen an die andere Programm-Instanz? Und wenn du das nicht schickst, wie soll diese Instanz das wissen? |
AW: Kontextmenü, Parameterübergabe, Dateiupload
Jupp.
Zitat:
Und dort das angeben, was dir der Explorer übergeben würde. Wenn du die Parameter nicht kennst: Im Programm bei Programmstart einfach
Delphi-Quellcode:
aufrufen, in dem Dialog Strg+C
ShowMessage(GetCommandLine);
und da bei Parameter reinkopieren (Strg+V) ... natürlich nicht vergessen den Programmnamen (erster Parameter) zuentfernen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 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