AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Nach Batchencode Datei OHNE OpenDialog öffnen - Wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Nach Batchencode Datei OHNE OpenDialog öffnen - Wie?

Ein Thema von DRPEnc · begonnen am 27. Feb 2004 · letzter Beitrag vom 29. Feb 2004
Antwort Antwort
Seite 1 von 2  1 2      
DRPEnc

Registriert seit: 20. Feb 2004
Ort: Noch unterm Mond
126 Beiträge
 
#1

Nach Batchencode Datei OHNE OpenDialog öffnen - Wie?

  Alt 27. Feb 2004, 21:52
[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:

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...

Könnte ich ein Beispiel von Euch haben?
CU

DRPEnc
  Mit Zitat antworten Zitat
DRPEnc

Registriert seit: 20. Feb 2004
Ort: Noch unterm Mond
126 Beiträge
 
#2

Re: ShellExecuteEx wie ausführen

  Alt 28. Feb 2004, 02:30
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...
CU

DRPEnc
  Mit Zitat antworten Zitat
DRPEnc

Registriert seit: 20. Feb 2004
Ort: Noch unterm Mond
126 Beiträge
 
#3

Re: ShellExecuteEx wie ausführen

  Alt 28. Feb 2004, 02:46
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.
Wie kann ich diese Informationen nach einem Batchaufruf anzeigen lassen?

Der Name der Datei steht in einer Edit:

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 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;
CU

DRPEnc
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: ShellExecuteEx wie ausführen

  Alt 28. Feb 2004, 03:39
Bei so viel Text und Sourcecode habe ich jetzt irgendwie den Überblick verloren, was du willst bzw. wo dein Problem liegt. Könntest du das noch mal auf den Punkt bringen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DRPEnc

Registriert seit: 20. Feb 2004
Ort: Noch unterm Mond
126 Beiträge
 
#5

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?

  Alt 28. Feb 2004, 03:47
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...
CU

DRPEnc
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?

  Alt 28. Feb 2004, 04:03
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DRPEnc

Registriert seit: 20. Feb 2004
Ort: Noch unterm Mond
126 Beiträge
 
#7

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?

  Alt 28. Feb 2004, 10:28
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.

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.

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...
CU

DRPEnc
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#8

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?

  Alt 28. Feb 2004, 10:35
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.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?

  Alt 28. Feb 2004, 14:01
Hm, wenn das so ist, dann kuck mal in der Code-Lib nach CreateProcessCreateProcess.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
DRPEnc

Registriert seit: 20. Feb 2004
Ort: Noch unterm Mond
126 Beiträge
 
#10

Re: Nach ShellExecute Filesize anzeigen lassen - Wie?

  Alt 28. Feb 2004, 19:13
@ 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.
CU

DRPEnc
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr.
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