2009-10-30 15 views
2

Comment puis-je justifier pleinement un bloc de texte (comme le fait MS Word, non seulement sur la droite et pas seulement sur la gauche, mais sur les deux côtés)? Je veux justifier certains textes (principalement du texte arabe) ajustés à une certaine taille d'écran (un écran d'appareil portatif en fait, et son visualiseur de texte n'a pas cette fonction) et enregistrer ce texte comme justifié. Je peux donc le recharger et le réutiliser ailleurs.Comment justifier pleinement les textes par programmation (Delphi)?

(Le problème avec le mot MS est que si vous copiez le texte justifié à partir de MS Word et que vous le collez dans un autre éditeur, il sera copié non-justifié).

Mise à jour: pour l'instant je pense à le faire comme ceci:

  1. get-a-mot

  2. get-mot largeur

  3. add-mot à -Total-Word et ajoutez-Word-largeur totale à mot largeur

  4. vérifier si le total-Word-width = myscreen largeur puis continuer

else if-Word largeur totale est comprise entre myscree-Wdith et (myscreen largeur -3) puis

add-espaces à mots au total jusqu'à ce qu'il = myscreen largeur

C'est ce que je pense maintenant, mais je pose cette question et j'espère voir s'il y a une meilleure solution, ou si quelqu'un d'autre l'a déjà mise en place. PS: J'espère avoir clarifié ma question et je suis désolé pour une mauvaise expression s'il y en a.

edit1: changé le titre pour le rendre plus clair.

+0

Est-ce vraiment pour Delphi? Afaik vous ne pouvez pas encore compiler une application Delphi pour un périphérique de poche –

+0

Les informations de justification de texte ne sont pas perdues lorsque du texte copié à partir de Word est collé dans un éditeur prenant en charge la justification de texte. Coller dans un éditeur de texte brut ne fonctionnera bien sûr pas. Ce que vous devez faire est d'ajouter des espaces au texte, mais maintenant vous êtes en train d'embrouiller les données et la présentation. Il n'y a pas de solution à votre problème, seulement des approximations de laideur variable. – mghie

+0

@DR: le programme lui-même fonctionne sous Windows, mais les fichiers texte produits seront utilisés dans un appareil de poche. @mghie: Je veux l'insérer dans l'éditeur de texte, car le visualiseur de texte du terminal mobile cible est destiné aux textes en clair. – avar

Répondre

3

Si vous souhaitez justifier du texte brut, vous pouvez uniquement ajouter des espaces supplémentaires aux lignes pour les aligner à gauche et à droite. Malheureusement, les largeurs de caractères diffèrent dans les polices; ce faisant, cela ne fonctionnera que pour une certaine police, sauf si vous vous limitez à des polices à espacement fixe où tous les caractères ont la même taille.

Si vous voulez un résultat comme dans Word, l'ajout d'espaces ne le coupera pas. Word n'ajoute pas d'espaces, mais étire et réduit les espaces existants. Cette information est perdue lorsque vous copiez et collez-le dans une autre application.

De toute façon, la justification est un problème d'optimisation. Si vous êtes intéressé par une bonne solution et son implémentation: jetez un oeil à un TeX. Pour une implémentation qui fonctionne en texte brut avec des polices à espacement fixe, consultez par

+0

im aller travailler uniquement avec tahome et à la taille de 10, rien d'autre. Je suis également conscient des différences de taille des caractères, donc je vérifie chaque largeur de caractères. – avar

+1

TeX montre qu'il ne s'agit pas d'un problème d'optimisation, mais qu'il peut être résolu de manière algorithmique. TeX justifie les lignes de texte en traitant tous les caractères comme des boîtes et en calculant les positions de ces boîtes en fonction de l'algorithme. En tout cas c'est un problème de présentation, donc ajouter des espaces (modifier les données) n'est pas vraiment une solution. – mghie

+0

Je n'ai pas dit qu'il ne peut pas être résolu de manière algorithmique. TeX utilise la programmation dynamique pour le faire. Mais cela n'en fait pas moins un problème d'optimisation, n'est-ce pas? Et je suis d'accord: c'est un problème de présentation. Mais les questions indiquent que la vue "n'a pas cette fonction". Donc, la seule option ici est de changer les données qui sont données au spectateur. Et: oui, ajouter des espaces est une chose laide à faire ... – f3lix

0

Le problème que vous allez rencontrer sera toujours des différences dans le rendu de la police. Word gère la justification complète en ajustant kerning ainsi qu'en ajustant le nombre de pixels entre les mots par quelques-uns (de toute façon). Le résultat final est aligné sur les deux marges. Ce réglage de pixel est fait les deux façons, et aussi uniformément que possible.

Pour gérer correctement cela dans votre appareil portable, vous devrez également effectuer le même algorithme pour l'affichage du texte là-bas.

Si cela n'est pas possible, la seule façon de vous rapprocher est d'ajouter des espaces entre les mots.

1

Il y a des appels API qui peuvent aider:

ExtTextOut et GetCharacterPlacement

Regardez le drapeau GCP_JUSTIFY pour GetCharacterPlacement

ExtTextOut est utilisé par Canvas.TextRect

0

Comme il a été souligné dans d'autres réponses Word fait une justification complète en étirant les espaces existants souvent par de très petites quantités. Ceci n'est possible que si vous avez un contrôle total sur la façon dont votre texte est dessiné sur l'écran (quel mot - ou tout autre programme Windows a).

Vous seul l'option réelle à cet égard serait d'implémenter votre propre visionneuse de texte sur la plate-forme que vous ciblez. Par exemple, vous devrez dessiner vous-même le texte à l'écran (toute plate-forme permettant les jeux devrait vous permettre de dessiner sur l'écran). Cependant, cela semble être un très gros problème pour obtenir un texte justifié.

Désolé n'a pas pu être plus utile.