IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

[2.2.4] Impossible de faire fonctionner winapi.inc (concerne GetSystemMetrics)


Sujet :

Lazarus Pascal

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut [2.2.4] Impossible de faire fonctionner winapi.inc (concerne GetSystemMetrics)
    Bonsoir,

    soit ces 5 misérables lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      h, w: Integer;
    begin
      h := GetSystemMetrics(SM_CYHSCROLL); // scrollbar height
      w := GetSystemMetrics(SM_CXVSCROLL); // scrollbar width
    trouvées là avec le commentaire suivant :
    Citation Envoyé par site internet
    should work for Windows, MacOS, Linux/GTK, QT
    et bien sûr chez moi ça part en SIGSEGV, le pire étant que la souris sur GetSystemMetrics fait surgir une infobulle où l'on peut lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function GetSystemMetrics(nIndex: Integer): Integer;
    /usr/share/lazarus/2.2.4/lcl/include/winapih.inc(149,10)
     unit LCLIntf
    Description
    Retrieves various system metrics.
    Package
    LCLBase
    Le souci c'est qu'en pas-à-pas je me retrouve dans winapih.inc ligne 495 et là, la souris sur WidgetSet.GetSystemMetrics m'affiche une infobulle disant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WidgetSet.GetSystemMetrics = Type TWIDGETSET has no component named GETSYSTEMMETRICS.
    public function TWidgetSet. GetSystemMetrics(nIndex: Integer): Integer;
    /usr/share/lazarus/2.2.4/lcl/include/winapih.inc(149,10)
     unit InterfaceBase
    Description
    Retrieves various system metrics.
    All dimensions are measured in pixels. 
    etc.
    J'adore tellement la 1re ligne que je vous la remets : WidgetSet.GetSystemMetrics = Type TWIDGETSET has no component named GETSYSTEMMETRICS. en prenant en compte le fait que si je tape quelque part WidgetSet.GetSys je vois bien la complétion me proposer GetSystemMetrics.

    Et bien sûr, face à tout ça, qu'est-ce que vous voulez que je fasse ? J'ai retourné tout internet, et ça ne sert à rien, les vieux posts disent que ça fonctionne, y aurait-il une blague dans la 2.2.4 ?

    Merci pour vos retours,
    MP to BB84000 : ça concerne le projet livespec des exemples Delphi de Bass.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Oublie Winapi.

    À la page que tu indiques, il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uses
      LCLIntf, LCLType;
    Alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    var
      h, w: Integer;
    begin
      h := GetSystemMetrics(SM_CYHSCROLL); // scrollbar height
      w := GetSystemMetrics(SM_CXVSCROLL); // scrollbar width
      ShowMessage('Hauteur: '+IntToStr(h)+' - Largeur: '+IntToStr(w));
    end;
    Ça fonctionne sous Windows, je vais vérifier sous Linux et je reviens.
    ....
    C'est bon sous Linux aussi.

    J'ai jeté un œil sur l'exemple Bass Delphi dont tu parles. C'est du windows tout cru traduit du C++, et il y a du boulot pour porter ça sur Lazarus. Mais bon, j'imagine que ce qui t'intéresse, c'est la partie qui analyse et dessine le spectre.

    bb84000

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par bb84000 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    uses
      LCLIntf, LCLType;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      h, w: Integer;
    begin
      h := GetSystemMetrics(SM_CYHSCROLL); // scrollbar height
      w := GetSystemMetrics(SM_CXVSCROLL); // scrollbar width
      ShowMessage('Hauteur: '+IntToStr(h)+' - Largeur: '+IntToStr(w));
    end;
    Ça fonctionne sous Windows, je vais vérifier sous Linux et je reviens.
    ....
    C'est bon sous linux aussi
    Et pourquoi chez moi ce n'est pas bon alors que j'ai les mêmes entrées dans uses et le même code ensuite ?

    Il y a quand même des mystères...
    Bah, en relisant tout bien et avec l'esprit serein, j'ai trouvé comment m'en passer...

    Citation Envoyé par bb84000 Voir le message
    j'imagine que ce qui t'intéresse, c'est la partie qui analyse et dessine le spectre.
    Tu imagines juste,

    Citation Envoyé par bb84000 Voir le message
    C'est du windows tout cru traduit du C++, et il y a du boulot pour porter ça sur Lazarus.
    Mouais, je sens que je vais laisser tomber, tant pis, on peut vivre sans.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    Et pourquoi chez moi ce n'est pas bon alors que j'ai les mêmes entrées dans uses et le même code ensuite ?
    Sais pas. Mon Linux est Ubuntu 22 sur vmware, lazarus 2.2.4 avec toutes les options par défaut. lclintf fait bien référence à winapi donc ce n'est pas à ce niveau. Comme je ne connais pas toutes les finesses des distributions Linux et de ses interfaces graphiques, je ne peux guère aller plus loin. Est-ce que tu as le problème avec juste une forme, et un bouton ?l

    Je vais regarder de plus près l'exemple livespec, et voir ce que je peux faire avec la procédure updatespectrum dès que j'ai un moment le courage.

    bb84000

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Bonjour,

    Citation Envoyé par bb84000 Voir le message
    Je vais regarder de plus près l'exemple livespec, et voir ce que je peux faire avec la procédure updatespectrum dès que j'ai un moment le courage.
    Laisse tomber, ce code est trop touffu et trop bas niveau trop Windows pour qu'on puisse y comprendre quelque chose, enfin, moi, qui ai abandonné les fenêtres depuis bientôt 10 ans.

    Par contre j'en ai une amusante à te soumettre, si ça t'intéresse, puisqu'on est dans Bass : j'ai retrouvé un exemple en Delphi qui avait fonctionné en 32 bits, le SampleVis, j'ai même des copies d'écran et crois-le si tu veux ou pas mais le copier/coller de ce code dans la machine 64 bits ne fonctionne pas : j'entends la musique mais aucune visualisation n'est affichée.

    Désespérant...

    Copie d'écran du prog tournant en 32 bits il y a 2 ans :
    Nom : program.png
