在自定义组件(Lazarus)中设置TEdit的Text属性时引发异常 [英] Exception raised when setting Text property of TEdit in custom component (Lazarus)

查看:321
本文介绍了在自定义组件(Lazarus)中设置TEdit的Text属性时引发异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用:拉撒路1.2.0; Windows 32位应用程序

Using: Lazarus 1.2.0; Windows 32-bit application

我创建了一个从TCustomPanel派生的自定义组件,其中包含一些TEdit控件.

I have created a custom component derived from TCustomPanel and contains some TEdit controls.

在运行时,当我尝试在组件中设置编辑控件的Text属性时,出现运行时错误.

At runtime, when I try to set the Text property of an edit control in my component, I get a runtime error.

这是错误:

Project project1 raised exception class 'External: SIGSEGV'. 

In file '.\include\control.inc' at line 3246:
GetTextMethod := TMethod(@Self.GetTextBuf);

我搜索了Google,发现没有其他人报告此错误,特别是在设置TEdit的Text属性时.

I Googled and could not find anybody else reporting this error specifically when setting the Text property of TEdit.

这使我相信编写组件时做错了什么.请检查我的代码,并指出出什么问题以及如何解决. TIA!

This leads me to believe that I did something wrong when writing the component. Please check my code and point out what is wrong and how to fix it. TIA!

代码如下:

unit uEditPanel;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;

type

  { TEditPanel }

  TEditPanel = class(TCustomPanel)
    Edit0: TCustomEdit;
    Edit1: TCustomEdit;
    Edit2: TCustomEdit;
    Edit3: TCustomEdit;
    Edit4: TCustomEdit;

  private
    { Private declarations }
    function GetEdit0Text: string;
    procedure SetEdit0Text(AText: string);
    function GetEdit1Text: string;
    procedure SetEdit1Text(AText: string);
    function GetEdit2Text: string;
    procedure SetEdit2Text(AText: string);
    function GetEdit3Text: string;
    procedure SetEdit3Text(AText: string);
    function GetEdit4Text: string;
    procedure SetEdit4Text(AText: string);
  protected
    { Protected declarations }
  public
    { Public declarations }
    procedure CreateWnd; override;
  published
    { Published declarations }
    property Edit0Text: string read GetEdit0Text write SetEdit0Text;
    property Edit1Text: string read GetEdit1Text write SetEdit1Text;
    property Edit2Text: string read GetEdit2Text write SetEdit2Text;
    property Edit3Text: string read GetEdit3Text write SetEdit3Text;
    property Edit4Text: string read GetEdit4Text write SetEdit4Text;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TEditPanel]);
end;

{ TEditPanel }

function TEditPanel.GetEdit0Text: string;
begin
  Result := Edit0.Text;
end;

procedure TEditPanel.SetEdit0Text(AText: string);
begin
  Edit0.Text := AText;
end;

function TEditPanel.GetEdit1Text: string;
begin
  Result := Edit1.Text;
end;

procedure TEditPanel.SetEdit1Text(AText: string);
begin
  Edit1.Text := AText;
end;

function TEditPanel.GetEdit2Text: string;
begin
  Result := Edit2.Text;
end;

procedure TEditPanel.SetEdit2Text(AText: string);
begin
  Edit2.Text := AText;
end;

function TEditPanel.GetEdit3Text: string;
begin
  Result := Edit3.Text;
end;

procedure TEditPanel.SetEdit3Text(AText: string);
begin
  Edit3.Text := AText;
end;

function TEditPanel.GetEdit4Text: string;
begin
  Result := Edit4.Text;
end;

procedure TEditPanel.SetEdit4Text(AText: string);
begin
  Edit4.Text := AText;
end;

procedure TEditPanel.CreateWnd;
begin
  inherited CreateWnd;

  Caption := EmptyStr;
  Height := 117;
  Width := 289;
  BevelOuter := bvNone;
  ClientHeight := 117;
  ClientWidth := 289;

  Edit0 := TCustomEdit.Create(Self);
  Edit1 := TCustomEdit.Create(Self);
  Edit2 := TCustomEdit.Create(Self);
  Edit3 := TCustomEdit.Create(Self);
  Edit4 := TCustomEdit.Create(Self);

  Edit0.Left := 0;
  Edit0.Height := 21;
  Edit0.Top := 0;
  Edit0.Width := 288;
  //Edit0.BorderStyle := bsNone;
  Edit0.TabOrder := 0;

  Edit1.Left := 0;
  Edit1.Height := 21;
  Edit1.Top := 24;
  Edit1.Width := 288;
  // Edit1.BorderStyle := bsNone;
  Edit1.TabOrder := 1;
  Edit1.Font.Color := clGray;

  Edit2.Left := 0;
  Edit2.Height := 21;
  Edit2.Top := 48;
  Edit2.Width := 288;
  //  Edit2.BorderStyle := bsNone;
  Edit2.TabOrder := 2;
  Edit2.Font.Color := clGray;

  Edit3.Left := 0;
  Edit3.Height := 21;
  Edit3.Top := 72;
  Edit3.Width := 288;
  //Edit3.BorderStyle := bsNone;
  Edit3.TabOrder := 3;
  Edit3.Font.Color := clGray;

  Edit4.Left := 0;
  Edit4.Height := 21;
  Edit4.Top := 96;
  Edit4.Width := 288;
  //Edit4.BorderStyle := bsNone;
  Edit4.TabOrder := 4;
  Edit4.Font.Color := clGray;

  Edit0.Parent := Self;
  Edit1.Parent := Self;
  Edit2.Parent := Self;
  Edit3.Parent := Self;
  Edit4.Parent := Self;

  Edit0.SetSubComponent(True);
  Edit1.SetSubComponent(True);
  Edit2.SetSubComponent(True);
  Edit3.SetSubComponent(True);
  Edit4.SetSubComponent(True);
end;

end.

推荐答案

已解决.用户JuhaManninen在Lazarus支持上发布的答案论坛:

Solved. Answer posted by user JuhaManninen on the Lazarus support forum:

您的类中没有构造函数.用 构造函数."

"You have no constructor in your class. Replace CreateWnd with a constructor."

这篇关于在自定义组件(Lazarus)中设置TEdit的Text属性时引发异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