Текущий архив: 2007.06.17;
Скачать: CL | DM;
Вниз
Правильно ли создаётся и уничтожается TEdit? Найти похожие ветки
← →
A Programmer (2007-05-25 22:06) [0][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. Как быть?
← →
Плохиш © (2007-05-25 22:32) [1]Ошибка в каком-то из { SKIPPED }
> то программа при закрытии выдаёт ошибку (EAccessViolation)
> с указанием на dpr файл.
Как думаешь, отладчик для чего в делфи встроили?
← →
A Programmer (2007-05-25 23:00) [2]>Ошибка в каком-то из { SKIPPED }
Я отключал все { SKIPPED }, и все равно ошибка воспроизводится.
>Как думаешь, отладчик для чего в делфи встроили?
Если нажать на F8 или F7 на той строке где программа останавливается, то программа завершается.
← →
Loginov Dmitry © (2007-05-25 23:24) [3]Убери из FormClose строку Edit1.Free; Не нужна она там.
← →
A Programmer (2007-05-25 23:36) [4]Вот, воспроизвёл ошибку:
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) [5]>Убери из FormClose строку Edit1.Free; Не нужна она там.
А где же объект будет уничтожаться?
← →
Loginov Dmitry © (2007-05-25 23:37) [6]> IF (Key=81) AND (ssCtrl IN Shift ) THEN Close;
И после этого ты еще жалуешься на AV?
← →
Loginov Dmitry © (2007-05-25 23:38) [7]> А где же объект будет уничтожаться?
А Edit1:=TEDIT_COPY.Create(Form1); ты нафига указывал?
← →
Loginov Dmitry © (2007-05-25 23:41) [8]Хотя нет, [6] здесь по-хорошему влиять не должно.
← →
Loginov Dmitry © (2007-05-25 23:49) [9]> Вот, воспроизвёл ошибку:
В D7 этот код работает без ошибок.
← →
A Programmer (2007-05-26 00:09) [10]>А Edit1:=TEDIT_COPY.Create(Form1); ты нафига указывал?
Не знал. Сейчас просветился:
http://www.festra.com/wwwboard/messages/12948.html
Всё, спасибо вопрос решён.
Страницы: 1 вся ветка
Текущий архив: 2007.06.17;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.021 c