Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2011, 18:49   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию TWidgetControl и self

Вот такой код:
Код:
var NE : NameEdit; // NameEdit - потомок класса TEdit
///
procedure TForm1.FormCreate(Sender: TObject);
begin
      NE:=NE.Create(self);   
      NE.Parent:=self; // Нельзя; Почему?
      ////
end;
_-Re@l-_ вне форума Ответить с цитированием
Старый 01.06.2011, 18:53   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а что ошибку выдает?(и какую)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.06.2011, 18:54   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Да, Incompatible types : "TWidgetControl" and "TForm1".
_-Re@l-_ вне форума Ответить с цитированием
Старый 01.06.2011, 18:58   #4
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Вроде можно, у меня с memo так работало ...
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 01.06.2011, 19:11   #5
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Внимательно посмотрите на создание класса, у Вас ошибка при создании
ReportCube вне форума Ответить с цитированием
Старый 01.06.2011, 20:26   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Вот более полный код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, QAgeEdit, QNameEdit;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    NE : NameEdit;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
      NE:=NE.Create(self);
      NE.Parent:=self;





Аааааааааа, я лох...
Код:
NE:=NE.Create(self);

Надо было
Код:
NE:=NameEdit.Create(self);

Однако, вот это
Код:
NE.Parent:=self;
Delphi всё равно даёт сделать. Просто не компилирует.

Последний раз редактировалось _-Re@l-_; 01.06.2011 в 20:30.
_-Re@l-_ вне форума Ответить с цитированием
Старый 01.06.2011, 20:34   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Тип вашего NE.Parent - TWidgetControl. Я правильно понял? Self имеет тип TForm в данном случае. Если бы TWidgetControl был родителем TForm, то такое присвоение допустимо. Иначе - ошибка
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.06.2011, 20:36   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А как надо делать-то? Как бы я в своём компоненте не переопределяю Parent, оно наследуется от TEdit.

Заметил: с обычным editом проканывает, с моим - нет.

Последний раз редактировалось _-Re@l-_; 01.06.2011 в 20:42.
_-Re@l-_ вне форума Ответить с цитированием
Старый 01.06.2011, 20:44   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В TEdit Parent - TWinControl. Зачем его переопределять? Присваивая Parent вы говорите объекту в данном случае, что он будет находиться на форме. Если для экзотики вам надо чтобы в качестве Parent всегда віступал TWidgetControl, то и присваивайте объект такого типа или его наследника
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.06.2011, 20:45   #10
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Мне не надо чтобы Parent был TWidgetControl, в этом-то и проблема! Я ничего с ним не делал! А он пишет, что NE.Parent - TWidgetControl...

Вот вам полный код компонента...
Код:
unit QNameEdit;

interface

uses
  SysUtils, Classes, QControls, QStdCtrls;

const
      RUSSIAN = 'RUSSIAN';
      ENGLISH = 'ENGLISH';

type
  NameEdit = class(TEdit)
  private
    { Private declarations }
    OnlyRussian : Boolean;
    OnlyEnglish : Boolean;
  protected
    { Protected declarations }
    procedure KeyPress(Var Key : Char);override;
  public
    { Public declarations }
    constructor Create(AOwner : TComponent);override;
    procedure SetLanguage(Lang : String);
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('SocialNetwork', [NameEdit]);
end;

constructor NameEdit.Create(AOwner : TComponent);
begin
      Inherited Create(AOwner);
      OnlyRussian:=True;
end;

procedure NameEdit.KeyPress(Var Key : Char);
begin
      If OnlyRussian Then
      Begin
            If not (UpCase(Key) in ['À'..'ß']) Then
            Begin
                  Key:=#0;
            End;
      End;
      If OnlyEnglish Then
      Begin
            If not (UpCase(Key) in ['A'..'Z']) Then
            Begin
                  Key:=#0;
            End;
      End;
      Inherited KeyPress(Key);
end;

procedure NameEdit.SetLanguage(Lang : String);
begin
      If AnsiUpperCase(Lang) = RUSSIAN Then
      Begin
            OnlyRussian:=True;
            OnlyEnglish:=False;
      End;
      If AnsiUpperCase(Lang) = ENGLISH Then
      Begin
            OnlyRussian:=False;
            OnlyEnglish:=True;
      End;
end;


end.

Последний раз редактировалось _-Re@l-_; 01.06.2011 в 20:50.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц