Redimentionnement d'une fenetre et des composants ..

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 - 3 août 2004 à 10:55
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 - 3 août 2004 à 16:19
Bonjour,
J'ai cree un programme ou lorsqu'on redimentionne la fenêtre cela redimentione et recentr certains composants.
J'ai utilise l'evennement OnResize de la Form et maintenent à chaque fois que j'ouve le programme le prog plante et delphi m'ouvre la fenêtre CPU.
J'ai executé le programme Pas-a-Pas pour voir ou se trouve l'erreur et au final c'est que l'evenement OnResize se declenche en boucle et donc fait planter le programme :(
Voila un bout de code si ca peut aider :
[Code]
Begin
MediaPlayer1.top:=Form1.ClientHeight - 20;
Mediaplayer1.left:=Form1.ClientWidth / 2 + (Mediaplayer1.Width / 2);
[\Code]
Voila tout l'evenement est comme ca alors si qqn a une idee

Si tu ne te plantes pas ......
tu ne poussera jamais

7 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
3 août 2004 à 11:27
Il faut de toute manière remplacer les "/" par "div", sinon tu risque de trouver un Réel en résultat, et le compilateur ne laissera pas passer...
Il doit d'ailleurs t'en informer, non ?

Bonne prog' :-p
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 août 2004 à 11:43
Oui mais c'est que le code que j'ai poste c'est un exemple c'est a dire que j'ai pas fait copier-coller mais c'est vrai que je fais souvent cette erreur :big) š
Merci au compilateur.
Le probleme c'est que l'evenement OnResize se reproduit en boucle ( comme un repeat ou while mal controlé )

Si tu ne te plantes pas ......
tu ne poussera jamais
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 août 2004 à 11:44
Oui mais c'est que le code que j'ai poste c'est un exemple c'est a dire que j'ai pas fait copier-coller mais c'est vrai que je fais souvent cette erreur :big) š
Merci au compilateur.
Le probleme c'est que l'evenement OnResize se reproduit en boucle ( comme un repeat ou while mal controlé )

Merci d'avance

Si tu ne te plantes pas ......
tu ne poussera jamais
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
3 août 2004 à 12:17
C'est pourtant vrai que FormResize s'exécute plusieur fois après Application.Run...
Du moins s'il s'agit de positionner un MediaPlayer.
Mais dès qu'on ajoute un autre composant à dimensionner dans cet évènement, un Edit, par exemple, il ne s'exécute qu'une seule fois !
L'explication m'échappe...

Mais ça n'explique pas le plantage, à mon avis.
Une ligne (au moins ?) de code dans cet évènement doit être responsable de tes ennuis.
Il faudrait le voir, ce code, même simplifié...

Bonne prog' :-p
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 août 2004 à 12:33
Puis ce que vous insister pur le code le voici en integralité :
Procedure TForm1.FormResize(Sender: TObject);
begin
with GroupBox1 do
  begin
    Top:=Form1.ClientHeight - 16 + (GroupBox1.Height div 2);
    Left:=Form1.ClientWidth div 2 + (GroupBox1.Width div 2);
  end;
with GroupBox2 do
  begin
    Top:=Form1.ClientHeight - 16 + (GroupBox2.Height div 2);
    Left:=Form1.ClientWidth * 3 div 4 + (GroupBox2.Width div 2);
  end;
with MediaPlayer1 do
  begin
    Top:=GroupBox1.Top + GroupBox1.Height div 2  + (MediaPlayer1.Height div 2);
    Left:=Form1.ClientWidth * 1 div 4 + (MediaPlayer1.Width div 2);
  end;
with Image1 do
  begin
    Width:=Form1.ClientWidth - 16;
    Height:=Form1.ClientHeight - GroupBox1.Height - 16 - 8;
    Top:=8;
    Left:=8;
  end;
end;

voila . Et lorsque je compile cela j'obtient la fenetre CPU.
Et en mode Pas-A-Pas la procedure s'execute jusqu'a la fenetre CPU.

J'espere que cela vous aidera ( et moi aussi ) !

Si tu ne te plantes pas ......
tu ne poussera jamais
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
3 août 2004 à 14:55
Désolé, je ne vois pas ce qui cloche.

Le code est correct, sous mon Delphi 4 ça compile, sans aucun problème...

Tu es sûr que l'arrêt ne se situe pas juste avant les instructions qui précèderaient l'évènement OnResize (dans OnCreate, par exemple) ? Si c'est la ligne qui est surlignée, c'est que ça a planté avant, on est bien d'accord ?
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
3 août 2004 à 16:19
Merci d'avoir repondu
Non le probleme n'est pas dans le OnCreate
dans mon OnCreate il y a les fonctions d'extraction des ressources qui sont dans mon programme et le test pour savoir si ParamStr(1) indique le nom d'un fichier
voila mon OnCreate

procedure TForm1.FormCreate(Sender: TObject);
var
  Res : TResourceStream;
  lengthFile :integer;
begin
Res:=TResourceStream.Create(0,'CHANSON001','MP3');
Res.SaveToFile(ExtractFilePath(Application.ExeName) + 'CHANSON001.mp3');
Res.Free;
Res:=TResourceStream.Create(0,'CHANSON002','MP3');
Res.SaveToFile(ExtractFilePath(Application.ExeName) + 'CHANSON002.mp3');
Res.Free;
Res:=TResourceStream.Create(0,'CHANSON003','MP3');
Res.SaveToFile(ExtractFilePath(Application.ExeName) + 'CHANSON003.mp3');
Res.Free;
Res:=TResourceStream.Create(0,'CHANSON004','MP3');
Res.SaveToFile(ExtractFilePath(Application.ExeName) + 'CHANSON004.mp3');
Res.Free;
if FileExists(ParamStr(1)) then
  ouvrefichier(ParamStr(1),MediaPlayer1,Image1);
end;


NB: ouvrefichier est une procedure qui teste le type du fichier et l'affiche dans un TImage ou dans un TMediaplayer

Et re-voila mon OnResize

procedure TForm1.FormResize(Sender: TObject);
begin
with GroupBox1 do
  begin
    Top:=Form1.ClientHeight - 16 + (GroupBox1.Height div 2);
    Left:=Form1.ClientWidth div 2 + (GroupBox1.Width div 2);
  end;
with GroupBox2 do
  begin
    Top:=Form1.ClientHeight - 16 + (GroupBox2.Height div 2);
    Left:=Form1.ClientWidth * 3 div 4 + (GroupBox2.Width div 2);
  end;
with MediaPlayer1 do
  begin
    Top:=GroupBox1.Top + GroupBox1.Height div 2  + (MediaPlayer1.Height div 2);
    Left:=Form1.ClientWidth * 1 div 4 + (MediaPlayer1.Width div 2);
  end;
with Image1 do
  begin
    Width:=Form1.ClientWidth - 16;
    Height:=Form1.ClientHeight - GroupBox1.Height - 16 - 8;
    Top:=8;
    Left:=8;
  end;
end;


le probleme ne peut pas venir de ouvrefichier car cette procedure fonctionne tres bien sur une autre application

Je commence a desesperer %-6

Merci pour avoir pris le temps de reflechir a cette question.
Mais dis moi , puisque Delphi 6 est gratuis pourquoi utiliste tu D4 ?? :question)

Si tu ne te plantes pas ......
tu ne poussera jamais
0
Rejoignez-nous