2012-05-14 10 views
20

Có cách nào nhanh chóng và hiệu quả để áp dụng Phông chữ chung để sử dụng trong dự án không?Tính nhất quán của phông chữ trong suốt Dự án?

Bằng cách này, tôi có nghĩa là tôi muốn thiết lập một tên Font cụ thể mà tất cả các điều khiển trong dự án của tôi sẽ sử dụng như TButton, TEdit, TLabel, vv

Thông thường thiết lập Font cho mẫu chứ không phải là cụ thể điều khiển sẽ thay đổi tất cả các điều khiển trên Biểu mẫu đó thành Phông chữ được chỉ định. Tuy nhiên, có một vấn đề nhỏ với điều này, nếu bạn đã thay đổi Phông chữ theo cách thủ công, thì việc đặt Phông chữ theo Biểu mẫu sẽ không còn cập nhật các điều khiển đã được thay đổi trước đó theo cách thủ công nữa.

Idea 1

Tôi đã nghĩ đến việc sử dụng một Đối với loop và lặp lại qua từng thành phần trên hình thức của tôi và thiết lập Font theo cách này, chẳng hạn như:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    i: Integer; 
begin 
    with TForm(Self) do 
    begin 
    for i := 0 to ComponentCount - 1 do 
    begin 
     if Components[i] is TButton then 
     begin 
     TButton(Components[i]).Font.Name := 'MS Sans Serif'; 
     TButton(Components[i]).Font.Size := 8; 
     TButton(Components[i]).Font.Style := [fsBold]; 
     end; 

     if Components[i] is TLabel then 
     begin 
     TLabel(Components[i]).Font.Name := 'MS Sans Serif'; 
     TLabel(Components[i]).Font.Size := 8; 
     TLabel(Components[i]).Font.Style := [fsBold]; 
     end; 
    end; 
    end; 
end; 

Nhưng làm điều này có vẻ rất lộn xộn, nó cũng sẽ là một số lượng đáng kể mã cho một nhiệm vụ đơn giản.

Idea 2

Tôi biết tôi có thể tự thay đổi các phông chữ lúc thiết kế từng người một cho mỗi kiểm soát, nhưng với một số hình thức phải trải qua điều này có thể mất thời gian và thậm chí sau đó tôi có thể của bỏ lỡ một điều khiển .

Idea 3

Tương tự như ý tưởng 2, một cách khác có thể là để xem các mẫu như Text (DFM) và Tìm và Thay thế phông chữ như vậy.


Về cơ bản tôi sẽ cho thống nhất trong phạm vi ứng dụng của tôi, và có một chữ sử dụng trong suốt là những gì tôi đang tìm kiếm để đạt được.

Tôi có thiếu cái gì đó hoàn toàn hiển nhiên ở đây không, là những gì tôi đang cố gắng làm quá mức cho một nhiệm vụ như vậy?

+6

Nếu bạn thay đổi phông chữ của điều khiển theo cách thủ công, bạn cũng đặt thuộc tính 'ParentFont' thành' False'; thiết lập nó 'True' để trả về phông chữ mặc định (Parent) – kludg

+1

Lén lút, tôi đã không nhận ra tài sản này đã được thay đổi! –

+9

Trước khi tạo bất kỳ biểu mẫu nào, hãy đặt 'Application.DefaultFont.Name: = 'MS Sans Serif';' Với ParentFont được đặt thành true trong biểu mẫu của bạn như Serg chỉ ra. Để đặt phông chữ trong hộp thoại tin nhắn, hãy đặt 'Screen.MessageFont.Name'property. –

Trả lời

22

Như đã thảo luận trong các nhận xét, chìa khóa cho điều này là thuộc tính ParentFont. Thuộc tính này được định nghĩa tại các điểm khác nhau trong hệ thống phân cấp VCL. Nếu bạn đặt ParentFontTrue cho tất cả các thành phần trong chuỗi, sau đó bạn có thể thay đổi phông chữ cho toàn bộ ứng dụng đơn giản bằng cách thay đổi

Application.DefaultFont 

Theo mặc định hầu hết các thành phần thiết ParentFont để True và do đó bạn không có gì để làm. Số lẻ là TForm. Biểu mẫu mặc định hoàn toàn mới có ParentFont được đặt thành False. Điều này hơi thất vọng nhưng tôi nghi ngờ phản ánh thực tế rằng các nhà thiết kế ban đầu của VCL đã không lường trước được điều này và rằng ParentFont được ghép vào tương đối muộn trong sự phát triển của VCL.

Không có vấn đề, trong một thế giới lý tưởng, tất cả các biểu mẫu trong ứng dụng của bạn nên được bắt nguồn từ một lớp cơ sở chung mà bạn kiểm soát.Nếu vậy, bạn chỉ cần thực hiện thay đổi ở đó, đặt ParentFont thành True, đảm bảo không có cài đặt phông chữ rõ ràng nào được áp dụng cho bất kỳ thành phần nào trên biểu mẫu của bạn và bạn có màu vàng. Kiểm soát phông chữ của toàn bộ ứng dụng thông qua một thuộc tính duy nhất. Nếu bạn không có một lớp cơ sở chung cho các biểu mẫu của bạn, đây là thời điểm lý tưởng để thêm nó. Nếu bạn không muốn làm điều đó thì bạn cần phải đặt ParentFont cho mỗi biểu mẫu.

Các thuộc tính liên quan khác là Screen.MessageFontScreen.MenuFont. Những điều này cung cấp sự kiểm soát toàn cầu đối với các phông chữ được sử dụng trong các hộp thông báo và các menu. Tuy nhiên, các phiên bản gần đây của Delphi đã trao lại cho Windows quyền kiểm soát trên bức tranh của các hộp tin nhắn và các menu và vì vậy các thuộc tính này không có hiệu lực.

