![]() |
Nach Batchencode Datei OHNE OpenDialog öffnen - Wie?
[Edit] Das mit dem OpenAndWait wurde schon gelöst. Mein neues Problem ist eine Datei zu öffnen aber OHNE OpenDialog. Bitte springt gleich
![]() ################################################## ############################### Ich code gerade an meinem Project DRPEnc. Nun bin ich wieder bei einem Punkt angekommen, wo ich nicht weiter weis. Hier das Problem: Ich starte aus dem Program eine Batch-datei welche einen Teil des Films encodiert. Nach dem sich die Batch beendet hat (was das Program mitbekommen sollte) soll die größe der encodierten Datei in einer Listbox angezeigt werden. Falls dieser Wert von dem zuvor festgelegten Zielwert abweicht verändert DRPEnc ein paar Werte in der Batch-datei und startet diese erneut. Dies wiederholt sich solange bis der Wert gefunden wurde. Wie bekomme ich das am Besten hin. das Auslesen der Dateigröße mache ich mit dieser Funktion:
Delphi-Quellcode:
Leider bekomm ich da noch ne Fehlermeldung wenn ichs so aufrufen will:
function GetFileSize(Filename: string): integer;
var SR: TSearchRec; begin if FindFirst(Filename, faAnyFile, SR) = 0 then begin Result := SR.Size; end else begin Result := -1; end; FindClose(SR); end;
Delphi-Quellcode:
Incompatible types. String and Extended.
procedure TForm12.Button8Click(Sender: TObject);
begin If Not OpenDialog3.Execute Then Exit; listbox1.Items.add('Die Datei' + OpenDialog3.filename + 'hat ' + (GetFileSize(OpenDialog3.filename) / 1024) + 'kb'); end; Aber wie bekomm ich mein Programn nach Beendigung der Batch-Datei die encodierte Datei zu öffnen und dann die filesize auszulesen? Ich möchte es am liebsten irgendwie mit if ... then lösen. Die Batch rufe ich mit:
Delphi-Quellcode:
auf welche sich nach erfolgreichem Encodieren selber schließt. Könnte dies aber wenn benötigt ändern.
ShellExecute(0, Nil, PChar('C:\DRPEncPrediction.bat'), Nil, Nil, SW_NORMAL);
Die encodierte Datei hat dann auch nen festen Namen. Somit auch leicht zu öffnen. hab das gefunden: ![]() Könnte ich ein Beispiel von Euch haben? |
Re: ShellExecuteEx wie ausführen
Das mit der filesize hab ich so gelöst:
Delphi-Quellcode:
Und anzeigen mit:
function GET_FILE_SIZE(sFileToExamine:string;bInKBytes:boolean):string;
{for some reason both methods of finding file size return a filesize that is slightly larger than what Windows File Explorer reports} var FileHandle : THandle; FileSize : LongWord; d1 : double; i1 : int64; begin //a- Get file size FileHandle := CreateFile( PCHAR(sFileToExamine), GENERIC_READ, 0, {exclusive} nil, {security} OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); FileSize := GetFileSize(FileHandle,nil); result := INTTOSTR(FileSize); CloseHandle(FileHandle); //a- optionally report back in Kbytes //if bInKbytes = true then //begin //if length(result)> 3 then //begin //Insert('.',result,length(result)-2); //d1 := strtofloat(result); //result := inttostr(round(d1))+'KB'; //end //else //result := '1KB'; end; {******************************************** Hier eine andere funktionierende Methode: ********************************************* var SearchRec: TSearchRec; sgPath : String; inRetval, I1 : Integer; begin sgPath := ExpandFileName(sFileToExamine); Try inRetval := FindFirst(ExpandFileName(sFileToExamine), faAnyFile, SearchRec); If inRetval = 0 Then I1 := SearchRec.Size Else I1 := -1; Finally SysUtils.FindClose(SearchRec); End; result := Inttostr(I1); end; } //end;
Delphi-Quellcode:
Nun muss ich das Ganze automatisieren...
procedure TForm12.Button8Click(Sender: TObject);
var a,b :real; begin If Not OpenDialog3.Execute Then Exit; Edit8.Text:=GET_FILE_SIZE(Opendialog3.filename,true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); end; |
Re: ShellExecuteEx wie ausführen
Delphi-Quellcode:
Nun kann ich die Dateigrößen vergleichen. :firejump:
procedure TForm12.Button8Click(Sender: TObject);
var a,b,c :real; begin //ShellExecute(0, Nil, PChar('C:\DRPEncPrediction.bat'), Nil, Nil, SW_NORMAL); If Not OpenDialog3.Execute Then Exit; Edit8.Text:=GET_FILE_SIZE(Opendialog3.filename,true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate'); if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate'); end; Wie kann ich diese Informationen nach einem Batchaufruf anzeigen lassen? Der Name der Datei steht in einer Edit:
Delphi-Quellcode:
welcher dann zum Beispiel dann so gespeichert wurde: Encode540070008000prediction.mpg.
form1.Edit2.text:=OpenDialog2.FileName + form7.edit4.text + form7.edit1.text + form7.edit2.text + 'prediction.mpg';
Da ich die Datei demuxed hatte lautet dann die zu öffnende Datei: Encode540070008000prediction.mpg.m2v Der OpenDialog2.filename ist ja somit fix. Die Variablen varieren ja zu jedem encode, was auch sinn macht. HMM :gruebel: Sollte ich den form1.Edit2.text in ne listbox schreiben? Kann ich damit dann was anfangen? ... ne, ne Variable. Kann man :real und :string zusammen in eine Zeile schreiben? Denn ich will mal folgendes schaffen:
Delphi-Quellcode:
procedure TForm12.Button8Click(Sender: TObject);
var a,b,c :real; begin ShellExecute(0, Nil, PChar('C:\DRPEncPrediction.bat'), Nil, Nil, SW_NORMAL); //Folgendes soll nach Beendigung von der Batch passieren welche sich selber schließt: Edit8.Text:=GET_FILE_SIZE('Name der Encodierten Datei' + '.m2v',true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); //if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate'); if FloatToStr(b) < FloatToStr(c) then form8.Edit4.text:=('Wert von form8.Edit4' + 1000) und Batch starten; //Statt 1000 währen auch 40% OK... //if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate'); if FloatToStr(b) > FloatToStr(c) then 'Letzte Werte < FloatToStr(c)' wiederherstellen und Meldung ausgeben; end; |
Re: ShellExecuteEx wie ausführen
Bei so viel Text und Sourcecode habe ich jetzt irgendwie den Überblick verloren, was du willst bzw. wo dein Problem liegt. :gruebel: Könntest du das noch mal auf den Punkt bringen?
|
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Hi Luckie! Jo kann ich und danke das Du da bist!
K Ich lass eine Batch laufen. Beendet sich von selbst. Wenn dies passiert ist soll DRPEnc (das Programm worums hier geht) die Datei, die von der Batch erstellt wurde (eine M2V-Videodatei) selbstständig öffnen und die filesize ermitteln. Ist dieser Wert kleiner als der gewollte (wurde vorher festgelegt) soll DRPEnc die Werte der Bitraten (Werden in Edits gespeichert) verändern und die Batch mit den neuen Werten starten. Es ensteht eine weitere M2V-Videodatei. Diese wird wieder gecheckt. Wiederholung bis der Wert größer als der gewollte Wert ist. Dann sollen die letzen Werte des letzten Encodes, welcher kleiner war als der gewollte Wert hergenommen werden und dem User angezeigt werden. Zum Beispiel: Der Pass hat die Dateigröße von 73.35 MB. Gewollte Samplergröße war 74,10 MB. Benutze min.Bit: 5400, avg.Bit 7000, max.Bit 8000. Einfacher kann ichs Dir leider nicht erklären... :shock: |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Schön, jetzt hast du mir erklärt, was dein programm machen soll. Aber wo ist jetzt das Problem? Dioe Logik kann es ja nicht sein, die hast du ja gerade eben beschrieben.
|
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
OK hier nochmal im Detail: Ich drücke auf den Knopf:
Delphi-Quellcode:
Nun soll die Batchdatei gestartet werden, wobei Ich nicht weis wie der ShellExecuteandWait Befehl funktioniert.
procedure TForm12.Button8Click(Sender: TObject);
var a,b,c :real; begin
Delphi-Quellcode:
...ShellExecute reicht ja nicht. Dann soll Folgedes nach Beendigung von der Batch passieren welche sich selber schließt:
ShellExecute(0, Nil, PChar('C:\DRPEncPrediction.bat'), Nil, Nil, SW_NORMAL);
Die encodierte Datei soll ausgelesen werden und die Dateigröße in eine Edit geschrieben werden, damit ich diese mit dem festegelegten Wert vergleichen kann.
Delphi-Quellcode:
Wenn die Bitrate erhöht werden soll, sollte DRPEnc dies selbstständig tun. Am Besten prozentual sollen Werte in drei weiteren Edits (Bitraten) verändert werden.
Edit8.Text:=GET_FILE_SIZE('Name der Encodierten Datei' + '.m2v',true);
a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate');
Delphi-Quellcode:
und die Batch wieder starten
if FloatToStr(b) < FloatToStr(c) then form8.Edit4.text:=('Wert von form8.Edit4' + 1000);
Ist die Dateigröße zu groß sollen die letzen Einstellungen verwendet werden. Weis aber nicht wie ich dies anstellen soll:
Delphi-Quellcode:
Das sind meine Probleme... :gruebel:
//if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate');
if FloatToStr(b) > FloatToStr(c) then 'Letzte Werte < FloatToStr(c)' wiederherstellen und Meldung ausgeben; end; |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
also, hier mal ein versuch, dein Problem auf den Punkt zu bringen:
Du willst in deinem Code solange warten, bis ein anderes externes Programm fertig ist? Eventuell gibts dafür eine passende Funktion. Da hab ich jetzt aber keine Idee, welche. An sonsten könntest du einfach testen, ab wann du Schreibzugriff auf die Videodatei bekommst (falls die Batch das vorher blockiert) und dann weitermachen. |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Hm, wenn das so ist, dann kuck mal in der Code-Lib nach
![]() |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
@ Luckie: Und wie weiter? ...
Delphi-Quellcode:
Und Aufruf mit:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PDWORD): Longword;
var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; begin FillChar(StartupInfo, SizeOf(StartupInfo), #0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK; StartupInfo.wShowWindow := ShowCmd; if not CreateProcess(nil, @Filename[1], nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then Result := WAIT_FAILED else begin if wait = FALSE then begin if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId; exit; end; WaitForSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, Result); end; if ProcessInfo.hProcess <> 0 then CloseHandle(ProcessInfo.hProcess); if ProcessInfo.hThread <> 0 then CloseHandle(ProcessInfo.hThread); end;
Delphi-Quellcode:
Ich bekomm Die ProcID per Message. Wie bringe ich nun das Programm auf die Beendigung zu warten, damit ich mit der Dateigrößenvergleich fortfahren kann?
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; begin ProcID := 0; //if OpenDialog1.Execute then RunProcess('C:\DRPEncPrediction.bat', SW_SHOW, FALSE, @ProcID); ShowMessage(IntToStr(ProcID)); end; Was mir noch nicht klar ist das mit den Variablen über begin. Kann man verschiedene Arten von Variablen dort einbauen oder geht nur eine Art. ...wenn es gehen würde könnte ich mehre Funktionen auf einen Button schnalzen. @Nailor Zitat:
Wenn ich es schaffe das Programm dazu zu bringen auf die Batch zu warten und dann weiter zu machen ist mir schon geholfen... denke ich. |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Kuck dir mal den dritten parameter von RunProcess an, der legt fest, ob es erst nach Beendigung des externen Programmes weitergeht oder nicht.
|
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
RunProcess('C:\DRPEncPrediction.bat', SW_SHOW, FALSE, @ProcID);
Du meist sicher FALSE oder? Gibts irgendwo ne Documentation für RunProcess oder könntest Du mir die Parameter von RunProcess erklären? (Sorry, wenn die Frage noobiehaft ist...) [Edit] müsste doch TRUE statt FALSE rein, damit der Code wartet oder? Lag richtig:
Delphi-Quellcode:
Es wird dann Done in der listbox angezeigt. Ich öffne mal ne Datei nach der Batch...
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; begin ProcID := 0; //if OpenDialog1.Execute then RunProcess('C:\DRPEncPrediction.bat', SW_SHOW, TRUE, @ProcID); //ShowMessage(IntToStr(ProcID)); listbox1.Items.add('Done'); end; ... bekomme Probleme:
Delphi-Quellcode:
Statt dem OpenDialog über einen seperaten Button sollen die Zeilen oben nach der Beendigung der Batch gestartet werden.
If Not OpenDialog3.Execute Then Exit;
Edit8.Text:=GET_FILE_SIZE(Opendialog3.filename,true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate'); if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate'); end; Hab aber leider Stringvariable drin. Kann man String und Cardinal in einer Variablenzeile mischen? |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Was ist eine Variablenzeile?
|
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Egal... ich kann
Delphi-Quellcode:
Schreiben ... das meinte ich.
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; var a,b,c :real; Wie öffne ich den nun die Datei ohne OpenDialog? Hier nochmal wie die Datei beschaffen ist:
Delphi-Quellcode:
was dann eine Datei wie: Encode540070008000prediction.mpg.m2v gibt.
form1.Edit2.text:=OpenDialog2.FileName + form7.edit4.text + form7.edit1.text + form7.edit2.text + 'prediction.mpg';
Oder muss auch diese Datei einen fixen Namen haben? |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Hi!
Das kann an sich so nicht sein:
Delphi-Quellcode:
Müsste das nicht so sein:
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; var a,b,c :real; //<--- Hier!!
Delphi-Quellcode:
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; a,b,c :real; Ciao fkerber EDIT: Achja, wegen dem OpenDialog: Du verwendest ja eine Nutzer-"Eingabe" (nämlich den Filename). Wie willst du das umgehen? Ciao fkerber |
Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
Delphi-Quellcode:
So sollte es ungefähr aussehen. Sprich die MPEG-datei soll ohne 'User-Aufruf' gestartet werden...
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; a,b,c :real; begin ProcID := 0; //if OpenDialog1.Execute then RunProcess('C:\DRPEncPrediction.bat', SW_SHOW, TRUE, @ProcID); //ShowMessage(IntToStr(ProcID)); listbox1.Items.add('Done'); //OpenFile('Hier irgendwie die MPEG-Datei öffnen...'); Edit8.Text:=GET_FILE_SIZE('Name der geöffneten Datei',true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate'); if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate'); end;
Delphi-Quellcode:
... gibt ne Fehlermeldung. 'Sample in B' sollte kein valid Floating point value sein...
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; var a,b,c :real; begin ProcID := 0; //if OpenDialog1.Execute then RunProcess('C:\DRPEncPrediction.bat', SW_SHOW, TRUE, @ProcID); //ShowMessage(IntToStr(ProcID)); listbox1.Items.add('Done'); //OpenFile('C:\DRPEncPrediction.bat'); Edit8.Text:=GET_FILE_SIZE('C:\cococ102.m2v',true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate'); if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate'); end; Sample in B steht in der Edit 8, ergo wird mit Edit8.Text:=GET_FILE_SIZE('C:\cococ102.m2v',true); nicht die Datei geöffnet... wie dann?
Delphi-Quellcode:
... auch falsch... :wall: Muss doch irgendwie ohne OpenDialog zu öffnen sein... :gruebel:
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; a,b,c :real; wndFile: Integer; begin ProcID := 0; RunProcess('C:\DRPEncPrediction.bat', SW_SHOW, TRUE, @ProcID); listbox1.Items.add('Done'); wndFile := OpenFile('C:\cococ102.m2v'); //OpenFile('C:\cococ102.m2v'); Edit8.Text:=GET_FILE_SIZE(wndFile,true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate'); if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate'); end;
Delphi-Quellcode:
Hmm... irgendwie so... Will aber die M2V-Datei nicht mit dem Mediaplayer starten sondern nur die Dateigröße vergleichen.
ShellExecute(Handle,'open', 'http://delphi.about.com',nil,nil, SW_SHOWNORMAL);
Eigentlich brauch ich ja nur den Pfad von der Datei für GET_FILE_SIZE :cyclops:
Delphi-Quellcode:
Hmm... Wie anwenden... Bringts überhaupt was? :gruebel:
var pfad, name, ext, neuerName: string;
... pfad := ExtractFilePath(Application.ExeName); // der Pfad name := ExtractFileName(Application.ExeName); // der Name ext := ExtractFileExt(Application.ExeName); // die Dateierweiterung // Um im String die Dateierweiterung zu ändern, benutzt man folgende Funktion: neuerName := ChangeFileExt(Application.ExeName, '.tmp'); |
Re: Nach Batchencode Datei OHNE OpenDialog öffnen - Wie?
Ich denk mal ich bin wieder zu unübersichtlich...
K, Das mit der Batchdatei hat sich erledigt. Die Batch wird gestartet, beendet sich selber und der Code wird weiter ausgeführt. Da das Ganze dann voll automatisch ablaufen soll, soll eine MPEG-Datei (M2V) geöffnet werden, ohne das der User den Pfad angeben muss oder per OpenDialog bestimmen muss. Nach dem Zahlen in ein paar Edits geändert wurden soll die Batchdatei mit den geändertem Inhalt auch ohne Zutun des Users gestarten werden. Ich häng jetzt an dem Punkt fest, wie ich die M2V-Datei OHNE OpenDialog öffnen soll. Sie soll aber nicht mit dem MediaPlayer abgespielt werden, sondern an den GET_FILE_SIZE Befehl weitergeleitet werden! Irgend eine Idee?
Delphi-Quellcode:
procedure TForm12.Button7Click(Sender: TObject);
var ProcID: Cardinal; a,b,c :real; begin ProcID := 0; //if OpenDialog1.Execute then RunProcess('C:\DRPEncPrediction.bat', SW_SHOW, TRUE, @ProcID); //ShowMessage(IntToStr(ProcID)); listbox1.Items.add('Done'); //OpenFile('Hier irgendwie die MPEG-Datei öffnen...'); Edit8.Text:=GET_FILE_SIZE('Name der geöffneten Datei',true); a:= StrToFloat(Edit8.text); b:=(a / 1024) /1024; c:= StrToFloat(Edit9.text); listbox1.Items.add('This Pass has the filesize of ' +FloatToStr(b)+ ' MB'); if FloatToStr(b) < FloatToStr(c) then listbox1.Items.add('Higher the bitrate'); if FloatToStr(b) > FloatToStr(c) then listbox1.Items.add('Lower the bitrate'); end; |
Re: Nach Batchencode Datei OHNE OpenDialog öffnen - Wie?
Problem hab ich selbst mit SaveDialog gelöst. Danke nochmal für die Tips von dir Luckie und Co. :zwinker:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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