2017-03-06 80 views
1

我正在創建一個FMX TEdit控件後來的自定義組件。一個要求是我需要這個控件能夠像精梳領域那樣模仿/行爲。這需要最大長度和增加字符之間的間距,以便字符落在垂直線之間。例如,請參閱下圖。是否可以在Delphi FMX TEdit控件中更改字符間距?

Combed Fields Example

最大長度的功能已經是TEdit控件的一部分,但我無法找到如何增加字符間距的任何信息。我查看了Delphi的源代碼,並沒有遇到任何可能有用的東西。我遇到的字體設置是粗體/斜體的典型字體樣式以及領先/中心/尾部的字體對齊。

我也遇到TFontStretch根據TFontStyleExt,但無法找到更多關於它。德爾福自己的網站稱「Embarcadero Technologies目前沒有任何額外的信息。」我甚至不確定這與我正在尋找的東西有關,但我在這一張上從臀部開始拍攝。

如果任何人都可以指出我在正確的方向,將不勝感激。

謝謝

+0

您需要從頭開始實施。 –

+0

拉伸字體不太可能正常工作,除非您的字體已修復,否則肯定無法正常工作。相反,將每個字符視爲單獨的字符串,並將梳子中的每個框作爲單獨的矩形來繪製該字符。 – Dsm

+0

挖掘更多內容後,我認爲您是正確的@DavidHeffernan。我將不得不從頭開始。感謝您的意見。 – CKilpatrick

回答

0

我用這個來實現串行鍵式風格:

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; 

重寫你的組件Ontyping事件處理程序,這個代碼把字母之間的「空間」,這樣他們就內支取每個矩形。

請確保您的字體大小允許。

這就是結果。 enter image description here

+0

要輸入序列號,最好在VCL中使用類似MaskEdit的東西。 – SilverWarior

+0

這與我用於序列號輸入實施的代碼不同。但它是相同的原則(每五個字符之間的短劃線)。 –

+0

這看起來非常接近我所需要的,但是我需要字符之間的間距是靈活的,而不是設置爲單個空間的寬度。我想我將不得不從頭開始創建一個新組件。感謝您的意見,但非常感謝。 – CKilpatrick

0

我認爲,最好的解決辦法你是使用的Monospaced fonts

之一,如果你不能找到具有所需的字符與正確適合你的控制,你可能需要使用一個等寬ONT您可以在線查找許多字體編輯工具,以對所需字體進行必要的更改。

關於使用等寬字體的最好方法是,您可以在幾乎每個FMX控件中使用它,以便指定使用哪種字體。

請注意,您可能必須將該自定義字體與您的應用程序一起發送,然後在應用程序啓動時動態註冊並在應用程序關閉時取消註冊。

+0

不幸的是,我不認爲這會奏效。我們在應用程序中使用等寬字體以用於打印目的,所以我對它們非常熟悉。我們需要字符之間的間距是動態的,並根據精梳字段長度的寬度而變化。我想我將不得不創建一個自定義組件來完成這個任務。感謝您的意見。 – CKilpatrick

相關問題