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

Вниз

Указатели на TImage   Найти похожие ветки 

 
Denis_Ac   (2004-04-21 08:49) [0]

Т.е. не совсем так... Есть структура:
type
TImg=record
 name:string;
 b:TBitmap;
end;
....
var
p1,p2:^TImg;


Кстати даже здесь сразу возникает вопрос - когда создаём указатель нужно делать Create или нет? (потому как если просто new(p) то всёравно работает)
Дак вот вопрос в том что есть объект Timage на форме в него грузим картинку, и записываем в p1  

p1^.b:=Image1.Picture.Bitamp;

Далее грузим другой битмап и записываем его в p2.
НО ПОЧЕМУ в обоих уцказателях оказывается один и тот же рисунок (последний), Ведь это указатели, и память под них выделена....


 
Григорьев Антон   (2004-04-21 09:07) [1]

Вот именно, что это только указатели. p1 и p2 занимают по 4 байта, и оба указывают на ту картинку, которая хранится в Image1. Чтобы они могли хранить разные картинки, надо создать разные объекты. Примерно так:

New(P1);
P1.B:=TBitmap.Create;
P1.B.Assign(Image1.Picture.Bitmap);
.....
New(P2);
P2.B:=TBitmap.Create;
P2.B.Assing(Image1.Picture.Bitmap);


А перед вызовом Dispose(P) надо сделать P.B.Free.


 
vl_chel ©   (2004-04-21 09:15) [2]

Указатель это только адрес оперативной памяти если его перезаписать память не освобождается.
В твоем примере P1 и p2 это указатели на структуру а b ссылка на клас (посути тоже указатель)
для ссылок на класс надо делать Create - создается новый экземпляр класса.
В твоем примере две ссылки на класс ссылаются на один и тотже объект Image1.Picture.Bitamp который и хранит картинку.
Если хочешь чтобы твоя структура хранила свой экземпляр картинки:


p1^.b := TBitmap.Create;
p1^.b.Assign(Image1.Picture.Bitamp);


При освобождении памяти незабудь p1^.b.Free

Кстати, твой подход для хранения не самый лучший, я бы сделал свой класс с аналогичными свойствами и хранил их экземпляры в TObjectList


 
vl_chel ©   (2004-04-21 09:15) [3]

Указатель это только адрес оперативной памяти если его перезаписать память не освобождается.
В твоем примере P1 и p2 это указатели на структуру а b ссылка на клас (посути тоже указатель)
для ссылок на класс надо делать Create - создается новый экземпляр класса.
В твоем примере две ссылки на класс ссылаются на один и тотже объект Image1.Picture.Bitamp который и хранит картинку.
Если хочешь чтобы твоя структура хранила свой экземпляр картинки:


p1^.b := TBitmap.Create;
p1^.b.Assign(Image1.Picture.Bitamp);


При освобождении памяти незабудь p1^.b.Free

Кстати, твой подход для хранения не самый лучший, я бы сделал свой класс с аналогичными свойствами и хранил их экземпляры в TObjectList


 
ANDRIOD   (2004-04-21 09:58) [4]

>>>>>>>vl_chel
Про
TObjectList
Пожайлуста поподробнее
или дай ссылку если не трудно


 
MetalFan ©   (2004-04-21 10:01) [5]

TObjectList - F1

Use TObjectList to store and maintain a list of objects. TObjectList provides properties and methods to add, delete, rearrange, locate, access, and sort objects. If the OwnsObjects property is set to True (the default), TObjectList controls the memory of its objects, freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed.


 
ANDRIOD   (2004-04-21 10:06) [6]

Пример кто-нить киньте


 
MetalFan ©   (2004-04-21 11:57) [7]

примитивный пример:unit Unit2;

interface
uses classes, Graphics, Contnrs;

type
TObjectListItem = class
  FBitMap: TBitMap;
  FName: string;
  constructor Create(aBitMap : TBitmap; aName: string);
  destructor Destroy; override;
end;

TBitmapList = class(TObjectList)
private
   function GetItem(Index: Integer): TObjectListItem;
   procedure SetItem(Index: Integer; const Value: TObjectListItem);

public
  function AddBitMap(anBM: TBitmap; aName: string): integer;
  function GetBtimapIndex(aName: string): integer;
  property Items[Index: Integer]: TObjectListItem read GetItem write SetItem; default;
end;

implementation

{ TObjectListItem }

constructor TObjectListItem.Create;
begin
 FName := aName;
 FBitMap := TBitmap.Create;
 FBitMap.Assign(aBitMap);
end;

destructor TObjectListItem.Destroy;
begin
 FBitMap.Free;
 inherited;
end;

function TBitmapList.AddBitMap(anBM: TBitmap; aName: string): integer;
var
lOLItem: TObjectListItem;
begin
 lOLItem := TObjectListItem.Create(anBM, aName);
 result := Add(lOLItem);
end;

function TBitmapList.GetBtimapIndex(aName: string): integer;
var
 i : integer;
begin
 result := -1;
 for i:= 0 to pred(self.Count) do
   if self.Items[i].FName = aName then
   begin
     result := i;
     break;
   end;
end;

function TBitmapList.GetItem(Index: Integer): TObjectListItem;
begin
 result := inherited Items[index] as TObjectListItem;
end;

procedure TBitmapList.SetItem(Index: Integer;
 const Value: TObjectListItem);
begin
 inherited Items[Index] := Value;
end;

end.


 
ANDRIOD   (2004-04-21 12:58) [8]

чета я не догнал
делаю

uses unit2

почему не доступны функции :
function AddBitMap(anBM: TBitmap; aName: string): integer;
 function GetBtimapIndex(aName: string): integer;
 property Items[Index: Integer]: TObjectListItem read GetItem write SetItem; default;
пожайлуста обьясните



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

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

Наверх




Память: 0.49 MB
Время: 0.041 c
11-1068034332
SPeller
2003-11-05 15:12
2004.04.11
Есть желающие конвертнуть JCL ?


14-1079467489
kamerad
2004-03-16 23:04
2004.04.11
Можно ли написать антивирус на Delphi


9-1071030267
Kair
2003-12-10 07:24
2004.04.11
Скорость вращения


3-1081511017
Clasic
2004-04-09 15:43
2004.04.11
Сыпится Paradox, глюки с индексами


1-1082482320
Polkan
2004-04-20 21:32
2004.04.11
StringGrid и SaveToFile