2013-01-08 56 views
1

德爾福V7指定字體從TComboBox D7

讓我先說,我不是一個真正的程序設計師前言我的補救問題。我是副警長,我偶爾寫一個項目來幫助我們做我們所做的事情。

我目前的項目包含多個TDBRichEdit控件。我已將各種格式化過程分配給工具欄按鈕。我希望能夠使用ComboBox更改RichEdit字體。組合框將填充字體列表,但不會影響TDBRichEdit控件的字體。我一直試圖弄清楚這一個多星期,我看不出問題所在。

這是我做了什麼:

表的OnCreate程序

procedure TForm1.FormCreate(Sender: TObject); 
begin 
PageControl1.ActivePage:= TabSheet1; 
    GetFontNames; 
    SelectionChange(Self); 
    CurrText.Name := DefFontData.Name; 
    CurrText.Size := -MulDiv(DefFontData.Height, 72, Screen.PixelsPerInch); 
    end; 

選型變化

procedure TForm1.SelectionChange(Sender: TObject); 
begin 
    if ActiveControl is TDBRichEdit then 
    with ActiveControl as 
    TdbRichEdit do begin 
    try 
    Ctrlupdating := True; 

    Size.Text := IntToStr(SelAttributes.Size); 
    cmbFont.Text := SelAttributes.Name; 
finally 
    Ctrlupdating := False; 
    end; 
end; 
end; 

功能(除了「ACTIVECONTROL部分這些都是不是我的功能,我沒有足夠的知識窗臺完全理解他們。)組合框

procedure TForm1.cmbFontDrawItem(Control: TWinControl; Index: Integer; 
    Rect: TRect; State: TOwnerDrawState); 
begin 
with (Control as TComboBox).Canvas do 
    begin 
    Font.Name := Screen.Fonts.Strings[Index]; 
    FillRect(Rect) ; 
    TextOut(Rect.Left, Rect.Top, PChar(Screen.Fonts.Strings[Index])); 

    end; 
    end; 

OnChange事件對ComboBox

procedure TForm1.cmbFontChange(Sender: TObject); 
begin 
if Ctrlupdating then Exit; 
    CurrText.Name := cmbFont.Items[cmbFont.ItemIndex]; 
end; 

任何想法的

Function TForm1.CurrText: TTextAttributes; 
begin 
if ActiveControl is TDBRichEdit then 
    with ActiveControl as 
    TdbRichEdit do begin 
    if SelLength > 0 then Result := SelAttributes 
    else Result := DefAttributes; 
end; 
end; 

function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric; 
    FontType: Integer; Data: Pointer): Integer; stdcall; 
begin 
    TStrings(Data).Add(LogFont.lfFaceName); 
    Result := 1; 
end; 

OnDraw的事件?

+0

我的真正用意。我在評論說以上。你的一些舊問題有很好的答案應該被接受。 –

回答

2

在你的代碼試圖修改此代碼的文本屬性:

procedure TForm1.cmbFontChange(Sender: TObject); 
begin 
    if Ctrlupdating then Exit; 
    CurrText.Name := cmbFont.Items[cmbFont.ItemIndex]; 
end; 

當這個代碼執行,ACTIVECONTROL將cmbFont。現在看看CurrText。

if ActiveControl is TDBRichEdit then 
    with ActiveControl as TdbRichEdit do 
    begin 
    if SelLength > 0 then 
     Result := SelAttributes 
    else 
     Result := DefAttributes; 
    end; 

因此,第一個if塊將不會被輸入。

事實上,在這種情況下,您的函數似乎不會將任何內容分配給Result。您必須始終分配給結果。當您啓用警告和提示時,編譯器會告訴您這一點。

而不是使用ActiveControl,你應該直接指定豐富的編輯實例。我不知道您的表單是如何安排的,但您需要使用其他方法來確定要應用更改的富編輯控件。也許基於頁面控件的活動頁面。

0

我設法讓組合框工作。我的代碼可能非常尷尬,但它的工作原理。感謝您的幫助。沒有它,我就無法解決這個問題。

我爲每個RichEdit控件編寫了一個單獨的函數。隨着FORMCREATE我不得不爲每個功能

procedure TForm1.FormCreate(Sender: TObject); 
begin 
PageControl1.ActivePage:= TabSheet1; 
    GetFontNames; 
    SelectionChange(Self); 
    **CurrText.Name := DefFontData.Name; 
    CurrText.Size := -MulDiv(DefFontData.Height, 72, Screen.PixelsPerInch);** 
    end; 

行添加在SelectionChange我不得不做出一個調用款豐富的編輯控制的屬性。我無法做到這一點。我只提到了豐富的編輯控件「reProc」。其他人似乎在那條線上工作得很好。我想了解一個。

表單選擇變化 procedure TForm1.SelectionChange(Sender:TObject); 開始 如果ACTIVECONTROL是TDBRichEdit然後 與reProc.Paragraph也開始嘗試 開始做

你給了我的想法。我無法集體處理所有財富控制,所以我分別爲每個財富控制編寫了一個函數。

function TForm1.CurrText: TTextAttributes; 
begin 
if reProc.SelLength > 0 then Result := reProc.SelAttributes 
    else Result := **reProc.DefAttributes;** 

對於的OnChange事件對ComboBox我不得不加線爲每個功能

procedure TForm1.cmbFontChange(Sender: TObject); 
begin 
if Ctrlupdating then Exit; 
    **CurrText.Name := cmbFont.Items[cmbFont.ItemIndex];** 
end;