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

 Delphi Discussion :

[D7] Solidariser un panel dans un RichEdit


Sujet :

Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut [D7] Solidariser un panel dans un RichEdit
    Bonjour

    Je cherche une façon la plus simple possible de placer un panel vers le bas gauche dans un RichEdit.

    Mon but est de repérer visuellement une zone bien définie en bas d'une page afin d'obtenir un repère.

    Mais sans que ce repère ne soit imprimé bien sûr.

    Au début je pensais bêtement placer un panel très fin (coloré rouge) à gauche vers le bas, mais il n'avançait pas au scroll

    Comme indiqué au début : je recherche une façon simple sans autre compo.

    Merci d'avance de toute idée,

    DS7

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 663
    Points : 6 949
    Points
    6 949
    Par défaut
    Moi, je demanderais au RichEdit d'afficher une marge à gauche.
    Après, il ne resterait plus qu'à dessiner dedans à ta convenance.

    Un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Var 
      Rct : TRect; 
      MargeGauche:integer; 
      MargeDroite:integer; 
    begin 
      MaeGauche:=20; 
      MargeDroite:=10; 
      Rct := Memo1.ClientRect; 
      Rct.Left:=Rct.Left + MargeGauche; 
      Rct.Top:=Rct.Top + 2; 
      Rct.Bottom:=Rct.Bottom - 2; 
      Rct.Right:=Rct.Right-MargeDroite; 
      SendMessage(Memo1.Handle, EM_SETRECT, 0, Longint(@Rct)); 
      Memo1.Refresh;
    Autre piste :
    https://codes-sources.commentcamarch...chedit#answers
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Lung

    Merci de ton idée, hé oui et le problème est de dessiner dedans

    Pour ton lien, j'étais passé voir et au final il manque des tas de choses, bien que la présentation se veuille fastoche.

    Avant de poser cette question, j'avais écumé pas mal de sites.

    C'est ce genre de problème, que l'on pourrait penser facile ; qui en pratique l'est bien moins.

    @ suivre

    DS7

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 663
    Points : 6 949
    Points
    6 949
    Par défaut
    Je savais bien que je l'avais déjà fait.
    J'ai retrouvé du code (je ne sais pas si j'ai tout posté) pour ajouter la marge, et dessiner dedans le numéro des lignes :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    procedure TOngletRequete.SetMargeRichEdit(const nTailleMarge: Integer);
    var
       ARect: TRect;
    begin
       ARect := RichEdit.ClientRect;
       if nTailleMarge = 0 then
          ARect.Left := ARect.Left + MARGE_DEFAUT
       else
          ARect.Left := ARect.Left + nTailleMarge;
       SendMessage(RichEdit.Handle, EM_SETRECT, 0, Longint(@ARect));
       _nTailleMarge := nTailleMarge;
       RichEdit.Refresh;
    end;
     
    procedure TOngletRequete.RichEditProc(var Msg: TMessage);
    var
       ACanvas: TCanvas;
       APoint: TPoint;
       i, nIndexCaractereLigne, nTaille: Integer;
    begin
       _OldRichEditProc(Msg);
     
       // Si affichage.
       if(Msg.Msg = WM_PAINT) and (_nTailleMarge > MARGE_DEFAUT) then
       begin
          ACanvas := TCanvas.Create;
          try
             ACanvas.Handle := GetDC(RichEdit.Handle);
     
             // Fond.
             ACanvas.Brush.Color := clBtnFace;
             ACanvas.FillRect(Rect(0, 0, _nTailleMarge - 3, RichEdit.Height));
     
             // Numérotation des lignes.
             for i:=0 to RichEdit.Lines.Count do
             begin
                nIndexCaractereLigne := SendMessage(RichEdit.Handle, EM_LINEINDEX, i, 0);
                if nIndexCaractereLigne > -1 then
                begin
                   RichEdit.Perform(EM_POSFROMCHAR, Integer(@APoint), nIndexCaractereLigne);
                   nTaille := ACanvas.TextWidth(IntToStr(i + 1));
                   if((i + 1) mod 5) = 0 then
                      ACanvas.Font.Color := clBlue
                   else
                      ACanvas.Font.Color := clDkGray;
                   ACanvas.TextOut((APoint.X - nTaille - 5), APoint.Y, IntToStr(i + 1));
                end;
             end;
          finally
             ReleaseDC(RichEdit.Handle, ACanvas.Handle);
             ACanvas.Free;
          end;
       end;
    end;
    Si ça peut te donner des idées ...
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Je pense que j'ai tous les éléments pour le faire car je l'ai déjà fait il y a 15 ans pour une université en Delphi 7 (vcl bien sur).
    Prépare moi un petit exemple de traitement RichEdit comme tu le souhaites et je pense pouvoir te le préparer ce week-end.

  6. #6
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut


    @ Lung :
    Ce we je vais voir si je suis fichu de lancer ta procédure RichEditProc(), mais faudra que je révise sérieusement les TMessage... Car en laissant quelques années tranquille Delphi au profit d'autres langages, on perd plus qu'un peu

    Mais en fait, me suffirait d'un repère aussi simple que bête : en RichEdit vers le bas gauche de page, un truc vertical ou horizontal coloré, rien de plus. C'est pour cela que j'avais pensé à un banal Tpanel.

    La simplicité est le but recherché.

    Je ne pensais pas que pareille chose soit aussi complexe.


    @ ALWEBER :
    Prépare moi un petit exemple de traitement RichEdit comme tu le souhaites et je pense pouvoir te le préparer ce week-end.
    L'exemple de traitement est hyper simple, et plus bête c'est impossible : simplement au Create de la fiche que mon RichEdit comporte vers le bas gauche un truc coloré de repère, sans aucun tralala.

    Merci à vous

    DS7

  7. #7
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Salut DS7

    Content de te revoir !

    Avant de poser cette question, j'avais écumé pas mal de sites.


    sans aucun tralala.
    Ta demande reste encore un peu vague ...

    ce fameux carré doit-il rester toujours placé après la dernière ligne ? puisque c'est "en bas de page"

    Tu vois cet exemple qui affiche toujours un carré rouge a gauche de la dernière ligne


    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    var
     OldProc:TWndMethod;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      R: TRect;
    begin
       R := RichEdit1.ClientRect;
       inc(R.Left,10); // largeur de la marge
       RichEdit1.Perform(EM_SETRECT, 0, Longint(@R));
       OldProc:=RichEdit1.WindowProc;
       RichEdit1.WindowProc:=NewWinProc;
    end;
     
    procedure TForm1.NewWinProc(var Mag: TMessage);
    var
       Hdc,Line,cPos:integer;
       R:TRect;
       Pt:TPoint;
    begin
        OldProc(Mag);
        if (Mag.Msg <> WM_PAINT)
           or(Richedit1.Perform(EM_GETRECT, 0, integer(@R)) <> 0 )then
           Exit;
        cPos  := Richedit1.Perform( EM_CHARFROMPOS, 0, integer(@R.BottomRight));
        Line := Richedit1.Perform( EM_LINEFROMCHAR, cPos, 0);
        with TCanvas.Create do
        try
           Handle:=Getdc( RichEdit1.Handle);
           Brush.Color:=clSilver;
           Brush.Style:=bsSolid;
           FillRect(Rect(0, 0,R.Left-1,R.Bottom));
           if Line < RichEdit1.Lines.Count-1 then
              Exit;
           Brush.Color:=clRed ;
           cPos := RichEdit1.Perform(EM_LINEINDEX, Line, 0);
           RichEdit1.Perform(EM_POSFROMCHAR, integer(@Pt), cPos);
           Rectangle(Rect(0,Pt.Y, Pt.X-2,Pt.Y-RichEdit1.Font.Height));
        finally
           Free;
        end;
    end;

  8. #8
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Wheel

    Whaouuuww en effet ça faisait un bail que je n'étais revenu en ce forum delphi !

    Merci pour ton aide.

    J'ai testé ton code qui fait avancer un peu le schmilblik

    En fait je souhaitais vers le bas et non au/en bas : nuance

    Je précise : c'est pour une sorte de formulaire, dont le bas est réservé en principe à l'administrateur et faut éviter de trop empiéter en cette zone bottom.
    Le début de cette zone se situe environ à 10 cm du bas. Une option sous Integer permettrait de régler en custom cela.
    Le caret doit être indépendant du repère.

    Mais en tapant ce message, je commence à prendre conscience que mon sentiment de facilité premier est inversement proportionnel à la réalité.

    La personne remplissant cette sorte de formulaire, si elle descend un peu de trop, verra cet indicateur rouge et saura...

    En tout cas, merci de ton code, même s'il ne sera peut-être pas directement utilisé pour mon souhait, il sera loin d'être perdu

    DS7 (ancien modo de ce forum)


    Edit :
    Mais après tout peut-être que... oui car si au create, lorsque le RichEdit rapplique, si je donnais x retours à la ligne en auto (= ça ferait descendre le caret), juste ensuite je le remonte, et le repère est ainsi placé, et je peux taper du texte.
    Demain ou ce we faut que je regarde ça sérieusement ; ça serait top.
    Arfff oui mais non car en tapant du texte : chaque saut à la ligne refait descendre d'une ligne ce carret.
    Faudrait pouvoir le débrayer.

  9. #9
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    Bonjour,

    en partant de l'exemple de Wheel je propose un code dans lequel
    on peut placer une marque à la ligne 15 (par Ex.)
    sans tenir compte du nombre de ligne de départ:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    unit UREMarkLineMain;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;
     
    type
      TForm13 = class(TForm)
        RichEdit1: TRichEdit;
        procedure FormCreate(Sender: TObject);
        procedure RichEdit1KeyPress(Sender: TObject; var Key: Char);
        procedure RichEdit1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        FOldProc: TWndMethod;
        FOffsetX, FOffsetY: Integer;
        FredtMaxLine: Integer;
        procedure NewWinProc(var Mag: TMessage);
        procedure ItitialiseMarge;
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form13       : TForm13;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm13.FormCreate(Sender: TObject);
    var
      R            : TRect;
    begin
      R := RichEdit1.ClientRect;
      inc(R.Left, 10); // largeur de la marge
      RichEdit1.Perform(EM_SETRECT, 0, Longint(@R));
      FOldProc := RichEdit1.WindowProc;
      RichEdit1.WindowProc := NewWinProc;
      FredtMaxLine := 15; // La marque à 15 lignes
      ItitialiseMarge;
      RichEdit1.Lines.Clear;
    end;
     
     
    procedure TForm13.NewWinProc(var Mag: TMessage);
    var
      Line, OffsetY: integer;
      R            : TRect;
      Pt           : TPoint;
    begin
      FOldProc(Mag);
      if (Mag.Msg <> WM_PAINT)
        or (Richedit1.Perform(EM_GETRECT, 0, integer(@R)) <> 0) then
        Exit;
     
        // Index de la 1ère ligne visible
      Line := Richedit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
        // récupère le décalage due au scroll
      RichEdit1.Perform(EM_POSFROMCHAR, integer(@Pt), RichEdit1.Perform(EM_LINEINDEX, Line, 0));
      with TCanvas.Create do
      try
        Handle := Getdc(RichEdit1.Handle);
        Brush.Color := clSilver;
        Brush.Style := bsSolid;
        FillRect(Rect(0, 0, R.Left - 1, R.Bottom));
        Brush.Color := clRed;
        OffsetY := FOffsetY * (Pred(FredtMaxLine) - Line) + Pt.Y;
        Rectangle(Rect(0, OffsetY, FOffsetX - 2, OffsetY - RichEdit1.Font.Height));
      finally
        Free;
      end;
    end;
     
    procedure TForm13.ItitialiseMarge;
    var
      Pt0, Pt1     : TPoint;
    begin
      // il nous faut deux lignes au moins
      while RichEdit1.Lines.Count < 2 do
        RichEdit1.Lines.Add('');
      RichEdit1.Perform(EM_POSFROMCHAR, integer(@Pt0), RichEdit1.Perform(EM_LINEINDEX, 0, 0));
      RichEdit1.Perform(EM_POSFROMCHAR, integer(@Pt1), RichEdit1.Perform(EM_LINEINDEX, 1, 0));
      FOffsetX := Pt1.X;
      FOffsetY := Pt1.Y - Pt0.Y;
    end;
     
    procedure TForm13.RichEdit1KeyPress(Sender: TObject; var Key: Char);
    begin
      // ici on limite le nombre de ligne
      if (Key = #13) and (RichEdit1.Lines.Count >= FredtMaxLine - 1) then
        Key := #0;
    end;
     
    procedure TForm13.RichEdit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (Key = 13) and (RichEdit1.Lines.Count >= FredtMaxLine - 1) then
        Key := VK_DOWN;
    end;
     
    end.
    j'ai pas tout testé, c'est du vite fait
    mais je pense que c'est une bonne base

    [EDIT] prise en compte du scroll

    Cordialement,

    @+

  10. #10
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut Un exemple
    Tu cliques sur une ligne, le shape change de position et passe au rouge si tu es dans les 10% dernières lignes

    Nom : aaa.jpg
Affichages : 204
Taille : 30,7 Ko
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    unit ex01a;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls;
     
    type
      TForm1 = class(TForm)
        RichEdit1: TRichEdit;
        Shape1: TShape;
        procedure FormActivate(Sender: TObject);
        procedure RichEdit1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
      TMemoHelper = class helper for TRichEdit
      private
        function GetLineNo: integer;
        procedure SetLineNo(NewLineNo: integer);
      public
        property LineNo: integer Read GetLineNo Write SetLineNo;
      END;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormActivate(Sender: TObject);
    var
      i1: integer;
      sl1: TStringList;
      st1: string;
    begin
      sl1 := TStringList.Create;
      for i1 := 101 to 199 do
      begin
        st1 := 'AAA' + i1.ToString + '___' + i1.ToString;
        sl1.Add(st1);
      end;
      RichEdit1.Lines.Text := sl1.Text;
      sl1.Free;
    end;
     
    procedure TForm1.RichEdit1Click(Sender: TObject);
    var p1 : TPoint ;
    begin
      p1 := Mouse.CursorPos;
      p1 := ScreenToClient(p1);
      Shape1.Top := P1.Y;
      if RichEdit1.LineNo > 90 then
        Shape1.Brush.Color := clred
      else
        Shape1.Brush.Color := cllime
    end;
     
    { TMemoHelper }
     
    function TMemoHelper.GetLineNo: integer;
    begin
      Result := Perform(EM_LINEFROMCHAR, SelStart, 0)
    end;
     
    procedure TMemoHelper.SetLineNo(NewLineNo: integer);
    begin
      if NewLineNo < 0 THEN
        NewLineNo := 0;
      if NewLineNo > Lines.Count THEN
        NewLineNo := Lines.Count;
      SelStart := Perform(EM_LINEINDEX, NewLineNo, 0);
      Perform(EM_SCROLLCARET, 0, 0);
    end;
     
    end.

  11. #11
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    Donc c'est une zone réservée au admin que les autres ne devront pas s y mettent ..

    Dans ce cas il est possible de connaitre le début de cette zone en pixel via EM_POSFROMCHAR appliqué sur la première caractère dans le Richbox ce qui permettra ensuite de calculer la distance entre les lignes actuellement visibles .. à noter que les caractères qui ne sont pas visible en haut du controle donnent des valeurs négatives !

    Ce code affiche en rouge la mage a gauche a partir de position 500 px donc vous pouvez le modifier selon ton besoin,

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    var
     OldProc:TWndMethod;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      R: TRect;
    begin
       R := RichEdit1.ClientRect;
       inc(R.Left,10); // largeur de la marge
       RichEdit1.Perform(EM_SETRECT, 0, Longint(@R));
       OldProc:=RichEdit1.WindowProc;
       RichEdit1.WindowProc:=NewWinProc;
    end;
     
    procedure TForm1.NewWinProc(var Mag: TMessage);
    var
       Line,cPos,First,Last,TopPos:integer;
       R:TRect;
       Pt:TPoint;
    begin
        OldProc(Mag);
        if (Mag.Msg <> WM_PAINT)
           or(Richedit1.Perform(EM_GETRECT, 0, integer(@R)) <> 0 )then
           Exit;
        cPos  := Richedit1.Perform( EM_CHARFROMPOS, 0, integer(@R.BottomRight));
        First := Richedit1.Perform( EM_GETFIRSTVISIBLELINE, 0, 0);// première ligne visible
        Last  := Richedit1.Perform( EM_LINEFROMCHAR, cPos, 0);// dernière ligne visible
        with TCanvas.Create do
        try
           Handle:=GetDc( RichEdit1.Handle);
           Brush.Color:=clSilver;
           Brush.Style:=bsSolid;
           FillRect(Rect(0, 0,R.Left-1,R.Bottom));
           if RichEdit1.Perform(EM_POSFROMCHAR, integer(@Pt), 0)=-1 then
              Exit;
           TopPos:=Pt.Y;
           for Line := First to Last do
           begin
             cPos := RichEdit1.Perform(EM_LINEINDEX, Line, 0);
             Pt.Y:=0;
             if RichEdit1.Perform(EM_POSFROMCHAR, integer(@Pt), cPos)=-1 then
               break;
            if (Pt.Y-TopPos) > 500 then
             begin
               Brush.Color:=clRed;
               Rectangle(Rect(0,Pt.Y,R.Left-2 ,R.Bottom));
               break;
             end;
           end;
        finally
           Free;
        end;
    end;

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Question bête !
    Pourquoi pas deux Mémo fusionné à l'impression ensuite ?
    Quel est le moyen d'impression ? Direct la zone client du Memo dessinée sur le Printer.Canvas ? Quick ou RaveReport ?
    De même pour le stockage, cela permettra de mieux séparer les données selon l'utilisateur
    Comment as-tu prévu d'empêcher l'utilisateur non autorisé à déborder sur la zone ?
    Comment as-tu prévu d'empêcher l'utilisateur lambda de voir le contenu saisi par l'administrateur ?

    Sinon c'est sympa, pour indiquer des erreurs dans un script, je pense reprendre ce concept pour un programme dont j'ai la charge de migrer.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Les copains

    Je n'ai pas reçu de notification pour vos messages
    (Par contre en barre d'état de mon brower, c'est le défilé de pubs mettant à genoux le petit CPU de mon Vista)

    Whaouuuuuuuuuuuu, comme c'est gentil !!!

    Demain faut que je regarde tout ça tranquillement et sérieusement, et vous répondre.

    Mais dites-moi, je crois que ce sera encore mieux que l'idéal visé

    Je vais faire de beaux rêves ; je viens de voir passer le marchand de sable

    @ demain et merci !!!

    DS7

  14. #14
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 483
    Points : 2 734
    Points
    2 734
    Billets dans le blog
    10
    Par défaut Un exemple (suite)
    En complément de mon précédent post voici l'exemple complet en pièce jointe. Bonne lecture.
    Voir dans cet exemple l'utilisation d'un "Class Helper"
    Fichiers attachés Fichiers attachés

  15. #15
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    @ALWEBER

    je crois que Droïde Système7 à fait sa demande pour D7
    et les "Class Helper" sont dispo que depuis D2009
    Mais ce n'est rien d'insurmontable

    Cordialement,

    @+

  16. #16
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    En complément de mon précédent post voici l'exemple complet en pièce jointe. Bonne lecture.
    Voir dans cet exemple l'utilisation d'un "Class Helper"
    à Tous,

    ALWEBER,

    Alors faut que je commence par le début, mais je suis comme un jeune chien fou auquel on donne une jolie petite baballe rouge en mousse

    Oui en effet, comme indiqué par un camarade d'un autre grand forum (concurrent) malheureusement complètement bousillé par la pub : sous mon Delphi 7 ça grogne quelque peu.

    Voici mon adaptation et les commentaires explicatifs en code :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, ExtCtrls, JvExStdCtrls, JvRichEdit;
    
    type
      TForm1 = class(TForm)
        RichEdit2: TRichEdit;
        Shape1: TShape;
        RichEdit1: TJvRichEdit;
        procedure FormActivate(Sender: TObject);
        procedure RichEdit1Click(Sender: TObject);
        procedure RichEdit1DblClick(Sender: TObject);
      private
    
     
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    
    procedure TForm1.FormActivate(Sender: TObject);
    var
      i1: integer;
      sl1: TStringList;
      st1: string;
    begin
      sl1 := TStringList.Create;
      for i1 := 101 to 199 do
      begin
       // st1 := 'AAA' + i1.ToString + '___' + i1.ToString; // <--- ligne qui ne passe pas !   
        sl1.Add(st1);
      end;
      RichEdit1.Lines.Text := sl1.Text;
      sl1.Free;
    end;
    
    
    procedure TForm1.RichEdit1Click(Sender: TObject);
    var p1 : TPoint ;
    begin
      p1 := Mouse.CursorPos;
      p1 := ScreenToClient(p1);
      Shape1.Top := P1.Y;
      if RichEdit1.LineNo > 90 then // <--- sous mon D7 sniffff passe pas !
        Shape1.Brush.Color := clred
      else
        Shape1.Brush.Color := cllime
    end;
    
    
    
    function TMemoHelper.GetLineNo: integer;
    begin
      Result := Perform(EM_LINEFROMCHAR, SelStart, 0)
    end;
    
    
    procedure TMemoHelper.SetLineNo(NewLineNo: integer);
    begin
      if NewLineNo < 0 THEN
        NewLineNo := 0;
      if NewLineNo > Lines.Count THEN
        NewLineNo := Lines.Count;
      SelStart := Perform(EM_LINEINDEX, NewLineNo, 0);
      Perform(EM_SCROLLCARET, 0, 0);
    end;
    
    
    // Puisque pas de .Click sur le RichEdit standard, j'ai
    // rusé provisoirement pour au moins voir ce que ça donne via son DblClick...
    procedure TForm1.RichEdit1DblClick(Sender: TObject);
    begin
      RichEdit1Click(Sender);
    end;
    
    
    
    
    END.
    Petit à petit je vais éplucher toutes les versions de tous les intervenants, ainsi que donner des précisions suivant souhait de ShaiLeTroll, merci,

    DS7

  17. #17
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    re,

    alors pour ce problème de "class Helper" sous D7
    pour ce cas précis on peut contourner le problème comme ceci:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, ExtCtrls, JvExStdCtrls, JvRichEdit;
     
    type
       // a placer avant la déclaration de TForm1 !!!!!!
      TRichEdit = class(ComCtrls.TRichEdit)
      private
        function GetLineNo: integer;
        procedure SetLineNo(NewLineNo: integer);
      public
        property LineNo: integer Read GetLineNo Write SetLineNo;
      end;
     
     
      TForm1 = class(TForm)
        RichEdit1: TRichEdit;
      ...
      public
        { Déclarations publiques }
      end;
     
    var
      Form1       : TForm1;
     
    implementation
     
    {$R *.dfm}
     
     
    { TRichEdit }
     
    function TRichEdit.GetLineNo: integer;
    begin
      Result := Perform(EM_LINEFROMCHAR, SelStart, 0)
    end;
     
    procedure TRichEdit.SetLineNo(NewLineNo: integer);
    begin
      if NewLineNo < 0 THEN
        NewLineNo := 0;
      if NewLineNo > Lines.Count THEN
        NewLineNo := Lines.Count;
      SelStart := Perform(EM_LINEINDEX, NewLineNo, 0);
      Perform(EM_SCROLLCARET, 0, 0);
    end;
     
    ...
     
    end.
    et voilà

    Cordialement,

    @+

  18. #18
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Cirec

    .../... et voilà, et voilà ; vite dit

    Les deux lignes rouges bloquantes 52 et 67 ne sont aucunement réparés.

    Voici grâce à toi, la mise à jour :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls, ExtCtrls, JvExStdCtrls, JvRichEdit;
    
    type
       // a placer avant la déclaration de TForm1 !!!!!!
      TRichEdit = class(ComCtrls.TRichEdit)
      private
        function GetLineNo: integer;
        procedure SetLineNo(NewLineNo: integer);
      public
        property LineNo: integer Read GetLineNo Write SetLineNo;
      end;
    
    
      TForm1 = class(TForm)
        RichEdit2: TRichEdit;
        Shape1: TShape;
        RichEdit1: TJvRichEdit;
        procedure FormActivate(Sender: TObject);
        procedure RichEdit1Click(Sender: TObject);
        procedure RichEdit1DblClick(Sender: TObject);
      private
    
     
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    
    procedure TForm1.FormActivate(Sender: TObject);
    var
      i1: integer;
      sl1: TStringList;
      st1: string;
    begin
      sl1 := TStringList.Create;
      for i1 := 101 to 199 do
    
      begin
        st1 := 'AAA' + i1.ToString + '___' + i1.ToString;  // <--- Passe pas !
        sl1.Add(st1);
      end;
    
      RichEdit1.Lines.Text := sl1.Text;
      sl1.Free;
    end;
    
    
    procedure TRichEdit.RichEdit1Click(Sender: TObject);
    var p1 : TPoint ;
    begin
      p1 := Mouse.CursorPos;
      p1 := ScreenToClient(p1);
      Shape1.Top := P1.Y;
      if RichEdit1.LineNo > 90 then // <--- sous mon D7 sniffff passe pas !
        Shape1.Brush.Color := clred
      else
        Shape1.Brush.Color := cllime
    end;
    
    
    
    function TRichEdit.GetLineNo: integer;
    begin
      Result := Perform(EM_LINEFROMCHAR, SelStart, 0)
    end;
    
    
    
    procedure TRichEdit.SetLineNo(NewLineNo: integer);
    begin
      if NewLineNo < 0 THEN
        NewLineNo := 0;
      if NewLineNo > Lines.Count THEN
        NewLineNo := Lines.Count;
      SelStart := Perform(EM_LINEINDEX, NewLineNo, 0);
      Perform(EM_SCROLLCARET, 0, 0);
    end;
    
    
    
    // Puisque pas de .Click sur le RichEdit standard, j'ai
    // rusé provisoire pour au moins voir ce que ça donne via son DblClick...
    procedure TRichEdit.RichEdit1DblClick(Sender: TObject);
    begin
      RichEdit1Click(Sender);
    end;
    
    
    END.

    Mais j'ai certainement loupé une marche

    Merci, tu m'apprends des choses comme à chaque fois.

    DS7

  19. #19
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 072
    Points
    1 072
    Par défaut
    oui effectivement !
    j'avais pas vu que mélangeais JvRichEdit et RichEdit

    la modif est pour le RichEdit de la VCL

    donc j'ai fait un zip avec le RichEdit de la VCL en y adaptant le code de ALWEBER
    ce qui implique l'ajout de l’évènement OnClick

    RichEdit DS7.zip

    cette fois j'ai testé avec D7 avant

    Cordialement,

    @+

  20. #20
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Re Cirec

    Bon, je vais voir ça ton zip alors.

    En attendant le code issu de Wheel que tu as adapté à ta sauce, suivant ce lien :

    https://www.developpez.net/forums/d2.../#post11707530

    C'est

    Au début je me disais : oui mais oupsss ça bloque au niveau du caret ; en effet ce ne doit pas être un obstacle rédhibitoire.

    Mais j'ai neutralisé au KeyPress et c'est top !

    Merci, ça me rappelle le bon vieux temps avec japee

    @ + DS7

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment insérer de l'unicode dans un Richedit ?
    Par DanaKil dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/03/2004, 01h43
  2. Deplacer un curseur dans un RichEdit sous visual c
    Par tweek dans le forum Windows
    Réponses: 7
    Dernier message: 14/01/2004, 01h29
  3. problème de police dans un richedit
    Par chtiot dans le forum Composants VCL
    Réponses: 4
    Dernier message: 28/10/2003, 10h48
  4. Smiley (image dans un RichEdit)
    Par Waxayaz dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/02/2003, 15h32
  5. Coloration syntaxique ASM dans un RichEdit
    Par Crick dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/12/2002, 02h53

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