Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.043 c
15-1155849254
ronyn
2006-08-18 01:14
2006.09.10
Окно выбора пользователя


3-1152097959
MsGuns
2006-07-05 15:12
2006.09.10
Как определить конец множества RecordSet - ов


15-1155503563
Джо
2006-08-14 01:12
2006.09.10
Поздравляю россиян с победой Маскаева


2-1156248554
IceBeerg
2006-08-22 16:09
2006.09.10
Получение снимка клиентской части окна чужого приложения


2-1156164174
XTD
2006-08-21 16:42
2006.09.10
Как создать дочернее окно?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский