2009-09-17 8 views
1

J'ai une table avec un champ RTF dedans.Comment afficher du texte enrichi dans un TDBGrid?

Comment puis-je afficher ceci dans un TDBGrid afin qu'il affiche réellement le texte enrichi, et pas seulement (FMTMEMO) dans la colonne? Je ne veux vraiment pas utiliser un composant tiers pour cela.

Merci!

Répondre

2

J'ai fait un exemple très grossier pour vous qui fonctionne, que vous pouvez ensuite essayer d'améliorer selon vos besoins.

Supprimez un contrôle TDBRichEdit sur votre formulaire et définissez sa propriété Visible sur False. Définissez les propriétés DataSource et DataField pour récupérer le champ approprié.

Dites le nom du champ qui contient le texte RTF est appelé « RTF »:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; Column: TColumn; State: TGridDrawState); 
var 
    DrawState: Integer; 
    DrawRect: TRect; 
begin 
    if (gdFocused in State) then 
    begin 
    if (Column.Field.FieldName = 'RTF') then 
    with DBRichEdit1 do 
    begin 
     Left := Rect.Left + DBGrid1.Left + 1; 
     Top := Rect.Top + DBGrid1.Top + 1; 

     Visible := True; 
    end; 
    end; 
end; 

procedure TForm1.DBGrid1ColExit(Sender: TObject); 
begin 
    if DBGrid1.SelectedField.FieldName = 'RTF' then 
    DBRichEdit1.Visible := False; 
end; 

Cela montrera le texte richedit complet, formaté dans une fenêtre pop-up lorsque vous cliquez sur la colonne dans la grille. Lorsque vous cliquez loin, il masque la fenêtre contextuelle.

2

Delphi n'a aucun composant intégré qui fait cela.

Il y a beaucoup de composants externes qui peuvent le faire. Une requête google simple list assez d'entre eux.

--jeroen

0

Si votre vouloir simplement le texte dans la colonne, la manière la plus simple serait d'ajouter un champ calculé à votre ensemble de données de type String à une longueur raisonnable (disons 80) et dans le OnCalculate événement pour l'ensemble de données tirer le texte brut du champ RTF dans le champ de chaîne. Utilisez le champ de chaîne pour l'affichage plutôt que le champ RTF. Si vous voulez tout le formatage, cela devient un peu plus compliqué car il n'y a pas de support de composant par défaut pour le rendu des données RTF autres que TRichEdit et les descendants qui sont des wrappers autour d'un contrôle Microsoft. Vous devrez faire beaucoup de l'analyse syntaxique RTF et utiliser l'événement OnDrawDataCell pour peindre le texte dans la cellule. Si vous adoptez cette approche, le RTF specifications document vous sera d'une grande aide.

5

Je ne sais pas si cela est transférable à votre situation, mais j'ai déjà utilisé OwnerDrawing pour obtenir du texte enrichi. S'il s'agit d'une option, sélectionnez DrawRtfText dans l'unité DrawRichText.

+1

Je n'ai pas utilisé ce code, mais j'ai utilisé le "contrôle d'édition riche sans fenêtre" sur lequel il est basé. J'ai fini par écrire un contrôle TRtfLabel juste comme ça, avec une fonction PaintRTF autonome, et j'étais content des résultats. C'est la solution parfaite pour les situations de tirage au sort. –

Questions connexes