+0

Không có gì thực sự để thêm vào những gì bạn và những người khác đã nhận xét về đã. Nó sẽ không được tuyệt vời mặc dù nếu có một tùy chọn trong các tùy chọn dự án để thiết lập một kiểu Font và áp dụng nó cho dự án, trong cùng một cách 'Application.DefaultFont' hoạt động - nếu như tôi đã không biết này được xây dựng trong chức năng, có các thiết lập trực quan để thay đổi phông chữ trên toàn cầu sẽ làm cho nó dễ dàng hơn nhiều. Dù sao tôi chấp nhận câu trả lời của bạn bởi vì thông tin được viết tốt và +1 để làm nổi bật thông điệp và menu. –

+10

Hãy nhớ rằng các hình thức VCL không phải là "bố trí được quản lý" như Swing (java) hoặc WPF (C# /. Net) và việc thay đổi phông chữ trong thời gian chạy dẫn đến một địa ngục hoàn hảo, và làm cho giao diện người dùng của bạn trở thành một mớ hỗn độn không đọc được. Chúc may mắn. Không có cách nào thực tế để thay đổi phông chữ ứng dụng mà không xem xét kết quả bằng tay, tạo thành biểu mẫu, để dễ đọc. –

+3

@ Warren đó là một điểm tốt và tôi dự định đề cập đến nó trong câu trả lời của tôi, nhưng quên. Trong ứng dụng của tôi, tôi hiển thị phông chữ trong Tahoma 8 cho XP hoặc Segoe UI 9 cho Vista +. Điều này cần gọi đến ChangeScale để thay đổi cách bố trí biểu mẫu. Nhưng có bạn phải kiểm tra các hình thức trong cả hai biến thể. Vì vậy, miễn là bạn không nhồi nhét các nhãn của bạn cứng lên với nhau, không bao giờ có một vấn đề. ParentFont làm việc kỳ diệu trong tất cả những điều này. –

1

Nếu bạn muốn làm runtime này, giống như bạn mô tả nó trong Idea 1, bạn nên xem xét việc làm cho nó một hàm đệ quy, như thế này:

procedure SetFontProperties(Control: TControl; Name: TFontName; Size: Integer; Styles: TFontStyles); 
// Set font properties 
var 
    Index: Integer; 
    Font: TFont; 
    AnObject: TObject; 
    ChildControl: TControl; 
begin 
    // Set font properties 
    AnObject := GetObjectProp(Control, 'Font', nil); 
    if AnObject is TFont then 
    begin 
    // Set properties 
    Font := TFont(AnObject); 
    Font.Name := Name; 
    Font.Size := Size; 
    Font.Style := Styles; 
    end; 

    // Set child font properties 
    if Control is TWinControl then 
    begin 
    // Set 
    for Index := 0 to TWinControl(Control).ControlCount - 1 do 
    begin 
     // Child control 
     ChildControl := TWinControl(Control).Controls[Index]; 

     // Set font properties 
     SetFontProperties(ChildControl, Name, Size, Styles); 
    end; 
    end; 
end; 

Sau đó, bạn có thể chuyển đổi phông chữ cho tất cả các điều khiển trong một hình thức bằng cách sử dụng nó như thế này:

SetFontProperties(Self, 'Courier', 14, []); 

chức năng sau đó sẽ thiết lập các thuộc tính phông chữ của hình thức, và các thuộc tính phông chữ của tất cả các điều khiển con trên biểu mẫu, bao gồm kiểm soát lồng trong TPanels hoặc điều khiển container khác.

Tuy nhiên, tôi đồng ý với bạn rằng đó là một cách hơi lộn xộn.

+0

Nó không phải là lý tưởng mã hóa một điều như vậy, nhưng câu trả lời của bạn là hữu ích không ít :) –

+3

Thật không may không phải tất cả các thuộc tính phông chữ được đặt tên là 'Font' ... –

+0

@MarjanVenema Nó chỉ được dự định như là một minh họa. Nếu bạn có các thành phần không phải VCL triển khai các tên thuộc tính phông chữ khác, bạn sẽ phải mở rộng hàm với các tên thuộc tính đó, tất nhiên. Tuy nhiên, điểm chính trong cuộc thảo luận này là điểm được đề cập bởi Warren P trong bình luận ở trên: Thông thường nó không thể thay đổi các thuộc tính phông chữ thời gian chạy như thế này, bởi vì nó thay đổi sự sắp xếp, giới thiệu font-clipping, vv – Elling

2

Chìa khóa thực sự, như đã đề cập, là để đảm bảo rằng tất cả các biểu mẫu của bạn đều xuất phát từ biểu mẫu cơ sở ứng dụng của riêng bạn.

Sau đó, bạn có thể xem từng biểu mẫu và nút, và xem lại các thuộc tính, nơi bất kỳ thuộc tính phông chữ được sửa đổi nào sẽ được hiển thị bằng chữ in đậm và dễ dàng xác định. Hầu hết các thuộc tính đều có tùy chọn menu "Hoàn nguyên về kế thừa". Điều này về cơ bản nên hoàn tác mọi lựa chọn trước đó mà không cần phải chuyển sang phiên bản văn bản để chỉnh sửa. (Mặc dù nó có thể làm chính xác điều đó, xóa bất kỳ mục nhập văn bản nào do thiết lập phông chữ trước đó).

Tôi chắc chắn sẽ muốn sửa từng biểu mẫu một lần thay vì để nó được xác định không chính xác và thêm mã khác để sửa lỗi khi chạy. Sự thay đổi đó sẽ khiến bạn có vấn đề tồi tệ hơn nếu sau này bạn quyết định làm điều gì đó khác.

+0

Cảm ơn lời khuyên. –