Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 3177|回复: 7

同样的代码,为何delphi与Lazarus的执行效果差那么远?

[复制链接]
  • TA的每日心情

    2021-8-18 08:54
  • 签到天数: 1421 天

    [LV.10]以坛为家III

    发表于 2013-6-3 10:42:39 | 显示全部楼层 |阅读模式
    同样执行下面的代码,模拟一个石英钟,为何两者的执行效果差那么远?
    Delphi7 下:

    Lazarus 1.08下:

    下面是代码:
    unit clock;

    {$IFDEF FPC}
      {$MODE Delphi}
    {$ENDIF}

    interface

    uses
    {$IFNDEF FPC}
      Windows,
    {$ELSE}
      LCLIntf, LCLType, LMessages,
    {$ENDIF}
      Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, ComCtrls;

    type
      TForm1 = class(TForm)
        StatusBar1: TStatusBar;
        pnl1: TPanel;
        img1: TImage;
        tmr1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure tmr1Timer(Sender: TObject);
      private
        firsttime:Boolean;
        vho,vmo,vso:Real;
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    var
      i:Integer;
    begin
      with Form1.img1.Canvas do begin
         Pen.Color:=clWhite;
         Pen.Style:=psSolid;
         Pen.Width:=1;
         Brush.Color:=clWhite;
         Rectangle(0,0,Width,Height);
         Pen.Color:=clBlack;
         for i:=1 to 12 do
          Pixels[img1.Width div 2+ Round(img1.Width div 2*sin(i/12.0*2*pi)),
            img1.Width div 2-round(img1.Width div 2*cos(i/12.0*2*pi))]:=clBlack;

      end;
    end;

    procedure TForm1.tmr1Timer(Sender: TObject);
    var
      mynow:TDateTime;
      hour,min,sec,msec:Word;
      vh,vm,vs:Real;
      PoiLong:Integer;
    begin
      mynow:=Now();
      DecodeTime(mynow,hour,min,sec,msec);
      vm:=min/60.0*2*pi;
      vh:=hour/12.0*2*pi+(vm/12);
      vs:=sec/60.0*2*pi;
      with Form1.img1.Canvas do begin
        PoiLong := img1.Width div 2;
       { if not firsttime then
        begin      }
          Pen.Color:=clWhite;
          MoveTo(PoiLong,PoiLong);
          LineTo(PoiLong+round(PoiLong/3*sin(vho)),PoiLong-round(PoiLong/3*cos(vho)));
           MoveTo(PoiLong,PoiLong);
          LineTo(PoiLong+round(PoiLong/2*sin(vmo)),PoiLong-round(PoiLong/2*cos(vmo)));
           MoveTo(PoiLong,PoiLong);
          LineTo(PoiLong+round(PoiLong/1.5*sin(vso)),PoiLong-round(PoiLong/1.5*cos(vso)));
       (* end
        else
         firsttime:=false;  *)
         Pen.Color:=clBlack;
          MoveTo(PoiLong,PoiLong);
          LineTo(PoiLong+round(PoiLong/3*sin(vh)),PoiLong-round(PoiLong/3*cos(vh)));
           MoveTo(PoiLong,PoiLong);
          LineTo(PoiLong+round(PoiLong/2*sin(vm)),PoiLong-round(PoiLong/2*cos(vm)));
           MoveTo(PoiLong,PoiLong);
          LineTo(PoiLong+round(PoiLong/1.5*sin(vs)),PoiLong-round(PoiLong/1.5*cos(vs)));
      end;
      vho:=vh;
      vmo:=vm;
      vso:=vs;
    StatusBar1.Panels[0].Text:='System Time:' + DateTimeToStr(Now());
    end;

    end.

    为啥呢?百思不得其解,请论坛大虾指教。

    Good Luck~


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

    x
    回复

    使用道具 举报

    该用户从未签到

    发表于 2013-6-3 14:37:31 | 显示全部楼层
    有什么不同?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-8-18 08:54
  • 签到天数: 1421 天

    [LV.10]以坛为家III

     楼主| 发表于 2013-6-3 14:58:43 | 显示全部楼层
    在Delphi中,您可以看到,表盘被画出来了,在Lazaurs中,变成漆黑一片了。

    Good Luck~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-6-3 18:32:19 | 显示全部楼层
    哪个快?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-8-18 08:54
  • 签到天数: 1421 天

    [LV.10]以坛为家III

     楼主| 发表于 2013-6-4 10:08:28 | 显示全部楼层
    问题解决了:
    将Rectangle(0,0,Width,Height);
    修改为
    Rectangle(0,0,img1.Width,img1.Height);就可以了。

    Good Luck~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-6-5 01:01:28 | 显示全部楼层
    上面问题和这个相似

    unit Unit1;

    {$mode objfpc}{$H+}

    interface

    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

    type

      { TForm1 }

      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;

    var
      Form1: TForm1;
      name : string;

    implementation

    {$R *.lfm}

    { TForm1 }

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      name := 'a';
      memo1.lines.add('button1 name :' + button1.name);
      memo1.lines.add('self.name :' + self.name);
      memo1.lines.add('var name :' + unit1.name);

    end;

    end.

    请问memo1里面显示的三行是什么?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-8-18 08:54
  • 签到天数: 1421 天

    [LV.10]以坛为家III

     楼主| 发表于 2013-6-5 09:24:43 | 显示全部楼层
    第一行返回的是按钮Button的Name.
    第二行返回的是事件本身的name变量值。
    第三行返回的是全局变量name的值。

    现在无法搞清楚为啥在Delphi7中的代码在Lazarus中会出现这个问题。


    Good Luck~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-1-18 15:06:16 | 显示全部楼层
    我刚把公司的一个项目迁移到Lazarus上来,总体运行效果不错,客户也很满意。从Delphi转Lazarus还是很顺利的,但代码转换的过程中需要注意这两者之间的差异,在Delphi中的优化方式不一定适合Lazarus,尤其是图形处理这一块,最好还是看看Lazarus(FPC)的特性然后对症下药。
    回复 支持 反对

    使用道具 举报

    *滑块验证:

    本版积分规则

    QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

    GMT+8, 2025-5-2 21:38 , Processed in 0.123509 second(s), 10 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表