воскресенье, 4 мая 2008 г.

public $Timer1 = null

Вчера бродил по блогам коллег и наткнулся на один интересный пост. Заинтересовала сама идея создания динамически обновляемой надписи. Я не пользуюсь VB вообще и VB.NET в частности и считаю его игрушечным языком, может быть я ошибаюсь. Но не буду здесь обсуждать языки и спорить на эту тему.

Данный блог еще тем мне интересен, что я сам в настоящий момент изучаю ASP .NET, но, как я считаю, я нахожусь в более выгодном положении, я рассматриваю эту технологию со стороны 2х языков – это Delphi .NET и С#. Которые наиболее приспособлены для написания управляемого кода – как говорил не помню кто – «в .net все языки равны, но некоторые равнее».

Итак, задача реализовать динамически обновляемую строку. В качестве примера я выбрал отображение текущего времени. Приступим.

ASP .NET & C#

Все примитивно сводится к размещению на форме компонента Timer с вкладки AJAX Extensions и написания кода:

<scrip runat="server" Language="C#">
protected void Timer1_Tick(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString("hh:mm:ss");
}
</script>

ASP .NET & Delphi .NET

procedure TWebForm1.Timer1_Tick(sender: System.Object;
e: System.EventArgs);
begin
label1.Text := DateTime.Now.ToString('hh:mm:ss');
end;

Delphi for PHP

Я не смог обойти стороной эту среду и попробовал реализовать эту задачу и в ней. И именно с ней я провозился больше всего, но, тем не менее, решил. Код получился более громоздкий, но это обусловлено лишь нулевыми познаниями в JavaScript.

Остановлюсь здесь более подробно.

Также как и в других средах, кидаем на форму компоненты Timer и Label. Выделяем таймер и смотрим на Object Inspector. На вкладке Events никаких событий нет, однако есть еще одна вкладка – JavaScript:

 

Находим там знакомый обработчик OnTimer и пишем следующий код:

//Add your javascript code here
var Stamp = new Date();
var Hours;
var Mins;
var Secs;

Hours = Stamp.getHours();
Mins = Stamp.getMinutes();
Secs = Stamp.getSeconds();

if (Hours == null ) Secs = "00";
if (Mins == null ) Mins = "00";
if (Secs == null ) Secs = "00" ;
if (Mins < 10 ) Mins = "0" + Mins;
if (Secs < 10 ) Secs = "0" + Secs;

document.all.Label1.innerHTML = Hours + ":" +
Mins + ":" +
Secs;

Вот собственно и все, что необходимо для вывода динамической надписи.

3 комментария:

  1. Из чего следует что в VS.NET RAD более "правильный" :)
    А если нужно писать на JS - это уже не настоящий RAD, IMHO
    Вот если бы OnTimer был на вкладке Events, и можно было бы написать
    $this->Label1->Caption= date("H:i:s");
    и оно автоматичски бы транслировалось в JS, как в VS, вот это было бы интересно, а так... разницы между тем, чтобы руками написать
    setTimeout("OnTimer", delay);
    очень мало.

    ОтветитьУдалить
  2. По поводу игрушечности VB.NET ты не прав. На данный момент это почти такой же мощный язык, как и Delphi, и C#. Основной его недостаток - убогий синтаксис.

    ОтветитьУдалить
  3. Для DelphiForPhp всё проще
    у формы поставить свойство UseAjax=True

    function Timer1JSTimer($sender, $params)
    {
    echo "params='';";
    echo $this->Label1->ajaxCall("dSetLabel");
    }


    function dSetLabel($sender, $params)
    {
    $this->Label1->Caption =gmdate('h:i:s');
    }

    ОтветитьУдалить