Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eigenartiges Verhalten bei Nutzung von openDialog


daywalker0086 - Do 26.06.14 15:40
Titel: Eigenartiges Verhalten bei Nutzung von openDialog
Hallo Leute,
ich habe ein eigenartiges Verhalten bei der Ntuzung von einem OpenDialog.
Folgendes soll passieren:
Über den Opendialog wähle ich eine Datei aus und der Pfad wird in einem Editfeld geschrieben:

Delphi-Quelltext
1:
2:
3:
4:
if open_oldfile_dlg.Execute then
     begin
     showmessage(open_oldfile_dlg.FileName);
     edit1.Text:= open_oldfile_dlg.FileName;

Danach führe ich über den die Komponente DosCommand einen CreatProces aus:

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:
CommandLine:= 'avr\avrdude.exe ';
  Form1.DosCommand_Atmel.WorkingDirectory:='avr\';        //immer mit Commandline Pfad verändern
  for i:= rpp_unit.parameter_begin to pred(rpp_unit.param_value) do
  begin
  if v_edit[i].Name = 'SCHNITTSTELLE' then
  CommandLine:= CommandLine+ '-P '+ v_edit[i].Text+' ';
  if v_edit[i].Name = 'PROGRAMMER' then
  CommandLine:= CommandLine+ '-c '+ v_edit[i].Text+' ';
  if v_edit[i].Name = 'PROCESSOR' then
  begin
    value:= v_edit[i].Text;
    Delete(value,1,Pos('"',value));
    Delete(value,Pos('"',value),1);
    CommandLine:= CommandLine+ '-p '+ value+' ';
  end;
  if v_edit[i].Name = 'FUSE' then
  CommandLine:= CommandLine+v_edit[i].Text+' ';
  if v_edit[i].Name = 'DATEI' then
  CommandLine:= CommandLine+ '-U flash:w:"'+ Form1.Edit1.Text+'":a '; <-- hier wird der Pfad aus dem EditFeld eingefügt
  if v_edit[i].Name = 'CHIPPARAMETER' then
  CommandLine:= CommandLine+v_edit[i].Text+' ';
  if v_edit[i].Name = 'EEPROMDATEI' then
  begin
    if v_edit[i].Text<>''then
    begin
      CommandLine:= CommandLine+'-U eeprom:w:"'+v_edit[i].Text+'":a ';
    end;
  end;


  end;

 // c:\winavr\bin\avrdude.exe -e -P usb -c avrispmkII -p m88p -e -U lfuse:w:0xd2:m -U hfuse:w:0xdc:m -U efuse:w:0x1:m -U flash:w:"Oelkuehler.hex":a'
    Form1.DosCommand_Atmel.CommandLine:= CommandLine;


Wenn ich das ganze dann ausführe erhalte ich eine Exception:
Im Projekt rt_upp.exe ist eine Exception der Klasse TCreateProcessError mit der Meldung 'avr\avrdude.exe -p m88p -P usb -U flash:w:"T:\PRODUKT-DATEN\53_Software\530004\1.1\530004 kuehler 1.1.0.hex":a -c avrispmkII -U lfuse:w:0xd2:m -U hfuse:w:0xdc:m -U efuse:w:0x1:m -e doesn't exist.' aufgetreten.

Wenn ich aber den gleichen Pfad, also T:\PRODUKT-DATEN\53_Software\530004\1.1\530004 kuehler 1.1.0.hex in das Editfeld eintrage und dann den restlichen Code ausführe funktioniert alles tadellos.

Weis jemand Rat?


Nersgatt - Do 26.06.14 15:51

Ich vermute, dass er die exe (avrdude.exe) nicht findet. Das wird mit dem Parameter so direkt nichts zu tun haben.
Versuch mal, ob es klappt, wenn Du in der ersten Zeile Commandline := 'c:\kompletter\Pfad\zu\avrdude\avr\avrdude.exe' angibst.


baumina - Do 26.06.14 15:54

Interessant was genau in beiden Fällen (geht nicht / geht) in der Variable CommandLine genau drin steht und wie sich der Inhalt voneinander unterscheidet (ggf. in eine Datei schreiben.


daywalker0086 - Do 26.06.14 16:03

ich lasse mir mit showmessage den gesamten Commandlinestring ausgeben bevor dieser mit

Delphi-Quelltext
1:
form1.DosCommand_Atmel.Execute;                    


ausgeführt wird.

Einmal wenn ich den Pfad in das Editfeld händisch kopiert habe ( kein Fehler)
---------------------------
rt_upp
---------------------------
avr\avrdude.exe -p m88p -P usb -U flash:w:"T:\PRODUKT-DATEN\53_Software\530004\1.1\530004 Oelkuehler 1.1.0.hex":a -c avrispmkII -U lfuse:w:0xd2:m -U hfuse:w:0xdc:m -U efuse:w:0x1:m -e
---------------------------
OK
---------------------------

Nochmal wen nich den Pfad mit opendialog eitragen lasse (FEHLER)
---------------------------
rt_upp
---------------------------
avr\avrdude.exe -p m88p -P usb -U flash:w:"T:\PRODUKT-DATEN\53_Software\530004\1.1\530004 Oelkuehler 1.1.0.hex":a -c avrispmkII -U lfuse:w:0xd2:m -U hfuse:w:0xdc:m -U efuse:w:0x1:m -e
---------------------------
OK
---------------------------

die Exception tritt laut Delphi in folgendem Codeabschnitt der Komponente DosCommand auf:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  if not (CreateProcess(nil,
                        app_spawn, 
                        nil
                        nil
                        TRUE,
                        {CREATE_NEW_CONSOLE}{DETACHED_PROCESS}
                        CreationFlagValues[Ord(FCreationFlag)] or FPriority,
                        nil,
                        app_wdirectory,
                        si,
                        pi)) then
  begin
        //  —áŠO‚ðŽó‚¯Žæ‚éꊂª–³‚¢B
        //  ƒXƒŒƒbƒh‚Ì exitcode ‚É“ü‚ê‚é‚ׂ«HB
    FCreateProcessError := TCreateProcessError.Create(string(app_spawn)
      + ' doesn''t exist.');
    raise FCreateProcessError; <---HIER TRITT DER FEHLER AUF
    Exit;


baumina - Do 26.06.14 16:26

Interessant wäre auch noch der genaue Fehler ShowMessage(SysErrorMessage(GetLastError))


Nersgatt - Do 26.06.14 16:58

Setz mal den Haken open_oldfile_dlg.Option ofNoChangeDir.

Das Problem ist, dass der TOpenDialog das Arbeitsverzeichnis ändert und daher die exe nicht mehr gefunden wird (wie ich oben schon schrieb).
Die saubere Lösung ist, den kompletten Pfad zur Exe anzugeben (siehe oben).


daywalker0086 - Fr 27.06.14 07:34

Moin an alle,
der Hinweis mit dem Arbeitsverzeichnis war natürlich der Richtige, habe nichtmehr an sowas gedacht.
Vielen dank wie die wie immer kompetente Hilfe.