Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.014 c
15-1179916745
IMHO
2007-05-23 14:39
2007.06.17
Сегодня финал Лиги Чемпионов!


2-1180105148
ppcumax
2007-05-25 18:59
2007.06.17
Delphi7 > Delphi 2005


1-1176973980
DelphiLexx
2007-04-19 13:13
2007.06.17
Test Case и Test Project Delphi2006


1-1177014817
КрЫска
2007-04-20 00:33
2007.06.17
Какой пользователь работает на компьютере?


2-1180346730
nem0
2007-05-28 14:05
2007.06.17
File To String




   Наверх