Главная страница
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.021 c
2-1180388487
snowkam
2007-05-29 01:41
2007.06.17
время и дата


15-1179894396
vajo
2007-05-23 08:26
2007.06.17
Иран на 25 процентов поднял цены на бензин


15-1178522752
TUser
2007-05-07 11:25
2007.06.17
Саркази - выбор французов


2-1179920684
DmitrichJ
2007-05-23 15:44
2007.06.17
Поиск строки в строке


2-1180348039
Чип
2007-05-28 14:27
2007.06.17
Фильтрация через компонент table (по 1 значению)