Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.08;
Скачать: CL | DM;

Вниз

TImage   Найти похожие ветки 

 
Женя   (2011-02-01 22:53) [0]

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

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;

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


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


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

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


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

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


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

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


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


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

странно.


 
Ega23 ©   (2011-02-01 23:27) [5]


> IDr:^TImage;


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


 
Servy ©   (2011-02-02 02:11) [6]


> > 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

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

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


 
icWasya ©   (2011-02-02 09:11) [7]

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


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

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

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


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


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


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


 
sniknik ©   (2011-02-02 10:22) [10]

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

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


 
Ega23 ©   (2011-02-02 10:45) [11]


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

Она написана ужасно.
Взять хотя бы
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;


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


 
brother ©   (2011-02-02 11:21) [12]

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

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


 
Amoeba_   (2011-02-02 11:28) [13]


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

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


 
Ega23 ©   (2011-02-02 11:40) [14]


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


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

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;


 
brother ©   (2011-02-02 14:07) [15]

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


 
Servy ©   (2011-02-02 15:25) [16]


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

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

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

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


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

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

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


 
Ega23 ©   (2011-02-02 15:31) [17]


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

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


 
Servy ©   (2011-02-02 15:53) [18]


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



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


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



Страницы: 1 вся ветка

Текущий архив: 2011.05.08;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
15-1295598707
12
2011-01-21 11:31
2011.05.08
Помогите правильно написать на немецком


15-1295904584
Юрий
2011-01-25 00:29
2011.05.08
С днем рождения ! 25 января 2011 вторник


15-1295442066
Бывший студент
2011-01-19 16:01
2011.05.08
Слово о Дворковиче


15-1296026295
Dennis I. Komarov
2011-01-26 10:18
2011.05.08
Бросте, если не сложно, balloon.pas на мыло...


2-1296561862
pest
2011-02-01 15:04
2011.05.08
работа с SOAP через SSL