Вопрос № 119337: Здравствуйте, уважаемые эксперты! Два вопроса
1. Хочу написать что-то типа Outpost: для контроля входящего/исходящего трафика, блокировать трафик для некоторых приложений. Подскажите, пожалуйста, в какую сторону копать, ссылки, статьи;
2. Как...Вопрос № 119427: Уважаемые эксперты, помогите выявить причину ошибки.
В программе выполняется такой код:
pic_temp:=Form1.ImageL.Picture.Bitmap;
Если после этого написать
pic_temp.Free;
при выполнении программы происходит ошибка. В чём тут дело ...Вопрос № 119459: Уважаемые, эксперты! Расскажите, пожалуйста, как в реестре программно создать свой ключ и проверять есть ли он там. Ключ может быть любым и лежать в любой директории. Это нужно для того чтобы сделать программу платной и при введении особого кода, (ко...
Вопрос № 119.337
Здравствуйте, уважаемые эксперты! Два вопроса
1. Хочу написать что-то типа Outpost: для контроля входящего/исходящего трафика, блокировать трафик для некоторых приложений. Подскажите, пожалуйста, в какую сторону копать, ссылки, статьи;
2. Как скрыть текстовый курсор в Edit, Memo, RichEdit (не мышиный курсор)
Спасибо за внимание
Отправлен: 19.01.2008, 20:36
Вопрос задал: Beginner (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: PavelGM
Здравствуйте, Beginner!
2. Текстовый курсор называется кареткой. Зная это легко находятся функции ShowCaret/HideCaret - с параметром хэндл окна - ex: HideCaret(Edit.Handle).
Ответ отправил: PavelGM (статус: Студент)
Ответ отправлен: 21.01.2008, 10:42 Оценка за ответ: 5 Комментарий оценки: Спасибо! Оказалось просто!
Вопрос № 119.427
Уважаемые эксперты, помогите выявить причину ошибки.
В программе выполняется такой код:
pic_temp:=Form1.ImageL.Picture.Bitmap;
Если после этого написать
pic_temp.Free;
при выполнении программы происходит ошибка. В чём тут дело и как правильно копировать 1 TBitmap в другой?
Ваша проблема заключается в неправильном понимании того, что из себя представляет объект и, в частности, объект класса TBitmap.
Ита, у нас есть "Bmp:TBitmap;". Как Вы думаете, сколько места в памяти занимает переменная Bmp? Правильный ответ - 4 байта. Дело в том, что это на самом деле не что иное, как указатель на адрес в памяти, т.е. по сути число. По этому числу всегда можно получить доступ к полям объекта и его методам (на основе описания класса объекта компилятор распределяет память, занимаемую самим объектом так, чтобы можно было быстро вычислить адрес поля, хранящего информацию для требуемого свойства, или метода, который
следуеит вызвать).
Уверен, что Вы слышали о таком понятии, как "утечка памяти". Иначе бы, наверное, не написали строку с освобождением объекта. Утечка памяти - это случай, когда не остаётся информации о расположении объекта в памяти (т.е. в общем случае - указателей на соответствующий участок ОЗУ), а память, занятая объектом, не освобождается, т.е. остаётся помеченной как используемая.
Когда Вы пишете Bmp1:=Bmp2, где Bmp1 и Bmp2 - типа TBitmap (например), то после выполнения этого действия объект остаётся один, а указателей на него - два. Поэтому-то, когда Вы вызываете в Вашем коде "pic_temp.Free;", то фактически удаляете объект-битмап Вашего ImageL.Picture'а. Но Image, поскольку именно он этот Bitmap самостоятельно создаёт, заботится и о его удалении. И соответственно не заботится о контроле за существованием этого Bitmap'а (даже если бы он определил, что Bitmap куда-то исчез, то
сделать что-либо существенное не смог бы).
Итак, Вы удалили ImageL.Picture.Bitmap. При следующем обращении к этому свойству, независимо от того, обращаетесь ли к нему Вы из своей программы или контрол TImage, будет обнаружено, что обращение происходит по тому адресу, где уже "ничего нет". О чём Вам и сообщат любезно.
Теперь практическая часть... Основной принцип при таком способе взаимодействия с контролами, каким пользуетесь Вы, - не удалять то, чего не создаёте сами. Т.е., например, в справке по TTreeView написано, что значения, возвращаемые функциями типа Add (а эти значения имеют тип TTreeNode, являющийся классом и теоретически требующий освобождения), нельзя освобождать. Другими словами, для того, чтобы Ваша программа заработала, достаточно из приведённого Вами кода убрать вызов метода Free. Утечки не будет, уж поверьте
мне и Borland'у. :)
С уважением, DimonSoft.
Ответ отправил: DimonSoft (статус: 3-ий класс)
Ответ отправлен: 20.01.2008, 19:49 Оценка за ответ: 5 Комментарий оценки: Спасибо, очень содержательный ответ!
Отвечает: Selya
Здравствуйте, Хукаленко Дмитрий!
При таком присваивании ты копируешь не объект, а только указатель на объект. В этом случае у тебя и pic_temp, и Form1.ImageL.Picture.Bitmap ссылаются на один и тот же объект Form1.ImageL.Picture.Bitmap. Вообще постарайся спроектировать свой код так, чтобы исключить такие "копирования" объектов, а работать только с одним объектом. А то очень трудно потом искать ошибки и утечки памяти. Но если ты всё-таки хочешь скопировать один объект в другой, то сначала нужно создать объект, в который будешь что-то
копировать. Ну и не забыть его потом удалить. Например:
pic_temp := TBitmap.Create;
try
pic_temp.Assign(Form1.ImageL.Picture.Bitmap);
// делаем что-то с pic_temp
finally
pic_temp.Free;
end;
Приложение:
Ответ отправил: Selya (статус: 4-ый класс)
Ответ отправлен: 21.01.2008, 01:12
Отвечает: Genia007
Здравствуйте, Хукаленко Дмитрий!
Если сделать код таким, то всё работает без проблем:
var pic_temp:TBitmap;
begin
pic_temp:= TBitmap.Create;
pic_temp.Assign(Form1.Image1.Picture.Bitmap);
pic_temp.Free;
end;
Ответ отправил: Genia007 (статус: 4-ый класс)
Ответ отправлен: 21.01.2008, 12:47
Вопрос № 119.459
Уважаемые, эксперты! Расскажите, пожалуйста, как в реестре программно создать свой ключ и проверять есть ли он там. Ключ может быть любым и лежать в любой директории. Это нужно для того чтобы сделать программу платной и при введении особого кода, (который я и буду продавать) создавать или удалять этот ключ.
Отправлен: 20.01.2008, 18:17
Вопрос задал: demid (статус: Посетитель)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Drbear
Здравствуйте, Demid!
Почитайте статью по адресу:
http://delphiworld.narod.ru/base/reg_use.html
там есть и ещё.
Ответ отправил: Drbear (статус: 6-ой класс)
Ответ отправлен: 20.01.2008, 18:29 Оценка за ответ: 5
Отвечает: Selya
Здравствуйте, Demid!
Смотри справку Delphi для TRegistry
Там всё просто, работаешь с TRegistry почти как TIniFile
Ответ отправил: Selya (статус: 4-ый класс)
Ответ отправлен: 21.01.2008, 01:16 Оценка за ответ: 5
Отвечает: Genia007
Здравствуйте, Demid!
Вот процедура записи ключа (данные в виде строки) в реестр:
procedure SaveFileToRegistry(FileName:String;SubKey : String);
Var R : TRegistry;
begin
R:=TRegistry.Create;
try
R.RootKey := HKEY_CLASSES_ROOT;// Или другая ветка. Если эту строку не писать, то по умолчанию будет //HKEY_CURRENT_USER
R.OpenKey(SubKey,True);// Subkey имя вашей программы
R.WriteString('FileName',FileName);// или для WriteInteger цифр и т. п.
finally
R.Free;
end;
end;
А вот как её вызвать SaveFileToRegistry(FileName,'имя вашей программы');
Для считывания ключа:
function ReadFileFromRegistry(FileName:String;SubKey : String) : boolean;
Var R:TRegistry;
s: string;
begin
R:=TRegistry.Create;
try
R.RootKey := HKEY_CLASSES_ROOT;
result:=R.OpenKey(SubKey,false);
if not result then exit;
s:=R.ReadString('FileName');
finally
R.Free;
end;
end;
А вот как её вызвать ReadFileToRegistry(FileName,'имя вашей программы');
Ответ отправил: Genia007 (статус: 4-ый класс)
Ответ отправлен: 21.01.2008, 12:46 Оценка за ответ: 4