Như một quy tắc chung, tôi đã phá vỡ rất nhiều bẫy thiết kế cổ điển khi sử dụng con trỏ bằng cách tận dụng các tham số Const (không được nhập) thay vì các kiểu mã hóa cứng. Điều này mang lại cho tôi lợi ích của tốc độ khi thực hiện các chức năng đồ họa tiên tiến trong khi để lại các chi tiết kỹ thuật cho trình biên dịch. Nó cũng đã làm cho nó dễ dàng để sử dụng cùng một mã trong Delphi và Free Pascal với những thay đổi tối thiểu. Tuy nhiên, tôi đã bắt đầu đặt câu hỏi này do câu lệnh vẫy của Embarcadero về sự tiến hóa của Delphi và nó là mô hình an toàn upcomming.Liệu các tham số const và công việc định kiểu như trước dưới Delphi 64bit?
Ví dụ, concider ví dụ sau:
Type TSomeDataProc = procedure (const aInput;var aOutput) of Object;
(* Convert 8-bit pixel to 16-bit pixel *)
Procedure TMyClass.ProcessSomeData08x565(Const aInput;var aOutput);
var r,g,b: Byte;
Begin
FPalette.ExportTriplets(Byte(aInput),r,g,b);
Word(aOutput):=(R SHR 3) SHL 11 or (G SHR 2) SHL 5 or (B SHR 3);
End;
(* Convert 16-bit pixel to 24-bit pixel *)
Procedure TMyClass.ProcessSomeData565x888(Const aInput;var aOutput);
Begin
With TRGBTriple(aOutput) do
Begin
rgbtRed:=(((word(aInput) and $F800) shr 11) shl 3);
rgbtGreen:= (((word(aInput) and $07E0) shr 5) shl 2);
rgbtBlue:= ((word(aInput) and $001f) shl 3);
end;
End;
Bây giờ chúng ta có hai thủ tục với tờ khai giống nhau, nhưng họ xử lý các pixeldata rất khác nhau. Điều này cho chúng ta lợi ích của việc sử dụng một bảng tra cứu để có được phương pháp "chuyển đổi" chính xác. Điều này nên được thực hiện trong một trong hai nhà xây dựng hoặc bất cứ nơi nào bitmap hình ảnh được phân bổ như sau:
Private
FLookup: Array[pf8bit..pf32bit,pf8bit..pf32bit] of TSomeDataProc;
Procedure TMyClass.Create;
Begin
Inherited;
FLookup[pf8bit,pf16bit]:=ProcessSomeData08x565;
FLookup[pf16bit,pf24Bit]:=ProcessSomeData565x888;
end;
Bất cứ khi nào chúng ta cần phải chuyển đổi pixel chúng tôi chỉ đơn giản là tìm kiếm các phương pháp chính xác và sử dụng nó. Cú pháp vẫn giữ nguyên cho tất cả các thủ tục - vì vậy chúng tôi không phải lo lắng về "cách thức" mỗi quy trình hoạt động. Theo như lớp học của chúng tôi là có liên quan, tất cả họ đều giống nhau.
Procedure TMyClass.ConvertTo(aFormat:TpixelFormat);
Begin
// Get function for the correct pixel converter
FConvertProc:=FLookup[CurrentFormat,aFormat];
//Use the pixel converter
FConvertProc(GetSourcePixelAddr(x,y),GetTargetPixelAddr(x,y));
end;
Câu hỏi đặt ra là: loại typecasting sẽ (ví dụ: Const để Byte hoặc bất kỳ bản ghi loại được xác định) tồn tại dưới 64bit? Cá nhân tôi không thể hiểu tại sao không, nhưng Embarcadero đã mơ hồ về mô hình "an toàn" mới và sử dụng con trỏ, vì vậy tôi thấy khó có thể bảo vệ mã của mình trong tương lai.
Tôi không thể cho tôi thấy lý do tại sao bạn viết nó theo cách đó chứ không phải: 'ProcessSomeData (Const aInput) : Byte; var aOutput: Word); ' –
Bạn không chuyển con trỏ tới mã ví dụ đó, phải không? Ngoài sự tò mò, có gì sai với hệ thống kiểu tích hợp, tốc độ con trỏ là gì? –
@Sertac Tốc độ giống nhau ở đây. Có một sự khác biệt tinh tế giữa một tham số var typeless và một tham số không kiểu const và một con trỏ chung: một tham số không kiểu const không được sửa đổi, trong khi một con trỏ luôn có thể được sửa đổi. Và bằng cách sử dụng một var không cần thiết như vậy có thể tránh gõ một số^ký tự trong mã của bạn: PWord (aOutput) ^: = 13 chẳng hạn. Trình tạo được tạo ra sẽ giống như từ (aOutput): = 13. –