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

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

TImage [D7, XP]


Женя ©   (2011-02-01 22:53:00) 

Здравтвуйте,
У меня есть класс :

type IDraw = class
Im:array of ImgI;
IDr:^TImage;

constructor CreateDrawI;
procedure Add(Name:string);
procedure AddU(Name:string);
procedure PanelI(n:integer);
procedure PanelN(n:string);
procedure ClearN(n:integer);
procedure ClearAll;

procedure RefreshImN(N:integer);
procedure Refresh;
procedure Delete;
end;

{begin-----------------------------DrawI--------------------------------begin}
constructor IDraw.CreateDrawI;
begin
Add('Panel');
IDr.Transparent:=false;
end;

procedure IDraw.Add;
begin
Setlength(Im,Length(im)+1);
Im[Length(im)-1].Img:=TImage.Create(Form2);
Im[Length(im)-1].Img.Top:=0;
Im[Length(im)-1].Img.Left:=0;
Im[Length(im)-1].Img.Enabled:=true;
Im[Length(im)-1].Img.Visible:=true;
Im[Length(im)-1].Img.Transparent:=true;
Im[Length(im)-1].Img.Align:=alClient;
Im[Length(im)-1].Img.Parent:=Form2;
Im[Length(im)-1].Name:=Name;
{Im[Length(im)-1].Img.Canvas.Pixels[-1,-1]:=clBlack;   }
IDr:=@Im[0].Img;
end;

procedure IDraw.AddU;
begin
Add(Name);
IDr:=@Im[Length(Im)-1].Img;
end;

procedure IDraw.PanelI(n:integer);
begin
IDr:=@Im[n].Img;
end;

procedure IDraw.PanelN(n:string);
var i:integer;
begin
for i:=0 to Length(Im) do
 if Im[i].Name=n then begin
     IDr:=@Im[i].Img;
     exit;
      end;
IDr:=@Im[0].Img;
end;

procedure IDraw.Delete;
begin
Finalize(im);
CreateDrawI;
{ im[ind].Picture.Bitmap.SaveToFile('buf.bmp');
im[i].Picture.Bitmap.LoadFromFile('buf.bmp');  }
end;

procedure IDraw.RefreshImN(N:integer);
begin
Im[n].Img:=TImage.Create(Form2);
Im[n].Img.Top:=0;
Im[n].Img.Left:=0;
Im[n].Img.Enabled:=true;
Im[n].Img.Visible:=true;
Im[n].Img.Transparent:=true;
Im[n].Img.Align:=alClient;
Im[n].Img.Parent:=Form2;
end;

procedure IDraw.Refresh;
var i:integer;
begin
for i:=0 to Length(Im)-1
 do RefreshImN(i);

IDr:=@Im[0].Img;
end;

procedure IDraw.ClearN;
begin
Im[n].Img.Canvas.Rectangle(-5,-5,Im[n].Img.Width+5,
Im[n].Img.Height+5);
end;

procedure IDraw.ClearAll;
var i:integer;
begin
for i:=0 to Length(Im)-1 do
 Im[i].Img.Canvas.Rectangle(-5,-5,Im[i].Img.Width+5,
 Im[i].Img.Height+5);
end;

все работает, но проблема в том, что при изменении размера формы,
размер Канвы не изменяется и часть формы остается пустой


Servy   (2011-02-02 15:53:00) [1]


> Есть вычитание четырёх, есть call @DynArrayLength на каждом
> вызове Length. Так шта не надо.



       TEST    EAX,EAX
       JZ      @@skip
       MOV     EAX,[EAX-4]
@@skip:


Ну да, ну да, гора вычислений. Впрочем, оффтопик это все.


Ega23   (2011-02-02 15:31:00) [2]


> Таким образом, никакого вычисления то и нет, есть чтение
> известного значения.

Есть вычитание четырёх, есть call @DynArrayLength на каждом вызове Length. Так шта не надо.


Servy   (2011-02-02 15:25:00) [3]


> Зачем миллион раз вычислять длину массива?

Насколько мне помнится, длина динамического массива хранится по адресу (начало массива - 4). Таким образом, никакого вычисления то и нет, есть чтение известного значения.

> Впрочем код сам по себе ужасен.

Трудно не согласиться.


> Вообще я написал программу для построения графиков.

Зачем вам TImage и этот странный класс IDraw, предназначение которого мне до сих пор непонятно?

Возьмите TPaintBox, и рисуйте в его событии OnPaint на его Canvas что вам нужно. Можно рисовать в созданный в памяти TBitmap, а потом уже копировать на Canvas TPaintBox'а.


brother   (2011-02-02 14:07:00) [4]

