![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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