Форум: "Начинающим";
Текущий архив: 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