Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

matrix


Нуб ©   (2007-03-05 11:10:00) 

как можно этот код упростить чтобы самому не писать else if then begin - в лом как-то и не красиво может с помощью case ? код ниже

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);

 private
   { Private declarations }
   procedure OnTimer (Sender: TObject);
 public
   { Public declarations }

 end;

var
 Form1: TForm1;
   i : integer = 0;
   t: TTimer;
   l: array of TLabel;
   e: TEdit;
   kol : Integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   i := i + 1;
   t := TTimer.Create(Application);
   t.Interval := 10;
   t.OnTimer := OnTimer;
   SetLength(l,1000);
   for kol :=1 to 480 do begin
       l[kol] := TLabel.Create(Application);
       l[kol].Parent := Form1;
       l[kol].Visible := true;
       l[kol].Caption := IntToStr(i);
       if kol <= 40 then begin
           l[kol].Left := kol*20;
           l[kol].Top := 1;
       end
       else if kol <= 80 then begin
           l[kol].Left := (kol-40)*20;
           l[kol].Top := 20;
       end
       else if kol <= 120 then begin
           l[kol].Left := (kol-80)*20;
           l[kol].Top := 40;
       end
       else if kol <= 160 then begin
           l[kol].Left := (kol-120)*20;
           l[kol].Top := 60;
       end
       else if kol <= 200 then begin
           l[kol].Left := (kol-160)*20;
           l[kol].Top := 80;
       end
       else if kol <= 240 then begin
           l[kol].Left := (kol-200)*20;
           l[kol].Top := 100;
       end
       else if kol <= 280 then begin
           l[kol].Left := (kol-240)*20;
           l[kol].Top := 120;
       end
       else if kol <= 320 then begin
           l[kol].Left := (kol-280)*20;
           l[kol].Top := 140;
       end
       else if kol <= 360 then begin
           l[kol].Left := (kol-320)*20;
           l[kol].Top := 160;
       end
       else if kol <= 400 then begin
           l[kol].Left := (kol-360)*20;
           l[kol].Top := 180;
       end
       else if kol <= 440 then begin
           l[kol].Left := (kol-400)*20;
           l[kol].Top := 200;
       end
       else begin
           l[kol].Left := (kol-440)*20;
           l[kol].Top := 220;
       end;
   end;
end;

procedure TForm1.OnTimer (Sender: TObject);
begin
   t.Interval := 10;
   i := i + 1;
   for kol :=1 to 480 do begin
       l[kol].Caption := IntToStr(i);
   end
end;

end.


Нуб   (2007-03-05 16:53:00) [1]


> novill ©


:) красота все летает , сенкс за потраченное время на меня


novill   (2007-03-05 16:44:00) [2]

> [13] Нуб   (05.03.07 14:21)
> люблю скорость :)


Любишь скорость - слезай с черепахи ;-)

unit Unit1;

interface

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

type
Tmatrix = class(TForm)
  procedure FormCreate(Sender: TObject);
  procedure FormShow(Sender: TObject);

private
  { Private declarations }
  procedure OnTimer (Sender: TObject);
public
  { Public declarations }

end;

var
matrix: Tmatrix;
  i : integer = 0;
  sorok: integer = 0;
  t: TTimer;

implementation

{$R *.dfm}

procedure Tmatrix.FormCreate(Sender: TObject);
begin
  t := TTimer.Create(Application);
  t.Interval := 30;
  t.OnTimer := OnTimer;
end;

procedure Tmatrix.OnTimer (Sender: TObject);
var k: integer;
  kol: integer;
begin
  i := i + 1;
      for k:=1 to 40 do begin
          for kol:=1 to 60 do
              Self.Canvas.TextOut(kol*20,20*(k-1),IntToStr(i));
          sorok := sorok + 60;
      end;
end;

procedure Tmatrix.FormShow(Sender: TObject);
begin
  matrix.WindowState := wsMaximized;
end;

end.


Сергей М.   (2007-03-05 14:25:00) [3]

Лучше бы ты "любил" один любой списочный контрол вместо сотен лейблов.


Нуб   (2007-03-05 14:21:00) [4]

люблю скорость :)


Сергей М.   (2007-03-05 13:00:00) [5]

А зачем тебе "большая скорость" ?


Нуб   (2007-03-05 12:47:00) [6]

