ETEINDRE LE PC A UN MOMENT DONNÉ + CAPTURER L'IMAGE ECRAN ET WEBCAM TOUT LES X S

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 24 oct. 2006 à 11:25
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 30 oct. 2006 à 12:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/40046-eteindre-le-pc-a-un-moment-donne-capturer-l-image-ecran-et-webcam-tout-les-x-secondes

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
30 oct. 2006 à 12:38
ExitWindowsEx(EWX_POWEROFF + EWX_FORCE,0); est plus propre.
Filipe35 Messages postés 470 Date d'inscription vendredi 14 novembre 2003 Statut Membre Dernière intervention 23 octobre 2007 1
29 oct. 2006 à 23:51
La commande windows shutdown permet d'éteindre l'ordinateur dans un laps de temps donnée ;)

Exemple:
Shutdown -s -t 60
(60sec avant extinction)
Pour arreter:
Shutdown -a

++

Fil
Francky23012301 Messages postés 400 Date d'inscription samedi 6 août 2005 Statut Membre Dernière intervention 11 février 2016 1
25 oct. 2006 à 13:54
Hint est une "bulle de conseil". Pour l'utiliser il faut utiliser la propriété ShowHint qui admet deux valeurs False ou True.
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
24 oct. 2006 à 21:24
Le Tag est euh ... un integer qui se trouve dans l'inspecteur d'objet de tout composant. par defaut il est a 0.
il y a un Hint qui est une String dans tout composant (visible il me semble).
ensuite, la procedure se crée aussi dans l'inspecteur d'objet, dans l'onglet des evenements.
une fois tes 5 BitBtn selectionnés, il te suffit de taper dans le champs du OnClick "MaProcedureAMoi" et tu sera téléporté sur la page de code ^^
de la tu peux copier/coller les 2 showmessages que je t'ai montré ci dessus.
le AS veux dire en français "en tant que", mon sender en français est un en "envoyeur".
donc si je clic sur un BitBtn, il me renvoie le caption de mon envoyeur en tant que BitBtn. je sais pas si je m'exprime bien ^^
mes connaissances sont pas tiptop mais je me débrouille =)
TheBOdybOarDMaN Messages postés 54 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 24 octobre 2006
24 oct. 2006 à 21:18
on ne doit pas avoir la meme experience parce que la, j'ai rien compris mdr

enfin qu'ece que le tag? a quoi il sert? la procedure elle se cree ou ? il faut bien que je l'ecrive quelquepart enfin je vais essayer. sinon AS signifie quoi ?

merki pour tes connaissance=)
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
24 oct. 2006 à 21:09
et ouep ^^ tu peux meme jouer avec les sender en mettant une seule proc sur x compos, par exemple :
tu poses 5 BitBtn (sans les nommer, je t'autorise :D) et mets leur des captions tous différents, et aussi un Tag différent.
puis tu les selectionne a 5, tu vas dans l'inspecteur d'objet et tu vas dans le "onclick", la tu tapes "MaProcedureAMoi"
tu aura donc une procedure MaProcedureAMoiClick(Sender: TObject); qui va se créer.
de là tu mets dedans :

Showmessage( (Sender AS BitBtn).Caption );
Showmessage( StrToIntDef( (Sender AS BitBtn).Tag), 0);

surprise ;)
TheBOdybOarDMaN Messages postés 54 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 24 octobre 2006
24 oct. 2006 à 21:01
exactement pas très beeeeete:)!!!
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
24 oct. 2006 à 20:47
non elle n'est pas déclenchée mais tu mets dans l'inspecteur d'objet la meme procedure "onclick" sur les 2 checkbox =) une seule procedure pour les deux checkbox ;)
TheBOdybOarDMaN Messages postés 54 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 24 octobre 2006
24 oct. 2006 à 20:30
dis moi :

procedure TForm1.CheckBox1Click(Sender: TObject);
var
fEnable: boolean;
begin
fEnable := checkbox1.Checked or checkbox2.Checked;
Label4.Enabled := fEnable;
Label5.Enabled := fEnable;
Label6.Enabled := fEnable;
SpinEdit5.Enabled := fEnable;
SpinEdit6.Enabled := fEnable;
Button3.Enabled := fEnable;
BitBtn2.Enabled := fEnable;
end;

donc si je clique uniquement sur Checbox2 cette procedure n'est pas declenchée