Affichages : 402
Taille : 38,1 Ko
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Salut

    Peut-être qu'il faut voir du côté des appels de ton .so (dll).
    Les paramètres ont peut-être changé.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Salut anapurna
    Citation Envoyé par anapurna Voir le message
    peut-être qu'il faut voir du côté des appels de ton .so (dll)
    Merci de ta piste mais ce n'est pas là : d'abord il n'y a aucun paramètre à passer/configurer de ce côté, et ensuite je me suis amusé à mettre un test idiot mais instructif, dans la procédure de dessin, tout en bas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TSpectrum.Draw(HWND : THandle; FFTData : TFFTData; X, Y : Integer);
      ...
      BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srccopy);
      // ajout pour test :
      if not fileexists('/chemin/visbuff.bmp') then
        VisBuff.SaveToFile('/chemin/visbuff.bmp'); 
    end;
    et ce petit test m'affiche un .bmp contenant des données telles que je les espère dans la PaintBox. Plus qu'à trouver pourquoi elles n'y sont pas affichées...
    Nom : visbuffblue.jpg
Affichages : 403
Taille : 2,6 Ko
    (exporté en .jpg sinon forum pas content)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Bon, je vais faire simple : je vire cette TPaintBox récalcitrante et je la remplace par une TImage remplie comme ça,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //  BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srccopy);
      main.FormPlayer.img.Picture.Bitmap.assign(VisBuff); // + 1 !
    //  if not fileexists('/chemin/visbuff.bmp') then
      //  VisBuff.SaveToFile('/chemin/visbuff.bmp'); //ok
    end;
    et ça fonctionne au poil !

    Nom : visbuff_ok.png