скорость появления новых циферок на экране существенно ниже, чем при количестве TLabelов  в 2 раза меньшем, то есть 1200 :), и голова у меня сегодня тоже "тупит" днюха вчера была =)


Сергей М.   (2007-03-05 12:43:00) [7]

Что есть "тупит" ?

"Тупит" обычно голова)


Нуб   (2007-03-05 12:39:00) [8]

избавил :), тупит так же как и прежде , no effect


Сергей М.   (2007-03-05 12:32:00) [9]

Для начала избавь свой алгоритм от совершенно лишних и бестолковых вычислений:

procedure Tmatrix.OnTimer (Sender: TObject);
var kol: integer; s: string;
begin
  i := i + 1;
  s := IntToStr(i);
  for kol :=1 to 2400 do
      l[kol].Caption := s;
end;


Нуб   (2007-03-05 12:19:00) [10]

:) красиво !!!, но для меня это еще рано, я новичок строк побольше написал намного :) вообщем кто хочет увидеть матрицу и проверить свой проц на способность может следующий код заюзать , у меня тачка потуплевать начала после запуска следующего кода

unit Unit1;

interface

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

type
 Tmatrix = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure Button1Click(Sender: TObject);

 private
   { Private declarations }
   procedure OnTimer (Sender: TObject);
 public
   { Public declarations }

 end;

var
 matrix: Tmatrix;
   i : integer = 0;
   sorok: integer = 0;
   t: TTimer;
   l: array [1..2400] of TLabel;
   e: TEdit;

implementation

{$R *.dfm}

procedure Tmatrix.FormCreate(Sender: TObject);
var k: integer;
   kol: integer;

begin

   t := TTimer.Create(Application);
   t.Interval := 30;
   t.OnTimer := OnTimer;

      for kol:=1 to 2400 do begin
       l[kol] := TLabel.Create(Application);
       l[kol].Parent := matrix;
       l[kol].Visible := true;
       l[kol].Caption := IntToStr(i);
      end;

       for k:=1 to 40 do begin
           for kol:=1 to 60 do begin
               l[kol+sorok].Left := kol*20;
               l[kol+sorok].Top := 20*(k-1);
           end;
           sorok := sorok + 60;
       end;
end;

procedure Tmatrix.OnTimer (Sender: TObject);
var kol: integer;
begin
   i := i + 1;

   for kol :=1 to 2400 do
       l[kol].Caption := IntToStr(i);

end;

procedure Tmatrix.FormShow(Sender: TObject);
begin
   matrix.WindowState := wsMaximized;
end;

procedure Tmatrix.Button1Click(Sender: TObject);
var kol: integer;
begin
       for kol :=1 to 2400 do
       l[kol].free;
end;

end.

комп тупит нереально ;)


novill   (2007-03-05 11:57:00) [11]

> [0] Нуб   (05.03.07 11:10)

такие извращения делаются двумя строчками :)

Процедура может выглядеть так:

procedure TForm1.FormCreate(Sender: TObject);
begin
  i := i + 1;
  t := TTimer.Create(Application);
  t.Interval := 10;
  t.OnTimer := OnTimer;
  SetLength(l,1000);
  for kol :=1 to 480 do begin
      l[kol] := TLabel.Create(Application);
      l[kol].Parent := Form1;
      l[kol].Visible := true;
      l[kol].Caption := IntToStr(i);
      l[kol].Left:=((kol-1) mod 40)*20;
     l[kol].Top:=((kol-1) div 40)*20;

  end;
end;


Нуб   (2007-03-05 11:31:00) [12]

грид не хочу юзать, сенкс за инфу


Нуб   (2007-03-05 11:25:00) [13]

Сенкс за инфу, прогу пишу для себя, на работе нефиг делать вот и решил что-то написать


ЮЮ   (2007-03-05 11:25:00) [14]

Для вывода данныз в "сетке" используются TStringGrid или TDrawGrid (а не 1000 TLabel). Тогда и таймером извращения не потребуются


MBo   (2007-03-05 11:19:00) [15]

два вложенных цикла, первый до 12, второй до 40

А вообще на каких маньяков рассчитана  программа с полутысячей надписей?


Desdechado   (2007-03-05 11:18:00) [16]

Судя по всему, вычисления могут быть представлены в виде формулы от переменной kol. Тогда ветвления излишни.


Наверх

Титульная страница Поиск, карта сайта Написать письмо