Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.017 c
8-1159820586
Чайник
2006-10-03 00:23
2007.06.17
Как очистить TImage от ранее загруженного изображения?


1-1176966053
SpellCaster
2007-04-19 11:00
2007.06.17
Измерить быстродействие алгоритма


1-1176982436
Loginov Dmitry
2007-04-19 15:33
2007.06.17
Объекты синхронизации


2-1179901879
Leta
2007-05-23 10:31
2007.06.17
Выполнить строку


3-1175001305
DelphiLexx
2007-03-27 17:15
2007.06.17
Создание полей произвольных типов, универсальным способом