я про код топика... впрочем, яб так не делал...


Ega23   (2011-02-02 11:40:00) [5]


> имхо, не критично)


Дадад, совсем не критично:

function ReverseString(Value: string): string;
var
 i: Integer;
begin
 Result := '';
 for i := 0 to Length(Value) - 1 do
   Result := Result + Value[Length(Value) - i];
end;


Amoeba_   (2011-02-02 11:28:00) [6]


> brother ©   (02.02.11 11:21) [12]
>
> > Зачем миллион раз вычислять длину массива?
>
> имхо, не критично)
>

Из "некртичного" набирается критическая масса.


brother   (2011-02-02 11:21:00) [7]

> Зачем миллион раз вычислять длину массива?

имхо, не критично)


Ega23   (2011-02-02 10:45:00) [8]


>  и работает правильно, без багов

Она написана ужасно.
Взять хотя бы
Im[Length(im)-1].Img:=TImage.Create(Form2);
Im[Length(im)-1].Img.Top:=0;
Im[Length(im)-1].Img.Left:=0;
Im[Length(im)-1].Img.Enabled:=true;
Im[Length(im)-1].Img.Visible:=true;
Im[Length(im)-1].Img.Transparent:=true;
Im[Length(im)-1].Img.Align:=alClient;
Im[Length(im)-1].Img.Parent:=Form2;
Im[Length(im)-1].Name:=Name;


Зачем миллион раз вычислять длину массива?

var
 i: Integer;
begin
 i := Length(Im);
 SetLength(Im, i + 1);
 Im[i].Img := TImage.Create(...);
 with Im[i].Img do
 begin
   Transparent:=true;
   Align:=alClient;
   Parent:=...;
   Name:=....;
 end;
end;


Впрочем код сам по себе ужасен.


sniknik   (2011-02-02 10:22:00) [9]

> TImage.Align:=alClient; - разве он сам размеры не должен менять ?
он и меняет, но размер контейнера и размер содержимого разные вещи.

> Вы забыли изложить самое главное - для чего вы написали этот код. Вполне вероятно, что у вашей задачи есть гораздо более красивое и правильное решение.
наследоваться от PaintBox, и рисовать все на нем, а не манипулировать из левого, ни к чему не привязанного класса, визуальными объектами.


Женя   (2011-02-02 09:24:00) [10]


> а по сабжу - после изменения размеров TImage Вам нужно делать
> изменения размеров TImage.Picture.Graphics


TImage.Align:=alClient; - разве он сам размеры не должен менять ?


Женя   (2011-02-02 09:19:00) [11]

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

type ImgI = record
Img:TImage;
Name:string;
end;


icWasya   (2011-02-02 09:11:00) [12]

а по сабжу - после изменения размеров TImage Вам нужно делать изменения размеров TImage.Picture.Graphics


Servy   (2011-02-02 02:11:00) [13]


> > procedure Add(Name:string);
> >
> > procedure IDraw.Add;
>
> странно.


Так делать можно, другое дело, что любой, кто знает про Class Completion такого никогда не напишет. Автор видимо переписывал названия методов вручную.


>  [0]


Вы забыли изложить самое главное - для чего вы написали этот код. Вполне вероятно, что у вашей задачи есть гораздо более красивое и правильное решение.

Кроме того, неполный список недочетов вашего кода:

IDraw - плохое название для класса, префикс I преимущественно используется для интерфейсов.

Im:array of ImgI - тип ImgI не приведен, а значит попробовать ваш код у желающего помочь не выйдет без дополнительных усилий. Кроме того, имя свойства слабо помогает разобраться с его назначением.

IDr:^TImage; - Имя свойства слабо помогает разобраться с его назначением. Необоснованное использование указателя на указатель.

constructor CreateDrawI - необоснованное переименование конструктора.

for i:=0 to Length(Im) do
if Im[i].Name

возможный выход за границы массива.

Также, вероятно там есть логические ошибки, однако не зная предназначения данного кода, сложно сказать наверняка.


Ega23   (2011-02-01 23:27:00) [14]


> IDr:^TImage;


Дочитал до этого момента. Дальше не стал. Учите матчасть.


KilkennyCat   (2011-02-01 23:15:00) [15]


> procedure Add(Name:string);
>
> procedure IDraw.Add;

странно.


Женя   (2011-02-01 23:07:00) [16]

после изменения размера формы, я очищаю все рисунки и рисую заново ))


Женя   (2011-02-01 23:06:00) [17]

Что надо сделать с TImage чтобы его канва ратянулась на всю форму ?


KilkennyCat   (2011-02-01 23:00:00) [18]


> при изменении размера формы

а твой класс об этом знает?


Наверх

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