Affichages : 404
Taille : 36,1 Ko

    Bye,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Samplevis étant résolu, je vais attaquer livespec. As tu trouvé ce qui cloche pour les dimensions des scrollbars ?

    bb84000

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par bb84000 Voir le message
    Samplevis étant résolu, je vais attaquer livespec. As tu trouvé ce qui cloche pour les dimensions des scrollbars ?
    Juste une supposition : dans la mesure où l'exemple que tu as donné fonctionne dans une bête "nouvelle application" et pas si je copie/colle les lignes en question dans la main boucle du .lpr de livespec, je suspecte que les choses qui coincent doivent se trouver par là mais, encore une fois, c'est un truc bien trop lié à Windows pour qu'on en vienne à bout, àmha.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 328
    Points : 4 145
    Points
    4 145
    Par défaut PaintBox vs TImage
    Bonjour Jipété,

    Citation Envoyé par Jipété Voir le message
    ...je vire cette TPaintBox récalcitrante et je la remplace par une TImage...
    Le problème est qu'une TPaintBox, contrairement à un TImage, ne stocke pas l'image. Il faut la recréer à chaque OnPaint sinon nada (sauf la première fois fugitivement).

    Salut
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Yep !
    Citation Envoyé par Guesset Voir le message
    Le problème est qu'une TPaintBox, contrairement à un TImage, ne stocke pas l'image. Il faut la recréer à chaque OnPaint sinon nada (sauf la première fois fugitivement).
    Oui, et c'est bien ce qu'est supposé faire le code, sur les events d'un Timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    OnTimer :
         begin
          BASS_ChannelGetData(Channel, @FFTData, BASS_DATA_FFT1024);
          Spectrum.Draw (PaintFrame.Canvas.Handle, FFTData, TrackX.Position - 40, TrackY.Position - 60);
          //PaintFrame.Canvas.Changed; // ligne rajoutée, retrouvée dans un vieux code et supposée être efficace
         end;
    J'ai déjà fait fonctionner BitBlt, la preuve dessus, mais ici ça ne veut rien savoir,

    Ce programme a l'air mal fichu, donc ça va être time consuming d'essayer de trouver ce qui coince, par exemple, au tout début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TFormPlayer.FormCreate(Sender: TObject);
    begin
    //BASS_Init(-1, 44100, 0, Application.Handle, nil); // windows
      BASS_Init(-1, 44100, 0, nil, nil); // Linux
     
      CircleScope := TCircleScope.Create(img.Width, img.Height);
      OcilloScope := TOcilloScope.Create(img.Width, img.Height);
    //Spectrum    := TSpectrum.Create(img.Width, img.Height); // jpt
      Spectrum    := TSpectrum.Create(img.Width-24, img.Height-14); // -4 = jpt -- sans effets ???
    end;
    Comme je l'ai noté ci-dessus, j'essaye de "contenir" l'affichage dans le TImage, mais ça ne veut pas : regardez attentivement le dernier trait en bas à droite, il en manque ! Et en jouant sur un curseur d'offset je me rends compte qu'il y en a d'autres non visibles, sur la droite -- et pareil pour la hauteur : à gauche toute on perd les peaks...
    Nom : débordements.png
