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

Вниз

PChar:=String   Найти похожие ветки 

 
DiamondShark ©   (2006-08-18 22:27) [40]


> Ega23 ©   (18.08.06 18:50) [31]

Не верю.


 
DevilDevil ©   (2006-08-22 15:18) [41]

А мне вот интересно следующее:

Если объявить динамический массив строк, потом периодически изменять его размерность, утечка памяти будет?


 
Anatoly Podgoretsky ©   (2006-08-22 15:27) [42]

DiamondShark ©   (18.08.06 10:38) [7]
Короче, до времени ее изменения.


 
Anatoly Podgoretsky ©   (2006-08-22 15:29) [43]

Loginov Dmitry ©   (18.08.06 17:09) [21]
Я бы поостерегся говорить о приведении по отношению к PChar(Text) - это совсем не так.


 
Anatoly Podgoretsky ©   (2006-08-22 15:30) [44]

Loginov Dmitry ©   (18.08.06 18:33) [26]
Это вообще бред.


 
Anatoly Podgoretsky ©   (2006-08-22 15:32) [45]

DevilDevil ©   (22.08.06 15:18) [41]
С чего бы.


 
Ega23 ©   (2006-08-22 16:05) [46]


> DiamondShark ©   (18.08.06 22:27) [40]
>
>
> > Ega23 ©   (18.08.06 18:50) [31]
>
> Не верю.
>


Всё просто. Это диалог изменения свойств объекта. Создаётся динамически. Изменения "принимаются" по нажатию кнопки.

 TLookupComboPropertyFrame = class(TFrame, IPropertyFrame)
   DBLookupCombobox: TDBLookupComboboxEh;
   lbText: TLabel;
   adsData: TADODataSet;
   dsData: TDataSource;
 private
   FTarget: PVariant;
   FDebug: Boolean;
   { Private declarations }
 public
   class function init(tgt: PVariant; text : string;dlg : TPropertiesForm) : TLookupComboPropertyFrame;

   procedure refreshData; // Called to bring data from object to controls.
   procedure applyData;   // Called to bring data from controls to object.
   procedure rejectData;  // called to cancel changes.
   function  get_frame : TFrame;

   property frame  : TFrame  read get_frame;
   property target : PVariant    read FTarget write FTarget;
   property Debug : Boolean Read FDebug Write FDebug;
 end;

implementation

{$R *.DFM}

{ TLookupComboPropertyFrame }

//*****************************************************************************

procedure TLookupComboPropertyFrame.applyData;
begin
 FTarget^:=DBLookupCombobox.KeyValue;
 //FTarget^:=adsData.FieldByName(DBLookupCombobox.KeyField).AsInteger;
end;

//*****************************************************************************

function TLookupComboPropertyFrame.get_frame: TFrame;
begin
 Result:=Self;
end;

//*****************************************************************************

class function TLookupComboPropertyFrame.init(tgt: PVariant; text: string;
 dlg: TPropertiesForm): TLookupComboPropertyFrame;
var
 frm : TLookupComboPropertyFrame;
begin
 frm      := TLookupComboPropertyFrame.Create(dlg);
 frm.Name := "C" + IntToStr(Random(2000000000));

 frm.FTarget         := tgt;
 frm.lbText.Caption  := text;

 dlg.addFrame(frm);

 Result := frm;
end;

//*****************************************************************************

procedure TLookupComboPropertyFrame.refreshData;
begin
 try
   DBLookupCombobox.KeyValue:=FTarget^;
 except

 end;
end;

//*****************************************************************************

procedure TLookupComboPropertyFrame.rejectData;
begin
 refreshData;
end;

//*****************************************************************************


FTarget - и есть адрес, по которому надо внести изменения. А, соответственно, на init я этот адрес и задаю.


 
DevilDevil ©   (2006-08-22 18:32) [47]


> Anatoly Podgoretsky ©   (22.08.06 15:32) [45]
>
> DevilDevil ©   (22.08.06 15:18) [41]
> С чего бы.


Ну смотри, у меня есть динамический массив строк, размерности 3. Каждый элемент - условно говоря указатель на какую-то область динамической памяти:
StrArr[0] := "STR 0";
StrArr[1] := "STR 1";
StrArr[2] := "STR 2";


Если я уменьшу размерность этого массива, то освободится только память под указатель, а "деструктора" строки не поизойдёт; поэтому и утечка памяти... Длят того чтобы этого не происходило, я должен перед уменьшением размерности массива "обнулить" освобождаемые строки:
StrArr[1] := "";
StrArr[2] := "";
SetLength(StrArr, 1);


Я не прав?


 
Anatoly Podgoretsky ©   (2006-08-22 18:48) [48]

Еще раз повторяю с чего бы, у тебя ошибка где то в другом месте.


 
begin...end ©   (2006-08-22 20:31) [49]

> DevilDevil ©   (22.08.06 18:32) [47]

> Если я уменьшу размерность этого массива...

В процессе выполнения программы Вы не можете изменить размерность массива (ни статического, ни динамического) -- она постоянна, и в данном случае равна 1. То, о чём Вы говорите, называется размером, а не размерностью.

> то освободится только память под указатель, а "деструктора"
> строки не поизойдёт

Вы ошибаетесь. При уменьшении размера массива, состоящего из длинных строк, счётчик ссылок удаляемых из массива строк уменьшится на 1, и если после этого окажется, что он равен 0, то память, занимаемая телами этих строк, освободится автоматически. Такова особенность типов с управляемым временем жизни, к которым относятся и длинные строки (AnsiString).

Если бы речь шла о массиве простых указателей, содержащих адреса участков памяти, выделенных Вами с помощью, скажем, GetMem, то Вы были бы правы -- перед уменьшением размера массива следовало бы вызвать FreeMem для каждого удаляемого элемента.

P.S. Так как насчёт [29]? За словеса отвечать будем, или как?


 
ronyn   (2006-08-23 00:17) [50]


> Просто Delphi вкупе с Флёновыми развращает. Не учит пониманию
> простых вещей.
> Точнее, не простых, а основополагающих.

Почему бы это. Кто что имеет против Флёнова?


 
Злой   (2006-08-23 00:18) [51]

> begin...end ©   (22.08.06 20:31) [49]
Такова особенность типов с управляемым временем жизни, к которым относятся и длинные строки (AnsiString).


Благодарю. А где можно поподробнее почитать о типах с управляемым временем жизни?

> P.S. Так как насчёт [29]? За словеса отвечать будем, или как?

begin...end ©   (18.08.06 18:46) [29]
> DevilDevil ©   (18.08.06 16:19) [15]
А можно пояснить, кого, например, я обкакал в посте [5]? Аж интересно.


Естественно, к Вам моя реплика не имеет ни какого отношения


 
DevilDevil ©   (2006-08-23 00:19) [52]

Это я, - забыл ник сменить



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

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

Наверх




Память: 0.56 MB
Время: 0.036 c
3-1151580901
KygECHuK
2006-06-29 15:35
2006.09.10
Работа с ClientDataSet


2-1155830851
GTAID
2006-08-17 20:07
2006.09.10
PChar:=String


2-1156349211
B.T.R.
2006-08-23 20:06
2006.09.10
Form1 and Form2


2-1156277463
DillerXX
2006-08-23 00:11
2006.09.10
CreateThread && Strings


15-1155627978
umbra
2006-08-15 11:46
2006.09.10
вопрос про статическую библиотеку и С