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/)
-   -   Delphi Nach Batchencode Datei OHNE OpenDialog öffnen - Wie? (https://www.delphipraxis.net/17077-nach-batchencode-datei-ohne-opendialog-oeffnen-wie.html)

DRPEnc 27. Feb 2004 20:52


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 zum ersten Post auf der Zweiten Page von diesem Thread. THX

################################################## ###############################



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:
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;
Leider bekomm ich da noch ne Fehlermeldung wenn ichs so aufrufen will:

Delphi-Quellcode:
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;
Incompatible types. String and Extended.

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:
ShellExecute(0, Nil, PChar('C:\DRPEncPrediction.bat'), Nil, Nil, SW_NORMAL);
auf welche sich nach erfolgreichem Encodieren selber schließt. Könnte dies aber wenn benötigt ändern.

Die encodierte Datei hat dann auch nen festen Namen. Somit auch leicht zu öffnen.

hab das gefunden: ShellExecuteEX komm aber damit nicht weiter...:wiejetzt:

Könnte ich ein Beispiel von Euch haben?

DRPEnc 28. Feb 2004 01:30

Re: ShellExecuteEx wie ausführen
 
Das mit der filesize hab ich so gelöst:

Delphi-Quellcode:
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;
Und anzeigen mit:

Delphi-Quellcode:
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;
Nun muss ich das Ganze automatisieren...

DRPEnc 28. Feb 2004 01:46

Re: ShellExecuteEx wie ausführen
 
Delphi-Quellcode:
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;
Nun kann ich die Dateigrößen vergleichen. :firejump:
Wie kann ich diese Informationen nach einem Batchaufruf anzeigen lassen?

Der Name der Datei steht in einer Edit:

Delphi-Quellcode:
form1.Edit2.text:=OpenDialog2.FileName + form7.edit4.text + form7.edit1.text + form7.edit2.text + 'prediction.mpg';
welcher dann zum Beispiel dann so gespeichert wurde: Encode540070008000prediction.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;

Luckie 28. Feb 2004 02:39

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?

DRPEnc 28. Feb 2004 02:47

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:

Luckie 28. Feb 2004 03:03

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.

DRPEnc 28. Feb 2004 09:28

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
 
OK hier nochmal im Detail: Ich drücke auf den Knopf:

Delphi-Quellcode:
procedure TForm12.Button8Click(Sender: TObject);
var a,b,c :real;
begin
Nun soll die Batchdatei gestartet werden, wobei Ich nicht weis wie der ShellExecuteandWait Befehl funktioniert.

Delphi-Quellcode:
ShellExecute(0, Nil, PChar('C:\DRPEncPrediction.bat'), Nil, Nil, SW_NORMAL);
...ShellExecute reicht ja nicht. Dann soll Folgedes nach Beendigung von der Batch passieren welche sich selber schließt:

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:
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');
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.

Delphi-Quellcode:
if FloatToStr(b) < FloatToStr(c) then form8.Edit4.text:=('Wert von form8.Edit4' + 1000);
und die Batch wieder starten

Ist die Dateigröße zu groß sollen die letzen Einstellungen verwendet werden. Weis aber nicht wie ich dies anstellen soll:

Delphi-Quellcode:
//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;
Das sind meine Probleme... :gruebel:

nailor 28. Feb 2004 09:35

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.

Luckie 28. Feb 2004 13:01

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
 
Hm, wenn das so ist, dann kuck mal in der Code-Lib nach CreateProcessCreateProcess.

DRPEnc 28. Feb 2004 18:13

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?
 
@ Luckie: Und wie weiter? ...

Delphi-Quellcode:
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;
Und Aufruf mit:

Delphi-Quellcode:
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;
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?

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:

An sonsten könntest du einfach testen, ab wann du Schreibzugriff auf die Videodatei bekommst (falls die Batch das vorher blockiert) und dann weitermachen
Ich will ja nur die Größe auslesen. Bearbeitet wird diese MPEG-Datei nicht mehr. Mit dem Größenvergleich starte ich die Funktion die Bitraten in den Edits zu verändern. Dann soll die Batch wieder von vorne anlaufen.

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.
Seite 1 von 2  1 2      

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