Affichages : 395
Taille : 2,0 Ko

    il doit y avoir des ajustements ailleurs qu'il va me falloir chercher et trouver...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    Juste une supposition : dans la mesure où l'exemple que tu as donné fonctionne dans une bête "nouvelle application" et pas si je copie/colle les lignes en question dans la main boucle du .lpr de livespec, je suspecte que les choses qui coincent doivent se trouver par là mais, encore une fois, c'est un truc bien trop lié à Windows pour qu'on en vienne à bout, àmha.
    C'est du code d'avant, quand on créait une fenêtres et une boucle de messages à la main. Je l'ai fait, il y a bien longtemps, quand j'apprenais à coder en TurboPascal avec le bouquin de Petzold dont les exemples étaient en C.
    Ce n'est pas du tout prévu pour un autre OS que Windows. Il n'y a que la partie qui génère le spectre qui est utile.

    Donc j'ai créé une application de base sous Lazarus, avec une image à la dimension voulue dedans, un bouton, un opendialog et un timer, et une case à cocher pour le type de spectre. On n'a pas à se soucier de la taille des bordures et du reste.

    Le code d'origine se contente de prendre le son de l'entrée par défaut pour en afficher le spectre.

    A la place je charge un fichier et je le joue (çà c'est fait et ça marche) tout en calculant et affichant son spectre dans le timer (ça reste à faire). Note que les fonctions Format, Power, IntPower et log10 existent (enfin je crois), on n'a pas besoin de les réécrire.

    bb84000

  14. #14
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 328
    Points : 4 145
    Points
    4 145
    Par défaut
    Bonjour,

    Le Timer ne suffit pas, il faut que le OnPaint du PaintBox retrace tout le graphique à tout moment ne serait-ce qu'au passage du curseur souris, au déplacement ou redimensionnemt de l'application etc.

    Il faut mettre tous les ordres de tracé dans le OnPaint du PaintBox et faire en sorte que le Timer demande un RePaint/Refresh au TPaintBox pour provoquer la mise à jour.

    Le PaintBox ne garde rien. C'est très pratique par exemple pour gérer un réticule sur une image sans avoir jamais à l'effacer. C'est pourquoi dans le OnPaint le canvas d'un TImage correspond à celui d'un PaintBox virtuel alors qu'ailleurs il correspond au canvas du Picture/Bitmap.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Le Timer ne suffit pas, il faut que le OnPaint du PaintBox retrace tout le graphique à tout moment ne serait-ce qu'au passage du curseur souris, au déplacement ou redimensionnemt de l'application etc.
    -- snip --
    Mais pourquoi faudrait-il que je me prenne la tête avec toutes ces manipulations antédiluviennes quand un TImage fait tout le boulot pour moi ?
    Un truc m'échappe, là.

    Citation Envoyé par bb84000 Voir le message
    Note que les fonctions Format, Power, IntPower et log10 existent (enfin je crois), on n'a pas besoin de les réécrire.
    Exact.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 328
    Points : 4 145
    Points
    4 145
    Par défaut
    Bonjour Jipété,

    Citation Envoyé par Jipété Voir le message
    Mais pourquoi faudrait il que je me prenne la tête avec toutes ces manipulations antédiluviennes quand un TImage fait tout le boulot pour moi ?
    Un truc m'échappe, là.
    Tu fais comme tu l'entends. Mais il me semblait utile d'expliquer qu'il n'y a pas de "TPaintBox récalcitrante" mais un outil avec ses propres caractéristiques. Accessoirement, il faut plus de manipulations sur un TImage que sur un PaintBox pour afficher des données dynamiques (effacement global ou sélectif systématique, blocage/déblocage des affichages durant l'actualisation pour éviter les affichages entre-deux).

    Salut
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Accessoirement, il faut plus de manipulations sur un TImage que sur un PaintBox pour afficher des données dynamiques (effacement global ou sélectif systématique, blocage/déblocage des affichages durant l'actualisation pour éviter les affichages entre-deux).
    Pas compris ! Je me contente de remplacer 3 fois une ligne par une autre et c'est tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    procedure TFormPlayer.TimerRenderTimer(Sender: TObject);
    var FFTData: TFFTData; WaveData: TWaveData;
    begin
      if BASS_ChannelIsActive(Channel) <> BASS_ACTIVE_PLAYING then Exit;
     
      case RadioDraw.ItemIndex of
        0 :  // circle
         begin
          BASS_ChannelGetData(Channel, @WaveData, 2048);
          //CircleScope.Draw (PaintFrame.Canvas.Handle, WaveData, TrackX.Position, TrackY.Position);
          img.Picture.Bitmap.Assign(CircleScope.Draw (PaintFrame.Canvas.Handle, WaveData, TrackX.Position, TrackY.Position));
         end;
     
        1 :  // oscillo
         begin
          BASS_ChannelGetData(Channel, @WaveData, 2048);
          //OcilloScope.Draw (PaintFrame.Canvas.Handle, WaveData, TrackX.Position - 50, TrackY.Position);
          img.Picture.Bitmap.Assign(OcilloScope.Draw (PaintFrame.Canvas.Handle, WaveData, TrackX.Position - 50, TrackY.Position));
         end;
     
        2 :  // spectrum
         begin
          BASS_ChannelGetData(Channel, @FFTData, BASS_DATA_FFT1024);
          //Spectrum.Draw (PaintFrame.Canvas.Handle, FFTData, TrackX.Position - 40, TrackY.Position - 60);
          img.Picture.Bitmap.Assign(Spectrum.Draw (PaintFrame.Canvas.Handle, FFTData, TrackX.Position - 40, TrackY.Position - 60));
         end;
      end;
    end;
    Par ailleurs, les 3 lignes mises en commentaire sont celles d'origine, c'est un exemple Delphi fourni avec la librairie et il n'y a pas de procédure OnPaint dans tout l'exemple...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #18
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 328
    Points : 4 145
    Points
    4 145
    Par défaut
    Bonjour,

    Les codes qui seraient simplifiés sont là où les graphiques sont créés c'est à dire les xxx.draw().

    Le PaintBox que tu as cité a besoin de recréer le graphique à chaque demande d'affichage. Cela est habillé par le OnPaint sous Lazarus mais peut faire l'objet d'un appel direct d'une fonction via l'OS auquel on a passé le handle et la fonction à solliciter (ça c'est vraiment à l'ancienne).

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  19. #19
    Membre confirmé

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 170
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    Pas compris ! Je me contente de remplacer 3 fois une ligne par une autre et c'est tout
    Je m'y suis mis, l'autre exemple étant trop farfelu.

    Il y a plus direct, passer directement le canvas, ce qui dispense d’utiliser un handle, par exemple pour le cercle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CircleScope.Draw (PaintFrame.Canvas, WaveData, TrackX.Position, TrackY.Position);
    Puis dans l'unité circle_vis modifier la procédure draw et à la fin de celle-ci, copier directement le canvas du bitmap dans le canvas passé en constante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     procedure TCircleScope.Draw(const CNV : TCanvas; WaveData : TWaveData; X, Y : Integer);
     var
       ..... 
       vrect: TRect;  // on ajoute le rectangle
    begin   
       .....
       //BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srccopy);
       vrect:=RECT(0,0,VisBuff.Width,VisBuff.Height);
       CNV.CopyRect(vrect, VisBuff.Canvas,vrect);
    end;
    Et on fait pareil pour l'oscillo et le spectre.

    Et bien entendu, on remplace toutes les uses windows par LCLIntf, LCLType

    C'est tout pour l'instant !

    bb84000

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Salut !

    Merci de te décarcasser, j'ai testé ça fonctionne, mais je ne vois pas bien ce que ça apporte : est-ce qu'on gagne en vitesse ? Pourquoi recopier un canvas ? Ne serait-il pas plus efficace de passer un pointeur (32 bits) au lieu d'un objet complet qui, selon sa taille, risque de prendre du temps ?

    Enfin, j'dis ça j'dis rien, hein.

    Sinon, aurais-tu une idée pour faire tenir les barres du spectrum dans le dispositif d'affichage ? J'aimerais bien me séparer des curseurs d'offset et X-Y mais j'avoue ne pas trouver/pas comprendre la logique dans les calculs des procédures d'affichage...

    En fouillant dans mes vieux machins, j'ai retrouvé ces notes :
    http://www.un4seen.com/forum/?topic=...icseen#msg6693

    Make a 256 x 100 TPaintBox, and you've got a VERY simple spectrum analyzer.

    Of course, you'd have to make a couple modifications for 1024/2048 resolution,
    and scaling to have a paintbox that's not 256x100,
    and it looks better once you apply a non-linear transformation, as Ian suggests.
    But this can get you started.
    -----------------
    http://www.un4seen.com/forum/?topic=...cseen#msg39807

    No matter which FFT you request, they all describe the complete frequency spectrum.
    The maximum frequency is always the channels' SampleRate divided by 2.

    The difference between them is the resolution. (i.e. how many values describe the complete frequency spectrum.)

    An example:
    Suppose now that the channels' SampleRate is 44100
    If you request FFT 512, you get an array of 256 values.
    The first value is always the DC component, just skip this one.

    The second value is the amplitude at 1/512th of the channels' SampleRate being 1/512 * 44100 = 86 hz
    The third value is the amplitude at 2/512th of the channels' SampleRate being 2/512 * 44100 = 172 hz
    The last value is 256/512th of the channels' SampleRate being 256/512 * 44100 = 22050 hz
    PS : remplace ton /code par un /quote dans ton dernier message, à la partie me concernant, et ton post rentrera dans les clous,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

Discussions similaires

  1. [Requête] Impossible de faire fonctionner !
    Par Nesta92 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 17/04/2007, 09h38
  2. Réponses: 5
    Dernier message: 05/12/2006, 23h57
  3. impossible de faire fonctionner le gridlayout
    Par oceane751 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 12/06/2006, 10h42
  4. Réponses: 5
    Dernier message: 22/03/2006, 10h39
  5. impossible de faire fonctionner phppgadmin et pgdmin3
    Par le_ben dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 09/12/2004, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo