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

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

TbitMap и function


batya-x ©   (2008-02-03 21:22:00) 

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

function draver(img: TBitmap):TBitmap;
begin
result:=img;
result.Canvas.Brush.Color:=clBlack;
result.Canvas.Pen.Color:=clBlack;
result.Canvas.Rectangle(30, 30, 50, 50);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBitMap;
begin
if OpenDialog1.Execute then
 begin
  bmp:=TBitMap.Create;
  bmp.LoadFromFile(opendialog1.FileName);
  Image1.Canvas.Draw(0,0,draver(bmp));
  Image2.Canvas.Draw(0,0,bmp);
 end;
end;


ведь если написать так передаваемый параметр остаеться неизменимым

function plus(i:integer):integer ;
begin
 result:=i+10;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
x: integer;
begin
x:=10;
Caption:='до '+floattostr(x)+' / после '+floattostr(plus(x))
end;


{RASkov}   (2008-02-04 02:20:00) [1]

> и как этого избежать (отправив в функцию изображение не меняя его оригенал)

Можно вот так например:

function draver(img: TBitmap): TBitmap; //Что такое draver? :)Ладно, фик с ним...
begin
 result:=TBitmap.Create;
 Result.Assign(img);
 result.Canvas.Brush.Color:=clBlack;
 result.Canvas.Pen.Color:=clBlack;
 result.Canvas.Rectangle(30, 30, 50, 50);
end;
..........
var OrigBmp, NewBmp: TBitmap;
begin
 OrigBmp:=TBitMap.Create;
 OrigBmp.LoadFromFile(opendialog1.FileName);
 NewBmp:=draver(OrigBmp);
 {Image1.}Canvas.Draw(0, 0, OrigBmp);
 {Image2.}Canvas.Draw(0, OrigBmp.Height, NewBmp);
 OrigBmp.Free;
 NewBmp.Free;
end;


при выборе "не правильного" файла в opendialog1.FileName что будет? утечка, ...исправь код чтоб этого не было)


{RASkov}   (2008-02-04 02:04:00) [2]

> [5] batya-x   (03.02.08 23:54)

Да чтож тебе нужно-то? непонятно :(

>  Image1.Canvas.Draw(0,0,draver(bmp));
>  Image2.Canvas.Draw(0,0,bmp);

В твоем случае и bmp-то вообще походу не нужно..... так как у TImage'сов есть уже и свои битмапы
Посмотри например на TImage.GetCanvas ...


batya-x   (2008-02-03 23:54:00) [3]


> Уничтожать объект bmp должен Пушкин?

извените забыл.

так как же сделать.
Можно будет создать новый TBitMap и скопировать туда преждние bmp и отправлять в функцию уже новый TBitMap?
и как правильно скопировать?


Amoeba   (2008-02-03 23:16:00) [4]


> procedure TForm1.Button1Click(Sender: TObject);
> var
> bmp: TBitMap;
> begin
> if OpenDialog1.Execute then
>  begin
>   bmp:=TBitMap.Create;
>   bmp.LoadFromFile(opendialog1.FileName);
>   Image1.Canvas.Draw(0,0,draver(bmp));
>   Image2.Canvas.Draw(0,0,bmp);
>  end;
> end;

А здесь, помимо всего прочего, еще и утечка памяти будет. Уничтожать объект bmp должен Пушкин?


Григорьев Антон   (2008-02-03 22:24:00) [5]

Эх, лень второй раз за день писать про то, что классовые переменные - это указатели... Почитайте http://www.delphikingdom.com/asp/answer.asp?IDAnswer=59093- там на самом деле ошибка та же, что и у вас, хотя на первый взгляд ситуации выглядят совершенно разными.


{RASkov}   (2008-02-03 21:53:00) [6]

> [0] batya-x   (03.02.08 21:22)
> следующий код работает, но черный квадрад рисуеться на обоих
> картинках, обьясните почему, и как этого избежать (отправив
> в функцию изображение не меняя его оригенал)

Потому что твоя функция совсем ничего нового не делает...
т.е. можешь изменить вот это:
function draver(img: TBitmap):TBitmap;
на это:
procedure draver(img: TBitmap);
Будет тоже самое... result внутри замени на img т.е. первая строка (img:=img;) получается не нужна...

> ведь если написать так передаваемый параметр остаеться неизменимым
>
> function plus(i:integer):integer ;

А ты не ровняй все под одну гребенку..... найди отличия TObject и Integer.... ищи в хэлпе...
Или ты хочешь здесь пройти курс обучения делфи?


batya-x   (2008-02-03 21:24:00) [7]

точнее
//Caption:='до '+floattostr(plus(x))+' / после '+floattostr((x))


Наверх

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