2009-08-31 30 views
14

Phần mềm này được xây dựng trên Delphi 7.Delphi 7 hình thức, neo không hoạt động trong Vista

Trên máy XP của tôi, biểu mẫu sẽ thay đổi kích cỡ như tôi mong đợi. Tuy nhiên, trên hai máy Vista, tôi có các thành phần với các neo được đặt thành [akLeft, akTop, akRight, akBottom], nhưng khi tôi thay đổi kích thước biểu mẫu, các thành phần không kéo dài với biểu mẫu, để trống khoảng trống và cạnh dưới . Trên máy XP, các thành phần được kéo giãn chính xác với biểu mẫu.

Vì vậy, có vẻ như máy Vista bỏ qua thuộc tính neo. Bất kỳ ý tưởng gì gây ra điều này và làm thế nào để sửa chữa nó?

Cập nhật quan trọng (François):
Chúng tôi đã có cùng một vấn đề với D2007 ứng dụng và của chúng tôi trên tất cả các cửa sổ x64.
Câu trả lời của Andreas thực sự là sự sửa chữa. Vì vậy, nó không phải là D7 cũng không liên quan đến Vista.

+0

Theo phiên bản Windows nào được chương trình biên soạn? – Argalatyr

+0

Biên dịch XP/Delphi 7 – Robo

+1

Xem câu trả lời của Argalatyr. Nó có ý nghĩa không? – Hemant

Trả lời

12

