Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Kontextmenü, Parameterübergabe, Dateiupload (https://www.delphipraxis.net/171844-kontextmenue-parameteruebergabe-dateiupload.html)

jacko1988 28. Nov 2012 09:26

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:
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;
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.
Schaut so aus:

Code:

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;
Beide bisher gezeigten Codes laufen auf den Upload hinaus, welcher sich unter cosupload verbirgt.
Und da ist der Wurm drin.

Code:

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;
showmessage('Test A') wird mir noch angezeigt, danach gibts folgenden Fehler:


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?

DeddyH 28. Nov 2012 09:32

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Funktioniert es, wenn Du testhalber vor dem Aufruf von cosupload() ein Application.ProcessMessages einfügst?

himitsu 28. Nov 2012 09:37

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.

jacko1988 28. Nov 2012 09:54

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.

DeddyH 28. Nov 2012 09:54

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Ist denn das Fenster zu dem Zeitpunkt schon sichtbar?

himitsu 28. Nov 2012 10:02

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:

Zitat von DeddyH (Beitrag 1193360)
Ist denn das Fenster zu dem Zeitpunkt schon sichtbar?

Jupp, sozusagen sowas.

Also,
ist die Fenster-Instanz erstellt und wenn ja wie?
Wann und wie/wo wird diese Methode aufgerufen?

DeddyH 28. Nov 2012 10:11

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.

jacko1988 28. Nov 2012 10:15

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()

DeddyH 28. Nov 2012 10:41

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Und der Fehler tritt nachweislich in der pbStatus-Zeile auf (im Debugger durchgesteppt)?

jacko1988 28. Nov 2012 10:50

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.

DeddyH 28. Nov 2012 10:57

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.

jacko1988 28. Nov 2012 11:09

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

Sir Rufo 28. Nov 2012 22:00

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.

BUG 28. Nov 2012 22:25

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Zitat:

Zitat von jacko1988 (Beitrag 1193374)
Irgendwas muss OpenDialog doch machen was ich so Manuel mit der Parameterübergabe nicht mache.

Ich bin nicht sicher, aber verändert OpenDialog nicht das Arbeitsverzeichnis?

Zitat:

Zitat von Muetze1 (Beitrag 619227)
Der OpenDialog verändert genauso den Pfad (abschaltbar über die Option: odChangeDir)


DeddyH 29. Nov 2012 07:09

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Wenn man absolute Pfade verwendet, sollte das Arbeitsverzeichnis aber keine Rolle spielen.

jacko1988 29. Nov 2012 09:52

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Hier der ParamStr-Code:

Code:

 {$R *.res}
 {$R 'Win7UAC.res'}

var StrParam1: String;
 begin

   if (ParamCount>0) and (FileExists(ParamStr(1))) then
      begin
         Form1.PDFoeffnenKontext(ParamStr(1));        
      end;
Wenn nicht alles initialisiert ist, wieso ist es dann möglich über OpenDialog den Upload zu vollziehen
davor und danach (wobei das danach Wurst ist)?

CCRDude 29. Nov 2012 09:56

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?

jacko1988 29. Nov 2012 10:28

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.

DeddyH 29. Nov 2012 10:46

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  if (ParamCount>0) and (FileExists(ParamStr(1))) then
    PDFoeffnenKontext(ParamStr(1));      
end;
Wieso sollte sich das nicht aufrufen lassen?

jacko1988 29. Nov 2012 11:31

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.

CCRDude 29. Nov 2012 11:56

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 :)

Sir Rufo 29. Nov 2012 12:07

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.

DeddyH 29. Nov 2012 12:11

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.

jacko1988 29. Nov 2012 12:12

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.

DeddyH 29. Nov 2012 12:14

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.

jacko1988 29. Nov 2012 12:52

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.

DeddyH 29. Nov 2012 12:56

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.

jacko1988 29. Nov 2012 13:44

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;

DeddyH 29. Nov 2012 13:56

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.

jacko1988 29. Nov 2012 14:11

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.

DeddyH 29. Nov 2012 14:14

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Kannst Du mal die *.dfm von Form1 hier posten? Irgend etwas scheint ja damit nicht zu stimmen.

jacko1988 29. Nov 2012 14:30

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jop. als txt angehangen.

DeddyH 29. Nov 2012 14:33

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.

jacko1988 29. Nov 2012 14:44

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.

DeddyH 29. Nov 2012 14:59

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Wird der Haltepunkt ausge'x't? Irgendwelche Compilermeldungen? Und was meinst Du mit "Parameterübergabe ausführen"?

jacko1988 29. Nov 2012 15:17

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

DeddyH 29. Nov 2012 15:45

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Gib doch zum Testen einfach unter Start-Parameter einen Dateinamen ein.

jacko1988 29. Nov 2012 15:56

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Start Parameter? wie was wo?

Sir Rufo 29. Nov 2012 16:22

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?

himitsu 29. Nov 2012 16:59

AW: Kontextmenü, Parameterübergabe, Dateiupload
 
Jupp.

Zitat:

Start Parameter? wie was wo?
Menü > Start > Parameter ?

Und dort das angeben, was dir der Explorer übergeben würde.

Wenn du die Parameter nicht kennst: Im Programm bei Programmstart einfach
Delphi-Quellcode:
ShowMessage(GetCommandLine);
aufrufen, in dem Dialog Strg+C
und da bei Parameter reinkopieren (Strg+V) ... natürlich nicht vergessen den Programmnamen (erster Parameter) zuentfernen.


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