Форум: "Начинающим";
Текущий архив: 2011.05.08;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.082 c