Có thể nó liên quan đến sự cố "tràn bộ đệm hạt nhân Windows" xảy ra nếu kiểm soát của bạn có nhiều bậc cha mẹ. Và nếu bạn chạy nó trên một hệ thống 64 bit, tràn ngăn xếp hạt nhân xảy ra nhanh hơn nhiều. (Thêm về điều này ở đây: http://news.jrsoftware.org/news/toolbar2000/msg07779.html)

On CodeCentral Embarcadero là một cách giải quyết cho lỗi này (mà cũng được sao chép gần như 1: 1 vào Delphi 2009 VCL): http://cc.embarcadero.com/Item/25646

+0

Tôi có quyền ấn tượng rằng điều này chỉ áp dụng nếu bạn có quyền kiểm soát lồng nhau khoảng 20 cấp độ sâu? – Argalatyr

+0

Tùy thuộc vào số lượng cửa sổ WH_CALLWNDPROC được cài đặt trên toàn hệ thống. (Logitech ví dụ sử dụng WH_CALLWNDPROC móc, và như vậy hiện TActionManager). –

+0

Tôi vừa chạy vào tài khoản này tại cơ quan và quản lý để theo dõi sự cố này nhờ bài đăng của bạn tại đây. Cảm ơn vì thông tin và bản sửa lỗi, Andreas. Tuy nhiên, một lông trong nắp của bạn đã đáng kể. –

0

Thử chạy chương trình ở chế độ tương thích XP trên Vista. Các chương trình được biên dịch bởi Delphi 7 có thể không hỗ trợ đầy đủ chế độ gốc của Vista (không có gì ngạc nhiên ở đó).

+0

Các khách hàng sẽ muốn chạy nó trong Vista gốc hơn là chế độ tương thích, hy vọng có một số cách để có được xung quanh đó. – Robo

+0

Đã hiểu. Xin lỗi tôi không có nhiều đề nghị nữa - tôi không còn sử dụng D7 nữa và phản hồi của tôi tóm tắt sự hiểu biết của tôi về tình huống này. Tôi hy vọng bạn tìm thấy một giải pháp! – Argalatyr

+2

Nếu bạn muốn hỗ trợ Vista đầy đủ, bạn sẽ phải nâng cấp. Đó là một tính năng kể từ Delphi 2007. Trên thực tế, nếu bạn thực sự muốn ở lại hiện tại, bạn nên có Delphi 2010, xuất hiện vào tuần trước. Nó có hỗ trợ đầy đủ cho Windows 7 cũng như Vista. –

2

Có thể là do khung trong suốt được hiển thị bởi Vista. (Để cung cấp cho các cửa sổ khác nhau cùng xuất hiện trong suốt.

Hãy thử sử dụng "Align" (alClient) thay vì neo. Vì bạn đang sử dụng tất cả các neo, có ý nghĩa hơn.

+0

Điều đó sẽ không hoạt động vì điều khiển sẽ chiếm toàn bộ màn hình, bao gồm các điều khiển khác. – Robo

+1

Ví dụ: bạn có ghi nhớ bao gồm hầu hết màn hình và bạn có một số nút ở cuối biểu mẫu. Bạn nắm tay đặt một bảng và đặt thuộc tính Căn chỉnh của nó thành alBottom. Bạn đặt các điều khiển trên bảng điều khiển đó. Sau đó, bạn đặt điều khiển ghi nhớ và đặt thuộc tính căn chỉnh của nó thành alClient (điều này sẽ điền vào biểu mẫu nhưng rời khỏi bảng điều khiển phía dưới). – Hemant

+0

+1 tính năng này hoạt động (với nhận xét bổ sung của Hemant). Xem mã làm việc trong câu trả lời của tôi như là một ví dụ (tôi đã chỉnh sửa câu trả lời của Hemant, nhưng lo lắng rằng có thể là thô lỗ). – Argalatyr

2

Trước khi neo đã được giới thiệu trong Delphi 4 , chúng tôi thay đổi kích cỡ các thành phần tự động để đạt được tác dụng tương tự. Bạn có thể dễ dàng di chuyển/điều chỉnh các thành phần trong sự kiện của hình thức onresize.

Thiết sở hữu doublebuffered của hình thức để true có thể giảm hiện tượng rung, bởi đệm phương pháp paint. tôi nhớ chúng tôi sử dụng phải tự mình thực hiện chính mình!

1

Là một thay thế cho thay đổi kích thước Tôi năng động gợi ý, dựa trên gợi ý của Hemant tôi đã tát cùng một số mã làm việc (bên dưới). Chỉ cần tạo ứng dụng biểu mẫu VCL, thả trên tpanel không chạm vào bất kỳ cạnh nào của biểu mẫu (theo mặc định, Align = alNone) và thay thế Unit1 bằng mã bên dưới. Khi bạn chạy nó, bạn sẽ thấy 4 tấm màu vàng bao quanh một tấm ban đầu được thêm vào, và bảng điều khiển trung tâm sẽ thay đổi kích thước với các hình thức (như thể tất cả các neo là true).

unit Unit1; 

interface 

uses 
    Windows, Classes, Controls, Forms, ExtCtrls, Graphics; 

type 
    TPanelPos = (ppLeft, ppRight, ppTop, ppBottom); 
    TForm1 = class(TForm) 
    Panel1: TPanel; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    Panels : array[TPanelPos] of tpanel; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    PanelPos : TPanelPos; 
begin 
    for PanelPos := ppLeft to ppBottom do 
    begin 
    Panels[PanelPos] := tpanel.Create(Form1); 
    Panels[PanelPos].Parent := Form1; 
    Panels[PanelPos].Color := clYellow; 
    case PanelPos of 
    ppLeft : 
     begin 
     Panels[PanelPos].Align := alLeft; 
     Panels[PanelPos].Width := Panel1.Left - 1; 
     end; 
    ppRight : 
     begin 
     Panels[PanelPos].Align := alRight; 
     Panels[PanelPos].Width := Form1.Width - Panel1.Left - Panel1.Width; 
     end; 
    ppTop : 
     begin 
     Panels[PanelPos].Align := alTop; 
     Panels[PanelPos].Height := Panel1.Top - 1; 
     end; 
    ppBottom : 
     begin 
     Panels[PanelPos].Align := alBottom; 
     Panels[PanelPos].Height := Form1.Height - Panel1.Top - Panel1.Height; 
     end; 
    end; 
    Panel1.Align := alClient; 
    end; 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
var 
    PanelPos : TPanelPos; 
begin 
    for PanelPos := ppLeft to ppBottom do 
    Panels[PanelPos].Free; 
end; 

end. 
+1

Đoạn trích tuyệt vời (và toàn diện)! – Hemant

0

Có vẻ đây là câu hỏi khá cũ, dù sao đây là một giải pháp duy nhất cho vấn đề này trong vũ trụ: Sử dụng phong cách cũ của Windows phương pháp lập trình cỡ sử dụng API bẫy WM_SIZE và WM_SIZING, đó là một infalible và sẽ hoạt động trong mọi Windows bạn sẽ biết.Tất nhiên điều này có nghĩa là bạn phải sử dụng chủ yếu GetClientRect() để xác định witdhs và chiều cao và sau đó thay đổi kích thước điều khiển dựa trên các giá trị như vậy, chắc chắn có vẻ như đang cố gắng đốt cháy một tàu vũ trụ nhưng nó là tốt nhất.

Nếu không, bạn có thể làm điều gì đó thực tế hơn và nhanh chóng trong một thủ tục thay đổi kích thước như:

Control1.Left := Control2.Left + (buttonControl.Width div 2) - (buttonControl3.Width div 2); 
//for example widths 
Control4.Width := (Control.Width * 4) + (Control.Left * 8) + 54 ; 

tôi làm điều đó loại mã hóa và chức năng chỉ trong tất cả các phiên bản Windows không có vấn đề Mà nó sẽ được.

Bạn chỉ cần một số giá trị trên phân giải màn hình để tham khảo làm một cái gì đó như thế này:

iCXSCREEN := GetSystemMetrics(SM_CXSCREEN); 
iCYSCREEN := GetSystemMetrics(SM_CYSCREEN); 

    if ((iCXSCREEN = 1280) and (iCYSCREEN = 720)) or ((iCXSCREEN = 1280) and (iCYSCREEN = 700)) or ((iCXSCREEN = 1280) and (iCYSCREEN = 600)) then begin 

// blah blah 

end; 

Hope sẽ giúp người khác!

Chúc mừng!

Các vấn đề liên quan