Главная страница
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.036 c
6-1075464303
Гвость
2004-01-30 15:05
2004.04.11
Компонент NMPOP3


3-1081334604
BigError
2004-04-07 14:43
2004.04.11
QuantumGrid (cxGrid) и выделение.


14-1082373096
lak
2004-04-19 15:11
2004.04.11
как аналитически доказать- что больше


14-1082233960
Yegorchic
2004-04-18 00:32
2004.04.11
http://delphigfx.mastak.ru/


9-1065083172
AlexT1000
2003-10-02 12:26
2004.04.11
Как снять программно скриншот с экрана в FullScreen DirectX?