![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно ли создаётся и уничтожается TEdit? [D3, 2000]
A Programmer © (2007-05-25 22:06:00)[code]
type
TEDIT_COPY = class(TEdit)
private
procedure edit_copy(var m:TMessage); Message WM_COPY;
procedure edit_cut(var m:TMessage); Message WM_CUT;
procedure edit_paste(var m:TMessage); Message WM_PASTE;
end;
type
TForm1 = class(TForm)
{ SKIPPED }
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
public
SavePrefs:BOOLEAN; Edit1:TEdit_Copy;
end;
procedure TEDIT_COPY.edit_copy(var m:TMessage);
begin
Decode_utf_to_clipboard(Form1.Edit1.SelText);
// Inherited;
end;
procedure TEDIT_COPY.edit_cut(var m:TMessage);
begin
if Form1.Edit1.SelLength = 0 then exit;
Decode_utf_to_clipboard(Form1.Edit1.SelText);
ClearSelection;
//Inherited;
end;
procedure TEDIT_COPY.edit_paste(var m:TMessage);
begin
Form1.edit1.Text:=DECODE_UTF_16_STRING( Clipboard_data );
// Inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1:=TEDIT_COPY.Create(Form1);
Edit1.Parent:=Form1;
Edit1.Left:=1;
Edit1.Top:= 160;
Edit1.OnKeyUp:=Edit1KeyUp;
Edit1.OnKeyPress:=Edit1KeyPress;
Edit1.AutoSize:=false; Edit1.Height:=25; Edit1.Text:='';
{ SKIPPED }
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ SKIPPED }
Edit1.Free;
end;
[/code]
Если поставить курсор в Edit1 и нажать комбинацию клавиш для выхода, то программа при закрытии выдаёт ошибку (EAccessViolation) с указанием на dpr файл. Но это происходит только если программа запущена из делфи, если запустить просто то всё ок.
Если убрать из TForm1.FormClose команду Edit1.Free то ошибка исчезает. Подозреваю что это связано с обработчиками Edit1KeyUp и Edit1KeyPress. Как быть?
A Programmer (2007-05-26 00:09:00) [1]>А Edit1:=TEDIT_COPY.Create(Form1); ты нафига указывал?
Не знал. Сейчас просветился:
http://www.festra.com/wwwboard/messages/12948.html
Всё, спасибо вопрос решён.
Loginov Dmitry (2007-05-25 23:49:00) [2]> Вот, воспроизвёл ошибку:
В D7 этот код работает без ошибок.
Loginov Dmitry (2007-05-25 23:41:00) [3]Хотя нет, [6] здесь по-хорошему влиять не должно.
Loginov Dmitry (2007-05-25 23:38:00) [4]> А где же объект будет уничтожаться?
А Edit1:=TEDIT_COPY.Create( Form1 ); ты нафига указывал?
Loginov Dmitry (2007-05-25 23:37:00) [5]> IF (Key=81) AND (ssCtrl IN Shift ) THEN Close;
И после этого ты еще жалуешься на AV?
A Programmer (2007-05-25 23:36:00) [6]Вот, воспроизвёл ошибку:
unit Unit1;
{$o-}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Clipbrd;
type
TEDIT_COPY = class(TEdit)
private
end;
var Edit1:TEdit_Copy;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private
public
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1:=TEDIT_COPY.Create(Form1);
Edit1.Parent:=Form1;
Edit1.Left:=20;
Edit1.Top:= 40;
Edit1.Caption:='абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Edit1.Free;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
IF (Key=81) AND (ssCtrl IN Shift ) THEN Close; //Press Ctrl+Q
end;
end.
Надо нажать Ctrl+Q когда курсор в Edit1
A Programmer (2007-05-25 23:36:00) [7]>Убери из FormClose строку Edit1.Free; Не нужна она там.
А где же объект будет уничтожаться?
Loginov Dmitry (2007-05-25 23:24:00) [8]Убери из FormClose строку Edit1.Free; Не нужна она там.
A Programmer (2007-05-25 23:00:00) [9]>Ошибка в каком-то из { SKIPPED }
Я отключал все { SKIPPED }, и все равно ошибка воспроизводится.
>Как думаешь, отладчик для чего в делфи встроили?
Если нажать на F8 или F7 на той строке где программа останавливается, то программа завершается.
Плохиш (2007-05-25 22:32:00) [10]Ошибка в каком-то из { SKIPPED }
> то программа при закрытии выдаёт ошибку (EAccessViolation)
> с указанием на dpr файл.
Как думаешь, отладчик для чего в делфи встроили?