bonne soirée merci, j'y travaille:)
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
24 oct. 2006 à 20:20
ok pas de soucis =)
en fait en postant un code, tu t'imagines bien qu'il est la aussi pour etre lu et certaines personnes peuvent en tirer des bouts de code pour les aider, si le code est fouili, brouillon, etc, l'aide sera de 0%.
l'exe final est justement bien sympa et l'idée (bien que deja exploitée) est bonne.
pour un premier post ici je le trouve tres bien (1000 fois mieux que 'Calculatrice delphi')
tes erreurs sont banales, rien de grave, comme tu le dis, l'exe final fontionne, mas améliorer son code et sa lecture est tres gratifiant =)
a bientot alors
TheBOdybOarDMaN Messages postés 54 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 24 octobre 2006
24 oct. 2006 à 20:06
bien tout d'abord merci =) sa fait plaisir de savoir que quelqu'un c'est intérréssé a ma source et y a posté toutes ces ''critiques'' c sympa sa fait avancer et en meme temps sa montre que je me suis un peu planté partout lol

je n'avais meme pas vu que je pouvais eteindre mon ordinateur dans 12h80 mdr c très con enfin merci =)
pour les fonction CaptureEcran et CaptureWebCam boolean en faite j'ai fait en sorte d'avoir une ligne de code sans erreur, enfin cela sert plutot etre faire qu'une seule fois le code et pouvoir l'appeler de n'importe ou, (j'aurais du metre une 'procedure'?)

et pour le shellexecute bien j'ai retrouvé sa dans une de mes source de je sais plus quoi donc copier collé et fini mdr
aussi je ne nomme jamais mes composant car une fois compilé bien cela ne sert plus a rien mais je n'avais pas pensé que pour quelqu'un qui ne connais pas la source c'est bien plus difficile

enfin bon merci c gentil je vais renvoyer la source avec le composant
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
24 oct. 2006 à 11:25
Désolé mais je n'ai pas trouvé de TCamera (camera.pas) sauf dans une source de Kenavo, mais me demandant a nouveau AviCaptura.pas, j'ai laissé tomber. Ca serait plutot sympa de donner un lien vers TON camera.pas.
Bref, j'ai ouvert le projet et supprimé tout ce qui touche a ça pour pouvoir le lancer.
Une fois en marche, il est pas mal, bien agencé, tout semble bien fonctionner.
Coté code, on trouve 39 composants non nommés :O Tu peux me dire de tête à quoi sert BitBtn2 ? Button2 ? CheckBox2 ? SpinEdit2 ? je ne pense pas, par contre si je te demande quoi sert bt_ok, bt_openDir, cb_capWebcam, se_shutIn c'est un peu plus parlant.
J'ai bien aimé "for i:=3 to 5 do
if Registry.ReadString('Check'+IntToStr(i))='1' then TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked:=True
else TCheckBox(FindComponent('CheckBox'+IntToStr(i))).Checked:=False;"
par contre, à la place de
"procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
RadioButton1.Checked:=True;
BitBtn1.Enabled:=True;
end;
"
j'aurais mis :
"procedure TForm1.SpinEdit2Change(Sender: TObject);
begin
RadioButton1.Checked:=True;
BitBtn1.Enabled:=SpinEdit2.Value>0;
end;
"
pour éviter qu'un 0 ne sois valide. (idem sur les 3 autres spinedit)
ici :
"if SpinEdit4.Value=59 then
begin
SpinEdit4.Value:=0;
SpinEdit3.Value:=SpinEdit3.Value+1;
end;
"
je n'ai donc pas le droit de faire fermer windows quand il est "59" et si je colle un "80" aucun soucis, je peux faire eteindre mon pc a 12h80 =) tu as oublié un ">" avant le "59" ^^ et pour les 2 spinedit du dessus, pourquoi ne pas faire la meme chose ? là je peux faire eteindre mon pc dans 1h90 !
A la place de
"procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked=True then
begin
Label4.Enabled:=True;
Label5.Enabled:=True;
Label6.Enabled:=True;
SpinEdit5.Enabled:=True;
SpinEdit6.Enabled:=True;
Button3.Enabled:=True;
BitBtn2.Enabled:=True;
end;

