Aligner une fiche par rapport à un TEDit

[Résolu]
Signaler
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
-
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
-
Bonjour,

j'ai une fiche principale avec un TEDit et je cherche à aligner une autre fiche (Une liste à de sélection de produits) au dessus juste au dessus de mon Edit.
Autrement dit quand je clique sur un bouton la liste s'affiche juste sur mon Edit quelque soit la position de la fiche principale.

Quelqu'un à une idée?

Cordialement

Codial

14 réponses

Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
alors

code un truc genre dans le de ton bouton OnClick:
var
p : tpoint;
begin
p.Y := Edit1.Top;
p.X := 0;
frmPopUp.Top :=  Edit1.ClientToScreen(p).Y + frmPopUp.Height;
frmPopUp.Show;

fait gaffe a pas mettre ta form en dehors de l'ecran ;-)

A+
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Merci pour cette réponse rapide !!!

je teste et je dis quoi

A+
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Re,
merci pour la piste c'est bon !!!

Codial
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Salut,

Bonne question, qui m'a inspiré cette procedure :

type
  TPopPos = (ppLeft, ppRight, ppUp, ppDown);

procedure FormPopUp(const PopForm: TForm; const WCntrl: TWinControl; PopPos: TPopPos = ppUp);
var
  PtPop: TPoint;
begin
  with TForm(WCntrl.Owner) do
  begin
    case PopPos of
      ppLeft:
      begin
        PtPop.x := ClientOrigin.x + WCntrl.Left - PopForm.Width;
        PtPop.y := ClientOrigin.y + WCntrl.Top;
      end;
      ppRight:
      begin
        PtPop.x := ClientOrigin.x + WCntrl.Left + WCntrl.Width;
        PtPop.y := ClientOrigin.y + WCntrl.Top;
      end;
      ppUp:
      begin
        PtPop.x := ClientOrigin.x + WCntrl.Left;
        PtPop.y := ClientOrigin.y + WCntrl.Top - PopForm.Height;
      end;
      ppDown:
      begin
        PtPop.x := ClientOrigin.x + WCntrl.Left;
        PtPop.y := ClientOrigin.y + WCntrl.Top + WCntrl.Height;
      end;
    end;
    PtPop := ScreenToClient(ClientToScreen(PtPop));
  end;
  PopForm.Left := PtPop.x;
  PopForm.Top := PtPop.y;
  PopForm.Show;
end;

Qui peut s'utiliser ainsi (avec un TButton et un TRadioGroup) :

procedure TForm1.btnShowClick(Sender: TObject);
begin
  case rgPopPos.ItemIndex of
    0: FormPopUp(Form2, Edit1, ppLeft);
    1: FormPopUp(Form2, Edit1, ppRight);
    2: FormPopUp(Form2, Edit1, ppUp);
    3: FormPopUp(Form2, Edit1, ppDown);
  end;
end;

procedure TForm1.rgPopPosClick(Sender: TObject);
begin
  btnShow.Click;
end;

Bonne prog'

japee
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Heu... c'est encore moi.

Je me rends
compte qu'on peut optimiser :

type
  TPopPos = (ppLeft, ppRight, ppUp, ppDown);

procedure
FormPopUp(const PopForm: TForm; const WCntrl: TWinControl;
  PopPos: TPopPos
= ppUp);
var
  PtPop: TPoint;
begin
  with TForm(WCntrl.Owner)
do
  begin
    PtPop.x := ClientOrigin.x + WCntrl.Left;
    PtPop.y :=
ClientOrigin.y + WCntrl.Top;
    case PopPos of
      ppLeft  : PtPop.x :=
PtPop.x - PopForm.Width;
      ppRight : PtPop.x := PtPop.x +
WCntrl.Width;
      ppUp    : PtPop.y := PtPop.y - PopForm.Height;
     
ppDown  : PtPop.y := PtPop.y + WCntrl.Height;
    end;
    PtPop :=
ScreenToClient(ClientToScreen(PtPop));
  end;
  with PopForm do
 
begin
    Left := PtPop.x;
    Top  := PtPop.y;
    Show;
 
end;
end;

Bonne prog'

japee
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

@Japee:

sympa le code....

juste un ou deux détails:

- tu fait de grande supposition sur le .Owner. Qui t'as dit que c'était la form? D'accord c'est souvent le cas, mais un petit test au moin pour quitter sans exception....
Sans compter que si le WCntrl est sur un panel, .Left serra relatif au parent du WCntrl et non a ClientOrigin de la form...

- PtPop := ScreenToClient(ClientToScreen(PtPop));
ça j'ai pas compris.... j'aurais fait ptPop := ClientToScreen(ptPop);

bon A+
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour Japee,

merci pour la procédure, je vais tester, mais comme je suppose que tu l'as déja fait ..... 
Cordialement

Codial
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Salut,

@ Loda : heureusement que tu es là pour veiller à la qualité de mes codes... Merci

@ codial : ben, suite aux remarques tout à fait pertinentes de Loda, j'ai revu ma copie, et je te conseille d'utiliser plutôt ça :

type
  TPopPos = (ppLeft, ppRight, ppUp, ppDown);

procedure FormPopUp(const PopForm: TForm; const Cntrl: TControl;
  PopPos: TPopPos = ppUp);
var
  PtPop: TPoint;
begin
  PtPop.x := Cntrl.Left;
  PtPop.y := Cntrl.Top;
  PtPop := TControl(Cntrl.Parent).ClientToScreen(PtPop);
  case PopPos of
    ppLeft  : PtPop.x := PtPop.x - PopForm.Width;
    ppRight : PtPop.x := PtPop.x + Cntrl.Width;
    ppUp    : PtPop.y := PtPop.y - PopForm.Height;
    ppDown  : PtPop.y := PtPop.y + Cntrl.Height;
  end;
  with PopForm do
  begin
    Left := PtPop.x;
    Top  := PtPop.y;
    Show;
  end;
end;

Testé, ça fonctionne même dans un TPanel.

Bonne prog'

japee
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Ca me parait être tout bon, cette fois.
J'ai testé un peu plus, ça fonctionne effectivement quel que soit le Owner du control autour duquel doit apparaître le Form : un Form, un Panel, self...
Il était donc plus judicieux de se référer au Parent.

Bonne prog', à plus...
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,

j'ai pris bonne note de la modif , et merci à vous deux pour tout !

A+

Codial
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
Bin mainteant que ta fait tout la procedure, je vais la copier dans un coin pour quand j'en aurrais besoin lol...

A+

PS: en me relisant, j'ai vu que mon pseudo code était faux. Je faissais Edit1.ClientToScreen au lieu de TControl(Edit.Parent).ClientToScreen...
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
C'est fait pour ça, Loda...

A+
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,

Bravo Japee pour ce code ... 10/10

très interressant et utile ...
encore un qui va grossir les rangs du syndrome du TJADVCTDPTDLFMO
Voir ici pour l'explication :http://www.technos-sources.com/infomsg_MAIS-OU-POSTER-CODES-ECLAIREZ-MOI-LOL_849200.aspx

En tous cas merci pour ce code je me garde sous le coude

 
@+
Cirec

<hr size="2" />
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
Salut Cirec,

Hé oui, le TJADVCTDPTDLFMO va encore frapper, mdr.
Je suis ravi que ce modeste (<strike>mais génial</strike>) <- (ça va pas, non ?) bout de code puisse t'être utile.
Merci pour ton appréciation flatteuse...

A plus.