2013-05-11 312 views
0

我創建了一個簡單的Opendialog,EDIT1與展會消息圖像尺寸德爾福

我不知道爲什麼我的函數返回:

[DCC Error] Unit1.pas(112): E2010 Incompatible types: 'string' and 'tagSIZE' 

完整的代碼是:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls,Types, ExtDlgs; 

type 
    TForm1 = class(TForm) 
    Edit1: TEdit; 
    Button1: TButton; 
    Label1: TLabel; 
    Memo1: TMemo; 
    OpenDialog1: TOpenDialog; 
    procedure Button1Click(Sender: TObject); 

    private 
    { Private declarations } 
    public 
//  procedure GetGIFSize(const sGIFFile: string; var wWidth, wHeight: Word); 

    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 
function GetGIFSize(const FileName: string): Windows.TSize; 
type 
    // GIF header record 
    TGIFHeader = packed record 
    Sig: array[0..5] of AnsiChar;  // signature bytes 
    ScreenWidth, ScreenHeight: Word; // logical screen width and height 
    Flags: Byte;      // various flags 
    Background: Byte;     // background colour index 
    Aspect: Byte;      // pixel aspect ratio 
    end; 
    // GIF image block header record 
    TGIFImageBlock = packed record 
    Left, Top: Word;  // image top left 
    Width, Height: Word; // image dimensions 
    Flags: Byte;   // flags and local colour table size 
    end; 
const 
    cSignature: PAnsiChar = 'GIF'; // gif image signature 
    cImageSep = $2C;    // image separator byte 
var 
    FS: Classes.TFileStream;  // stream onto gif file 
    Header: TGIFHeader;   // gif header record 
    ImageBlock: TGIFImageBlock; // gif image block record 
    BytesRead: Integer;   // bytes read in a block read 
    Offset: Integer;    // file offset to seek to 
    B: Byte;      // a byte read from gif file 
    DimensionsFound: Boolean;  // flag true if gif dimensions have been read 
begin 
    Result.cx := 0; 
    Result.cy := 0; 
    if (FileName = '') or not SysUtils.FileExists(FileName) then 
    Exit; 
    FS := Classes.TFileStream.Create(
    FileName, SysUtils.fmOpenRead or SysUtils.fmShareDenyNone 
); 
    try 
    // Check signature 
    BytesRead := FS.Read(Header, SizeOf(Header)); 
    if (BytesRead <> SizeOf(TGIFHeader)) or 
     (SysUtils.StrLComp(cSignature, Header.Sig, 3) <> 0) then 
     // Invalid file format 
     Exit; 
    // Skip colour map, if there is one 
    if (Header.Flags and $80) > 0 then 
    begin 
     Offset := 3 * (1 shl ((Header.Flags and 7) + 1)); 
     if Offset >= FS.Size then 
     Exit; 
     FS.Seek(Offset, Classes.soFromBeginning); 
    end; 
    DimensionsFound := False; 
    FillChar(ImageBlock, SizeOf(TGIFImageBlock), #0); 
    // Step through blocks 
    FS.Read(B, SizeOf(B)); 
    while (FS.Position < FS.Size) and (not DimensionsFound) do 
    begin 
     if B = cImageSep then 
     begin 
     // We have an image block: read dimensions from it 
     BytesRead := FS.Read(ImageBlock, SizeOf(ImageBlock)); 
     if BytesRead <> SizeOf(TGIFImageBlock) then 
      // Invalid image block encountered 
      Exit; 
     Result.cx := ImageBlock.Width; 
     Result.cy := ImageBlock.Height; 
     DimensionsFound := True; 
     end; 
     FS.Read(B, SizeOf(B)); 
    end; 
    finally 
    FS.Free; 
    end; 
end; 


procedure TForm1.Button1Click(Sender: TObject); 
var 
    Size: Windows.TSize; 
begin 
    Size := GetGIFSize('file.gif'); 
    ShowMessage(Size); 
    end; 
end. 

我用簡單:

GetGIFSize(路徑/到/文件名);

但文件名是一個字符串,你有任何想法,爲什麼不工作?

+3

你試圖到'GetGIFSize'函數的結果分配給'string'類型的變量,而不是'Windows.TSize'。這是我們在你的問題中缺少的一段代碼。 – TLama 2013-05-11 00:10:22

+0

@TLama打我給它 – 2013-05-11 00:10:47

+1

請張貼你得到確切的**,整個編譯器錯誤**,沿加襯它與發生的事情,和** **確切您使用的是調用函數的代碼。說「我簡單地使用」還不夠好(正如@TLama指出的那樣)。 – 2013-05-11 00:11:55

回答

2

ShowMessage程序作爲其唯一的參數string類型值,但你試圖通過那裏Windows.TSize記錄。這就是爲什麼編譯器拒絕使用此類消息進行編譯的原因。此外,Windows.TSize記錄類型由2個字段組成;從cxcy其中每個是數字式的,所以只是你需要通過他們分別,你需要將它們傳遞到ShowMessage過程之前,它們的值轉換爲字符串。您可以通過多種方式進行操作,例如由:

1.使用格式化功能(優選方式)

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Size: Windows.TSize; 
begin 
    Size := GetGIFSize('c:\File.gif'); 
    ShowMessage(Format('Width: %d; Height: %d', [Size.cx, Size.cy])); 
end; 

2.字符串的手冊級聯(更糟可讀)

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Size: Windows.TSize; 
begin 
    Size := GetGIFSize('c:\File.gif'); 
    ShowMessage('Width: ' + IntToStr(Size.cx) + '; Height: ' + IntToStr(Size.cy)); 
end; 
+0

謝謝@TLama和所有的好迴應。我使用類Windows,和簡單的功能,2解決方案是好的,但如果我給一個簡單的showmessage(大小); Size:= GetGIFSize('c:\ File.gif');錯誤消息[DCC Error] Unit1.pas(113):E2010不兼容的類型:'string'和'tagSIZE'爲什麼? – Kate 2013-05-11 00:28:44

+0

等等,我的回答根據你的評論是錯誤的(更新)。你爲什麼接受它? – TLama 2013-05-11 00:37:02

+0

對不起,因爲你幫我知道問題在哪裏 – Kate 2013-05-11 00:41:27

3

的問題是你的TForm1.ButtonClick事件,與ShowMessage通話。 ShowMessage接受一個字符串參數(該消息顯示),而你傳遞一個Windows.TSize代替。

您需要將TSize記錄轉換爲字符串才能與ShowMessage一起使用。一個TSize有兩個維度 - 寬度,通過TSize.cx表示,高度,通過TSize.cy表示,因此你需要將這些尺寸轉換爲可顯示的字符串表示:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Size: Windows.TSize; 
const 
    SizeDisplayMsg = 'Size - width (cx): %d height (cy): %d'; 
begin 
    Size := GetGIFSize('file.gif'); 
    ShowMessage(Format(SizeDisplayMsg, [Size.cx, Size.cy])); 
end; 

當然,如果你想要使用TOpenFileDialog得到的文件名,你應該用它代替:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Size: Windows.TSize; 
const 
    SizeDisplayMsg = 'Size - width (cx): %d height (cy): %d'; 
begin 
    if OpenDialog1.Execute(Handle) then 
    begin 
    Size := GetGIFSize(OpenDialog1.FileName); 
    ShowMessage(Format(SizeDisplayMsg, [Size.cx, Size.cy])); 
    end; 
end;