if CheckBox2.Checked=False then
if CheckBox1.Checked=False then
begin
Label4.Enabled:=False;
Label5.Enabled:=False;
Label6.Enabled:=False;
SpinEdit5.Enabled:=False;
SpinEdit6.Enabled:=False;
Button3.Enabled:=False;
BitBtn2.Enabled:=False;
end;
end;
"
j'aurais mis plus simplement :
"procedure TForm1.CheckBox1Click(Sender: TObject);
var
fEnable: boolean;
begin
fEnable := checkbox1.Checked or checkbox2.Checked;
Label4.Enabled := fEnable;
Label5.Enabled := fEnable;
Label6.Enabled := fEnable;
SpinEdit5.Enabled := fEnable;
SpinEdit6.Enabled := fEnable;
Button3.Enabled := fEnable;
BitBtn2.Enabled := fEnable;
end;"
et la procedure CheckBox2Click devient inutile.
tu mets souvent "Memo1.Lines.Add(TimeToStr(Now)+' ...');", il serait sympa de creer une procedure du genre :
"procedure AddToMemo(Phrase: string);
begin
Memo1.Lines.Add(TimeToStr(Now)+' '+Phrase);
end;
"
ce qui nous permet de changer le format/style quand on veux en modifiant par exemple :
Memo1.Lines.Add('>'+TimeToStr(Now)+' "'+Phrase+'"');
et de ce fait on a pas besoin de remplacer chaque occurence dans le code.
La j'ai pas compris :
"procedure TForm1.BitBtn2Click(Sender: TObject);
var
ValidEcran,ValidWebCam:integer;
begin
ValidEcran:=0;
ValidWebCam:=0;
...
ValidWebCam:=1;
...
ValidEcran:=1;
...
if (ValidEcran=1) or (ValidWebCam=1) then
..."
C'est un type BOOLEAN que tu avais besoin, pas d'un INTEGER !
Idem pas compris ça :
"function CaptureEcran:boolean;
begin
Inc(NbrCaptureEcran);
BitBlt(Ecran.Bitmap.Canvas.Handle,0,0,Screen.Width,Screen.Height,GetDC(GetDesktopWindow),0,0,SrcCopy);
JPEG.Assign(Ecran.Bitmap);
JPEG.CompressionQuality:=Form1.TrackBar1.Position*10;
JPEG.Compress;
JPEG.SaveToFile(DossierImageEcran+'Capture Ecran'+IntToStr(NbrCaptureEcran)+'.jpg');
end;"
tu ne te sert pas du resultat BOOLEAN renvoyé, si tu veux le renvoyer, je testerais si le fichier a bien été créé, dans ce cas, je renvois "true" sinon "false".
En meme temps j'aurais modifié cette fonction comme suis :
"function CaptureEcran(IsOk: boolean):boolean;"
afin de remplacer ça (idem pour la fonction webcam):
"procedure TForm1.Timer2Timer(Sender: TObject);
begin
if CheckBox1.Checked=True then CaptureEcran;
if CheckBox2.Checked=True then CaptureWebCam;
end;"
par ça :
"procedure TForm1.Timer2Timer(Sender: TObject);
begin
CaptureEcran(CheckBox1.Checked);
CaptureWebCam(CheckBox2.Checked);
end;"
puis modifier ça :
"function CaptureEcran:boolean;
begin
Inc(NbrCaptureEcran);
BitBlt(Ecran.Bitmap.Canvas.Handle,0,0,Screen.Width,Screen.Height,GetDC(GetDesktopWindow),0,0,SrcCopy);
JPEG.Assign(Ecran.Bitmap);
JPEG.CompressionQuality:=Form1.TrackBar1.Position*10;
JPEG.Compress;
JPEG.SaveToFile(DossierImageEcran+'Capture Ecran'+IntToStr(NbrCaptureEcran)+'.jpg');
end;"
en
"function CaptureEcran(IsOk: boolean):boolean;
begin
if IsOk then
begin
Inc(NbrCaptureEcran);
BitBlt(Ecran.Bitmap.Canvas.Handle,0,0,Screen.Width,Screen.Height,GetDC(GetDesktopWindow),0,0,SrcCopy);
JPEG.Assign(Ecran.Bitmap);
JPEG.CompressionQuality:=Form1.TrackBar1.Position*10;
JPEG.Compress;
JPEG.SaveToFile(DossierImageEcran+'Capture Ecran'+IntToStr(NbrCaptureEcran)+'.jpg');
end;
end;"
ici : "ShellExecute(0,'open',PChar(DossierImage),'run',nil,SW_NORMAL);" le 'run' est inutile oO, ouvrir un dossier par shell ne necessite pas de parametre "run" :O où as tu trouvé ça ?
Je vois 2 variables integer "NbrCaptureEcran" idem pour la cam. dans le code elles sont utilisées avec "inc()" puis un IF "if NbrCaptureEcran>-1 then" mais nulle part elles ne sont initialisées. et entre nous, le IF est plutot étrange non ? je traduis : "SI NbrCaptureEcran EST_SUPERIEUR A -1 ALORS ..." donc si j'ai 0 capture, ça s'ouvre ? dans ton code, non ça ne s'ouvre pas car elles ne sont pas initilisées. tu devrais tout de meme les initialiser dans le onCreate de la FORM par exemple avec "NbrCaptureEcran=0" et faire un IF plus logique : "if NbrCaptureEcran>0 then ..." =)

Voila j'ai fini mon paté, le code sans la fiche est vraiment incompréhensible a cause des composants non nommés, des que tu poses un composant, donne lui un nom court significatif.

Bonnes modifs a+
Rejoignez-nous