Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1296806882
Alex_C
2011-02-04 11:08
2011.05.08
Как jpg показать на Canvas


1-1253246214
Seleznew
2009-09-18 07:56
2011.05.08
Иерархоческая сортировка


2-1296648381
NieL
2011-02-02 15:06
2011.05.08
Сформировать список


2-1296057400
Kirilovich
2011-01-26 18:56
2011.05.08
Сетевая Бд


2-1296638668
Godod
2011-02-02 12:24
2011.05.08
Ошибка access violation at adress





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский