2017-03-06 2 views
1

Je suis en train de créer un composant personnalisé descendant d'un contrôle FMX TEdit. Une exigence est que j'ai besoin de ce contrôle pour pouvoir imiter/agir comme un champ peigné. Cela nécessite une longueur maximale et un espacement accru entre les caractères afin que les caractères tombent entre les lignes verticales. S'il vous plaît voir l'image ci-dessous par exemple.Est-il possible de modifier l'espacement inter-caractères dans un contrôle Delphi FMX TEdit?

Combed Fields Example

La fonctionnalité de longueur maximale est déjà partie du contrôle TEdit mais je suis incapable de trouver des informations sur la façon d'augmenter l'espacement entre les caractères. J'ai regardé dans le code source Delphi et n'ai pas rencontré quelque chose qui pourrait être utile. Les paramètres de police que j'ai rencontrés étaient les styles de police typiques de gras/italique et l'alignement des polices de premier plan/centre/arrière.

J'ai également rencontré TFontStretch sous TFontStyleExt mais je n'ai pas pu en apprendre beaucoup plus à ce sujet. Le site web de Delphi indique "Embarcadero Technologies n'a pas d'informations supplémentaires pour le moment". Je ne suis même pas sûr que cela soit lié à ce que je cherche, mais je tire de la hanche sur celui-ci.

Si quelqu'un peut me diriger dans la bonne direction, il serait très apprécié.

Merci

+0

Vous devrez implémenter cela à partir de zéro. –

+0

Il est peu probable que l'extension de la police fonctionne correctement et ne fonctionnera certainement pas à moins que votre police ne soit corrigée. Au lieu de traiter chaque caractère comme une chaîne distincte, et chaque boîte dans votre peigne comme un rectangle séparé pour dessiner ce caractère. – Dsm

+0

Après avoir creusé un peu plus, je pense que vous avez raison @DavidHeffernan. Je vais devoir faire cela à partir de zéro. Merci pour la contribution. – CKilpatrick

Répondre

0

J'ai utilisé ce pour mettre en œuvre un style de frappe clé de série:

procedure TForm4.Edit1Typing(Sender: TObject); 
var 
atext,tmp_str,d_str:unicodestring; 
index:integer; 
begin 
if not(edit1.Text.Length>=30)then // 30 is the max length 
    begin 
    ///////////////// take ' ' out (space between letters) 
    atext:=edit1.Text; 
    tmp_str:=''; 
    if not(edit1.Text.Length=0) then 
    begin 
    for index := 1 to Length(aText) do 
     begin 
     if not(aText[index]=' ')then 
     begin 
     tmp_str:=tmp_str+aText[index]; 
     end; 

     end; 
    end; 
    ///////////////// now put the data back to the edit with the space 
    d_str:=''; 
    if not(Length(tmp_str)=0) then 
    begin 
    for index := 1 to Length(tmp_str) do 
     begin 
     d_str:=d_str+tmp_str[index]+' '; 
     end; 
    end; 
    edit1.Text:=d_str; 
    edit1.CaretPosition:=length(d_str)-1; 
    end; 
end; 

Remplacer votre composant gestionnaire d'événements Ontyping, ce code met un « espace » entre les lettres afin qu'ils seraient tirés à l'intérieur chaque rectangle.

Assurez-vous que votre taille de police le permet.

Voici le résultat. enter image description here

+0

Pour saisir des numéros de série, il est préférable d'utiliser quelque chose comme un MaskEdit dans VCL. – SilverWarior

+0

Ce code n'est pas le même que celui utilisé pour l'implémentation de la frappe de mon numéro de série. Mais c'est le même principe (traits entre chaque cinq caractères). –

+0

Cela semble extrêmement proche de ce dont j'ai besoin, mais j'ai besoin que l'espacement entre les caractères soit flexible et ne soit pas réglé sur la largeur d'un seul espace. Je pense que je vais devoir créer un nouveau composant à partir de zéro. Merci pour la contribution cependant, c'est très apprécié. – CKilpatrick

0

Je pense que la meilleure solution pour votre serait d'utiliser l'un des Monospaced fonts

Si vous ne trouvez pas monospaced qui a souhaité en Ontario caractère avec pour ajuster correctement dans votre contrôle, vous pouvez utiliser un de nombreux outils d'édition de police que vous pouvez trouver en ligne pour apporter les modifications nécessaires à la police de votre choix.

Et la meilleure chose à propos de l'utilisation de la police Monospaced est que vous pouvez l'utiliser dans à peu près tous les contrôles FMX qui vous permet de spécifier quelle police utiliser.

Notez que vous devrez probablement expédier cette police personnalisée avec votre application, puis l'enregistrer dynamiquement au démarrage de l'application et la désinscrire à la fermeture de l'application.

+0

Malheureusement, je ne pense pas que cela fonctionnerait. Nous utilisons des fontes à espacement fixe dans nos applications à des fins d'impression, je les connais donc assez bien. Nous avons besoin que l'espacement entre les caractères soit dynamique et change en fonction de la largeur de la longueur du champ peigné. Je pense que je vais devoir créer un composant personnalisé pour y arriver. Merci pour la contribution. – CKilpatrick