Thema: Delphi Hilfe Bei Video Program

Einzelnen Beitrag anzeigen

serasa

Registriert seit: 5. Feb 2009
3 Beiträge
 
#5

Re: Hilfe Bei Video Program

  Alt 1. Feb 2010, 17:38
So da leider noch einwas offen steht und ich nun nichtmehr weiter weiß^^

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls,
  inifiles,
  VideoCap, StdCtrls, Buttons, ComCtrls, Gauges,
  VideoCapErweiterung;


type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Beenden1: TMenuItem;
    Quelle1: TMenuItem;
    Einstellungen1: TMenuItem;
    Recorder1: TMenuItem;
    PanelStatus: TPanel;
    Ansicht1: TMenuItem;
    N1zu11: TMenuItem;
    Status1: TMenuItem;
    AnsichtUpdate1: TMenuItem;
    PanelVideo: TPanel;
    LabelVideo: TLabel;
    Timer1: TTimer;
    LabelAufnahmeID: TLabel;
    format1: TMenuItem;
    display1: TMenuItem;
    source1: TMenuItem;
    Aufnahme2: TMenuItem;
    Enzelaufnahme1: TMenuItem;
    N2: TMenuItem;
    StartesequenzielleAufnahme1: TMenuItem;
    Stop2: TMenuItem;
    Label1: TLabel;
    Button1: TButton;
    Info1: TMenuItem;
    AGElektro1: TMenuItem;
    procedure AnsichtUpdate1Click(Sender: TObject);
    procedure Status1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Video2;
    procedure CapStatus(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
    procedure Recorder1Click(Sender: TObject);
    procedure Hilfe1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure format1Click(Sender: TObject);
    procedure display1Click(Sender: TObject);
    procedure source1Click(Sender: TObject);
    procedure Enzelaufnahme1Click(Sender: TObject);
    procedure StartesequenzielleAufnahme1Click(Sender: TObject);
    procedure Stop2Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure AGElektro1Click(Sender: TObject);
  private
    { Private declarations }
    Gestartet:boolean;
    TimerStatus:integer;
    RecorderID:integer;
    Aufnahme:boolean;
    AktDateiname:string;
    IniFile:TIniFile;
    IniDateiname:String;
    IniZielPfad:string;
    IniDateiID:integer;
    IniIntervall:Integer;
    IniEinzelVideoDauer:integer;
    IniAnzahlFrames:integer;
    IniErholzeit:integer;
    IniEinzelbild:Boolean;
    IniAutoStart:boolean;
    m_handle: integer;
    procedure IniDatei(save:boolean);
    procedure EinFoto;
    procedure EinVideo;
    procedure EinVideoStop;
    procedure NextDateiname;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses UnitRecordereinstellungen;
{$I qlib.pas}
{$R *.dfm}

const TSLeerlauf=0;
        TSErholzeit=10;
        TSBildFolge=11;
        TSEinzelvideo=20;
        TSvideoFolge=30;
        TSvideoFolgePause=31;
        TSStopAnforderung=32;


procedure TForm1.FormCreate(Sender: TObject);
var n:integer;
    device: integer;
begin
  device := 0;
  m_handle := QAPIExtOpenCard(USBOPTO8LC, device);
  Gestartet:=false;
  timer1.Enabled:=false;
  //Formateinstellungen:
  DateSeparator:='-';
  TimeSeparator:='-';
  ShortDateFormat := 'dd/mm/yyyy';
  ShortTimeFormat := 'hh/nn/ss';
  //
  aufnahme:=false;
  if Paramcount>0 then begin
    val(Paramstr(1),recorderID,n)
  end;
  Form1.Caption:='Videorecorder ID: '+inttostr(RecorderID);
  //Inidatei
  IniDateiName:=ExtractFilePath(ParamStr(0))+'Rec'+inttostr(RecorderID)+'.ini'; //IniDateiName:='Rec'+inttostr(RecorderID)+'.ini'; IniDateiName:=expandfilename(IniDateiName);
  IniDatei(false);//lesen
end;


procedure TForm1.FormShow(Sender: TObject);
begin
  AnsichtUpdate1Click(self);
  CapCloseDriver;
  Video2;
  if not Gestartet then begin
    Gestartet:=true;
    if form1.IniAutoStart then StartesequenzielleAufnahme1Click(self);
  end;
end;

procedure TForm1.IniDatei(save:boolean);
const CheckConst=5;
var s:String;
        IniChkWert:Integer;
        Procedure SetWerte;
        begin
           IniDateiID :=0;
           IniIntervall:=120;
           IniEinzelVideoDauer:=3600;
           IniAnzahlFrames:=4000;
           IniEinzelbild:=true;
           IniAutoStart:=false;
           IniErholzeit:=1000;
           IniZielPfad:=ExtractFilePath(ParamStr(0));
        end;
begin
  if not save then SetWerte;
  IniFile:=tinifile.Create(IniDateiname);
  try
      s:='Aktuell'; //[Sektion]
      if save then begin // Schreiben
      end else begin // Lesen
        IniDateiID:=iniFile.ReadInteger(s,'NextDateiID',IniDateiID);
      end;
      s:='Recorder'; //[Sektion]
      if save then begin // Schreiben
        IniFile.WriteInteger(s,'Intervall',IniIntervall);
        IniFile.WriteInteger(s,'EinzelVideoDauer',IniEinzelVideoDauer);
        IniFile.WriteInteger(s,'AnzahlFrames',IniAnzahlFrames);
        IniFile.WriteBool(s,'Einzelbild',IniEinzelbild);
        IniFile.WriteBool(s,'Autostart',IniAutostart);
        IniFile.WriteInteger(s,'Erholzeit',IniErholzeit);
        Inifile.WriteString(s,'ZielPfad',IniZielPfad);
      end else begin // Lesen
        IniIntervall:=iniFile.ReadInteger(s,'Intervall',0);
        IniEinzelVideoDauer:=iniFile.ReadInteger(s,'EinzelVideoDauer',0);
        IniAnzahlFrames:=iniFile.ReadInteger(s,'AnzahlFrames',0);
        IniEinzelbild:=iniFile.ReadBool(s,'Einzelbild',false);
        IniAutostart:=iniFile.ReadBool(s,'Autostart',false);
        IniErholzeit:=iniFile.ReadInteger(s,'Erholzeit',0);
        IniZielPfad:=inifile.ReadString(s,'ZielPfad','');
      end;
      s:='Chk'; //[Sektion]
      if save then begin // Schreiben
        IniFile.WriteInteger(s,'Wert',CheckConst);
      end else begin // Lesen
        IniChkWert:=iniFile.ReadInteger(s,'Wert',0);
      end;
  finally
      Inifile.Free
  end;
  // Erkennung Lesefehler - Bei Fehler - Grundeinstellungen
  if (not save) and (IniChkWert<>CheckConst) then setwerte;
end;

procedure TForm1.AnsichtUpdate1Click(Sender: TObject);
begin
 Beenden1.Enabled:=not Aufnahme;
 einstellungen1.Enabled:= not Aufnahme;
 Stop2.Enabled:=Aufnahme;
 form1.StartesequenzielleAufnahme1.Enabled:=not Aufnahme;
 form1.Enzelaufnahme1.Enabled:=not Aufnahme;

 PanelStatus.Visible:=status1.Checked;
 if not Aufnahme then label1.Caption:='';
end;

procedure TForm1.Video2;
var
  MyCapStatusProc : TCapStatusProc;
begin
     // Start CAP - Video

     CapSetVideoArea( PanelVideo );
     CapSetInfoLabel( LabelVideo );
     MyCapStatusProc := CAPStatus;
     CapSetStatusProcedure( MyCapStatusProc );

     if CapOpenDriver then
     begin
          CapSetCapSec(15 * 3);
     CapShow;
     end;
end;

procedure TForm1.CapStatus(Sender: TObject);
begin
; form1.PanelVideo.Color := clBtnFace;
  form1.PanelVideo.Refresh;
end;
procedure TForm1.Status1Click(Sender: TObject);
begin form1.AnsichtUpdate1.Click; end;

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Recorder1Click(Sender: TObject);
begin
  //Daten ans Fenster
  form2.LabeledEditPfad.Text:=inizielpfad;
  form2.CheckBoxAutostart.Checked:=iniautostart;
  form2.intervall:=IniIntervall;
  form2.frames:=IniAnzahlFrames;
  form2.einzelbilder:=IniEinzelbild;
  form2.EinzelVideoDauer:=IniEinzelVideoDauer;
  form2.erholzeit:=IniErholzeit;
  //fenster zeigen
  form2.LabelRecID.Caption:=inttostr(RecorderID);
  form2.showmodal;
  //Daten speichern
  if form2.save then begin
    IniZielPfad:=form2.LabeledEditPfad.Text;
    IniIntervall:=form2.intervall;
    IniAnzahlFrames:=form2.frames;
    IniEinzelbild:=form2.einzelbilder;
    IniAutoStart:=form2.CheckBoxAutostart.Checked;
    IniEinzelVideoDauer:=form2.EinzelVideoDauer;
    IniErholzeit:=form2.erholzeit;
    inidatei(true); // Ini speichern
  end;
end;

procedure TForm1.Hilfe1Click(Sender: TObject);
begin
  Showmessage( 'Recorder ');
end;

procedure TForm1.format1Click(Sender: TObject);
begin Capdlgvformat end;

procedure TForm1.display1Click(Sender: TObject);
begin CapdlgVDisplay end;

procedure TForm1.source1Click(Sender: TObject);
begin capdlgvsource end;

procedure TForm1.NextDateiname;
var n:integer;
begin
  AktDateiname:=inttostr(IniDateiID); n:=length(AktDateiname);
  if n<10 then repeat AktDateiname:='0'+AktDateiname;inc(n); until n=10;
  AktDateiname:=inttostr(RecorderID)+' '+AktDateiname+' '+DateToStr(Now)+' '+TimeToStr(Now);
  form1.LabelAufnahmeID.Caption:=AktDateiname;
  AktDateiname:=IniZielPfad+AktDateiname;
  if form1.IniEinzelbild then AktDateiname:=AktDateiname+'.bmp'
  else AktDateiname:=AktDateiname+'.avi';
  inc(IniDateiID);
  IniFile:=tinifile.Create(IniDateiname);
  try IniFile.WriteInteger('Aktuell','NextDateiID',IniDateiID); finally Inifile.Free end;
end;

procedure TForm1.EinFoto;
begin
  CapSetSingleImageFileName( AktDateiname );
  CapGrabSingleFrame;
  CapSetVideoLive;
end;

procedure TForm1.EinVideo;
begin
  Videocaperweiterung.NewVideoFileName(AktDateiname);
  CapSetCapSec(form1.IniAnzahlFrames);
  CapStart;
  CapSetVideoLive;
end;

procedure TForm1.EinVideoStop;
begin
  // Stoppen
  videocap.CapStop;
  // Warteschleife.. bis gestoppt

  //
  CapSetVideoLive;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  case Timerstatus of
    TSErholzeit : begin
                        timer1.Enabled:=false; // nur 1x Erholzeit
                        timerstatus:=tsLeerlauf;
                        Aufnahme:=false;
                        AnsichtUpdate1Click(self);
                      end;
    TSBildFolge : begin
                        NextDateiname;
                        EinFoto;
                      end;
    TSEinzelvideo : begin
                        timer1.Enabled:=false;
                        timerstatus:=tsErholzeit;
                        EinVideoStop;
                        //Timmerneustart f. Erholzeit
                        timer1.Interval:=IniErholzeit;
                        timer1.Enabled:=true;
                      end;
    TSvideoFolge : begin
                        timer1.Enabled:=false;
                        timerstatus:=TSvideoFolgePause;
                      end;
    TSvideoFolgePause:begin
                        timer1.Enabled:=false;
                        timerstatus:=TSvideoFolge;
                      end;
    TSStopAnforderung:begin
                      end;
  end;
end;



procedure TForm1.Enzelaufnahme1Click(Sender: TObject);
  begin
   while QAPIExtReadDI32(m_handle, 0, 0) = 0 do
    Application.ProcessMessages;
    Aufnahme:=true; AnsichtUpdate1Click(self); //aktualisiere Menüs...
    NextDateiname;
  if form1.IniEinzelbild then begin
     // nur ein Foto
     TimerStatus:=TSErholzeit;
     timer1.Interval:=IniErholzeit;
     EinFoto;
     timer1.Enabled:=true;
  end else begin
     // nur ein Video
     TimerStatus:=TSEinzelVideo;
     timer1.Interval:=form1.IniEinzelVideoDauer*1000;
     EinVideo;
     timer1.Enabled:=true;
  end;
 end;
end;
procedure TForm1.StartesequenzielleAufnahme1Click(Sender: TObject);
begin
  repeat
  Sleep(50);
  Application.ProcessMessages;
until TimerStatus<>TSvideoFolge;
  Aufnahme:=true; AnsichtUpdate1Click(self); //aktualisiere Menüs...
  if form1.IniEinzelbild then begin
     // Foto - Sequenz
     timer1.Interval:=form1.IniIntervall*1000;
     TimerStatus:=TSBildFolge;
     timer1.Enabled:=true;
  end else begin
     // Video - Folge
     TimerStatus:=TSvideoFolge;
     repeat
       label1.Caption:='Videoaufnahme';
       NextDateiname;
       EinVideo; // aufnehmen
       Timer1.Interval:=form1.IniEinzelVideoDauer*1000;
       timer1.Enabled:=true;
       repeat
         Application.ProcessMessages; //Abbruchmöglichkeit
       until TimerStatus<>TSvideoFolge;
       label1.Caption:='Videoerholpause';
       EinVideoStop; // erholphase
       Timer1.Interval:=form1.IniErholzeit;
       timer1.Enabled:=true;
       repeat
         Application.ProcessMessages; //Abbruchmöglichkeit
         label1.Caption:=inttostr(timer1.interval)+'x'+inttostr(Timerstatus);
       until TimerStatus<>TSvideoFolgePause;
     until TimerStatus=TSStopAnforderung; // abbruch?
     Aufnahme:=false;
     AnsichtUpdate1Click(self);
     repeat
  Sleep(50);
  Application.ProcessMessages;
  label1.Caption:=inttostr(timer1.interval)+'x'+inttostr(Timerstatus);
until TimerStatus<>TSvideoFolgePause
  end;
end;

procedure TForm1.Stop2Click(Sender: TObject);
begin
  case Timerstatus of
    TSErholzeit : begin
                      end;
    TSBildFolge : begin
                        timer1.Enabled:=false;
                        Timerstatus:=TSLeerlauf;
                        Aufnahme:=false; AnsichtUpdate1Click(self); //aktualisiere Menüs...
                      end;
    TSEinzelvideo : begin
                        timer1.Enabled:=false;
                        timer1timer(self);
                      end;
    TSvideoFolge : begin
                        Timerstatus:=TSStopAnforderung;
                      end;
    TSVideoFolgePause:begin
                        Timerstatus:=TSStopAnforderung;
    end;
  end;

end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if Aufnahme then canclose:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  case Timerstatus of
    TSErholzeit : begin
                      end;
    TSBildFolge : begin
                        timer1.Enabled:=false;
                        Timerstatus:=TSLeerlauf;
                        Aufnahme:=false; AnsichtUpdate1Click(self); //aktualisiere Menüs...
                      end;
    TSEinzelvideo : begin
                        timer1.Enabled:=false;
                        timer1timer(self);
                      end;
    TSvideoFolge : begin
                        Timerstatus:=TSStopAnforderung;
                      end;
    TSVideoFolgePause:begin
                        Timerstatus:=TSStopAnforderung;
                      end;
  end;
 end;
procedure TForm1.AGElektro1Click(Sender: TObject);
begin
showmessage ('Bereitgestellt');
end;

end.
So die videoaufnahme klapt nun soweit, sogar mit abfragen des Optokopplerkarten Signales. Nur leider muss man im Menü erst einmal auf Einzelaufnahme klicken damit man dann mit dem externen taster die aufnahme auslöst. ich wollte aber das ganze nun so gestalten das es sofort auf tastendruck aufnimmt ohne das ich vorher im menü was aktiviere, nur leider weiß ich nicht wie man das anstellen soll.
  Mit Zitat antworten Zitat