冬雪雪冬 发表于 2017-8-2 22:45:45

阶段性上机实践(小结)02- 零基础入门学习Delphi 011


本课是编写两个屏保程序。
V 1.00版运行时,屏幕都被程序覆盖,并将截图的桌面占据整个窗口,以欺骗用户,另有一个霓虹灯的窗口随机在桌面移动,当按下空格键时,显示edit和button控件,用以输入密码,密码正确,结束程序。
首先,form设置Borderstyle为bsNone,这样就没有标题条和最大最小按钮和边框了。设置windowstate为wsMaximized使窗口最大化。
加入一个image控件放置图片,课程中是将image的width和height设置成600和800,可以采用另一个方法,把image的align从alNone改为alClient,这样就充满整个窗口了,也不用设置左上角的位置了。另我的图片与屏幕的分辨率不同,再把stretch改为True,使之自动伸缩。
另外就是放一个label做霓虹灯效果,由于霓虹灯的练习前面已经做过,我这里改成label中内容向前滚动的效果。
建立一个timer控件,并将label.Caption的内容每次去掉前2个(一个汉字)再补到字符串的最后。

procedure TForm1.Timer1Timer(Sender: TObject);

begin
s := Label1.Caption;
Delete(s, 1, 2);
s1 := Copy(Label1.Caption, 1, 2);
Label1.Caption := s + s1
end;

建立edit和button控件用以输入密码,并将其visible设置为False。
为接收键盘输入,使用form的onkeydown事件,如果key=VK_SPACE则edit和button的visible改为True。
V2.0版做如下改进:
窗口置顶:
在timer中加入
SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE+SWP_NOMOVE);
或设置form的FormStyle属性为fsStayOnTop,我不知道这两者的差别,不幸的是,在wind10下,即使置顶,仍可按win键调出任务栏。
密码错误3次等待9s,这里需要另一个timer来计时。
具体程序如下:
implementation

{$R *.dfm}
Const
password : String = 'FishC!';
Var
s, s1 : string;
flag : Boolean = True;
n : integer = 3;

procedure TForm1.Timer1Timer(Sender: TObject);

begin
s := Label1.Caption;
Delete(s, 1, 2);
s1 := Copy(Label1.Caption, 1, 2);
Label1.Caption := s + s1;
SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE+SWP_NOMOVE);
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_SPACE) and (flag = True) then
    begin
      edit1.Visible := True;
      button1.Visible := True;
    end
else
    begin
      if flag = False then
      MessageBox(handle, '错误次数太多,等待9s再输入', '警告', MB_OK or MB_ICONSTOP)
      else
      MessageBox(handle, '按空格键并输入密码', '提醒', MB_OK or MB_ICONWARNING);
    end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if (edit1.Text = password) and (n > 0) then
    close
else
    if n > 0 then
      begin
      MessageBox(handle, '密码错误', '提醒', MB_OK or MB_ICONWARNING);
      n := n - 1;
      edit1.Text := '';
      end
    else
      begin
      timer2.Enabled := True;
      edit1.Text := '';
      end;

      
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
flag := True;
n := 3;
timer1.Enabled := False;
end;

end.

将程序的扩展名改为scr,并放置在c:\windows\system下,则可作为真正的屏保程序来使用。

星之波比 发表于 2023-11-23 14:47:34

flag那一块不太明白 为什么专门写一个FLAG=FALSE的情况,小甲鱼在下面判断次数同样也是提示需要等待,那就与上面flag=false的情况重复了,而版主在下面判断次数的时候又把Edit框给空白,不提示超过次数 f反而在flag=False的情况提示等待 {:5_99:}

星之波比 发表于 2023-11-23 14:57:02

而且我电脑win7置顶 也可以调出win
页: [1]
查看完整版本: 阶段性上机实践(小结)02- 零基础入门学习Delphi 011