Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.22;
Скачать: CL | DM;

Вниз

Ошибка компилятора ?   Найти похожие ветки 

 
Eugene Lachinov ©   (2002-07-10 11:14) [0]

Если объявить

function InputDialog(const ATitle, APrompt : string;
AInputType : TInputType;
var AText : String;
HelpCtx : Longint = 0;
SelectClick : TSelectValueEvent = nil;
KeyDown : TKeyEvent = nil) : Boolean; overload;

, то вызов строки

InputDialog("", "", itEdit, S, 0, nil, nil) не проходит при компиляции, убираешь, компиляция проходит нормально, это обходимо ?

InputDialog("", "", itEdit, S) при overload тоже компилируется без ошибок, но иногда необходимо передать последний параметр.

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

type
TSelectValueEvent = procedure (Sender : TObject; var Text : String) of object;
TInputType = (itEdit, itMemo);

function InputDialog(const ATitle, APrompt : string;
AInputType : TInputType;
var AText : String;
HelpCtx : Longint = 0;
SelectClick : TSelectValueEvent = nil;
KeyDown : TKeyEvent = nil) : Boolean;

implementation

{$R *.dfm}

function InputDialog(const ATitle, APrompt : String;
AInputType : TInputType;
var AText : String;
HelpCtx : Longint = 0;
SelectClick : TSelectValueEvent = nil;
KeyDown : TKeyEvent = nil) : Boolean;
begin
Result := False
end;


procedure TForm1.Button1Click(Sender: TObject);
var
S : string;
begin
InputDialog("", "", itEdit, S, 0, nil, nil)
end;


 
Eugene Lachinov ©   (2002-07-10 12:12) [1]

пропустил :)
..., убираешь overload,


 
Игорь Шевченко ©   (2002-07-10 12:37) [2]

А зачем overload - я, вроде, не нашел одноименной функции ...

В D5 компиляция без ошибок проходит...


 
Eugene Lachinov ©   (2002-07-10 12:42) [3]

Текст выдран из модуля для описания проблемы, в нем есть еще одно описание InputDialog


 
Игорь Шевченко ©   (2002-07-10 12:53) [4]

Тогда код целиком, плз


 
Eugene Lachinov ©   (2002-07-10 12:57) [5]

Код с проблемой приведен, может проблема в Delphi 6



 
Игорь Шевченко ©   (2002-07-10 13:07) [6]

У меня под рукой только D5. Сдается мне, что код целиком может прояснить ситуацию. А приведенный кусок компилируется под D6 ?


 
Eugene Lachinov ©   (2002-07-10 13:12) [7]

Если
type
TSelectValueEvent = procedure (Sender : TObject; var Text : String) of object;
TInputType = (itEdit, itMemo);

function InputDialog(const ATitle, APrompt : string;
AInputType : TInputType;
var AText : String;
HelpCtx : Longint = 0;
SelectClick : TSelectValueEvent = nil;
KeyDown : TKeyEvent = nil) : Boolean; overload;

то нет



 
Толик ©   (2002-07-10 13:14) [8]

function InputDialog(const ATitle, APrompt : string;
AInputType : TInputType;
var AText : String;
HelpCtx : Longint = 0;
SelectClick : TSelectValueEvent = nil;
KeyDown : TKeyEvent = nil) : Boolean; overload;

Правильно ли я понимаю, что в другой overload-функции отсутствуют некоторые параметры, объявленные здесь по умолчанию? Если это так, то при вызове InputDialog("", "", itEdit, S) компилятор совершенно справедливо не может понять, какую ф-ю ему вызывать: ту, у которой много параметров, но они по умолчанию, или ту, у которой их меньше...
Короче, решение проблемы (если я её конечно правильно понял): убрать умолчание у всех параметров обеих ф-й.


 
McSimm ©   (2002-07-10 13:15) [9]

IMHO тут недоразумение.

overload используется для объявления нескольких функций с одинаковым именем и разными параметрами

назначение параметрам default значений не имеет к overload отношения


 
Игорь Шевченко ©   (2002-07-10 13:15) [10]

А посмотреть второе объявление можно ?
Если overload, то подразумевается, что имеется два объявления процедуры с одним именем, но с РАЗНЫМИ параметрами


 
Eugene Lachinov ©   (2002-07-10 13:25) [11]

Я видимо указанием текста который компилится под Delphi 6 всех запутал (удалял, добавлял overload, скопировал без него), поэтому привожу еще раз с небольшими дополнениями, надеюсь, сниму все неясности

Delphi 6 (Update 2)

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

type
TSelectValueEvent = procedure (Sender : TObject; var Text : String) of object;
TInputType = (itEdit, itMemo);

function InputDialog(const ATitle, APrompt : string;
AInputType : TInputType;
var AText : String;
HelpCtx : Longint = 0;
SelectClick : TSelectValueEvent = nil;
KeyDown : TKeyEvent = nil) : Boolean; overload;

function InputDialog : Boolean; overload;

implementation

{$R *.dfm}

function InputDialog(const ATitle, APrompt : String;
AInputType : TInputType;
var AText : String;
HelpCtx : Longint = 0;
SelectClick : TSelectValueEvent = nil;
KeyDown : TKeyEvent = nil) : Boolean;
begin
Result := False
end;

function InputDialog : Boolean;
begin
Result := False
end;

procedure TForm1.Button1Click(Sender: TObject);
var
S : string;
begin
InputDialog("", "", itEdit, S, 0, nil, nil)
end;

end.


 
Толик ©   (2002-07-10 13:37) [12]

А-а-а. Фишка в том, что последние аргументы - указатели на ф-ю!!!
Решение:

procedure TForm1.Button1Click(Sender: TObject);
var
S : string;
Param1: TSelectValueEvent;
Param2: TKeyEvent;

begin
<>Param1 := nil;
Param2 := nil;

InputDialog("", "", itEdit, S, 0, Param1, Param2);
end;


 
Eugene Lachinov ©   (2002-07-10 13:40) [13]

>Толик
Тогда почему без overload компилируется ?


 
McSimm ©   (2002-07-10 13:55) [14]

Компилятор не может явно преобрбразовать nil к типу TKeyEvent

Можно:
делать вызов InputDialog без последнего параметра вообще, либо с параметром явно имеющим тип TKeyEvent

или
Написать 3ю версии функции overload


 
McSimm ©   (2002-07-10 13:58) [15]

>Тогда почему без overload компилируется ?
Когда функция имеет несколько overload версий компилятор производит дополнительную работу по поиску соответствующей функции. Это не всегда однозначно легко определить

Константа nil рассматривается им как тип Pointer, а такой версии нет.

Вот еще интересный случай из жизни overload:


 
McSimm ©   (2002-07-10 14:03) [16]

procedure AAA(d: double); overload;
procedure AAA(v: variant); overload;
...
Вызов AAA(1.2) - может оказаться неожиданным, так как произойдет вызов AAA(v: variant);


 
Eugene Lachinov ©   (2002-07-10 14:12) [17]

>McSimm
значит все-таки ошибка компилятора

AAA(1.2) - 1.2 как ни странно Currency


 
McSimm ©   (2002-07-10 14:24) [18]

>значит все-таки ошибка компилятора
Нет никакой ошибки.

При поиске overload версии, компилятор :
- анализирует типы параметров.
- Если нет точного соответстви производит попытку преобразования типов
- Если преобразование невозможно - выдается ошибка об отсутствии подходящей версии функции

В твоем случае константа nil определяется как тип Pointer. Преобразования Pointer - TKeyEvent невозможно, поэтому последний случай.

В приведенном мною примере константа 1.2 имеет тип Extended. Срабатывает попытка преобразования типов. Тип Double меньше Extended. Тип Variant подходит лучше. Поэтому компилятор выбирает эту функцию


 
Eugene Lachinov ©   (2002-07-10 14:38) [19]

>McSimm
все было бы так, если бы не KeyDown : TKeyEvent = nil

насчет Currency это из отладки _VarFromCurr

Нас сейчас перенут в Потрепаться :)


 
McSimm ©   (2002-07-10 14:42) [20]

> все было бы так, если бы не KeyDown : TKeyEvent = nil

Все так и есть.

В твоем случае с толку сбивает что и переменным Pointer и TKeyEvent обоим можно присваивать nil
На самом деле это совсем разные присваивания.


 
Eugene Lachinov ©   (2002-07-10 14:45) [21]

Спасибо Всем


 
Игорь Шевченко ©   (2002-07-10 14:48) [22]

В дополнение:

Присвоение nil типу Pointer вызывает обнуление 4х байт, присвоение типу TKeyEvent (или любому TMethod) вызывает обнуление 8-ми байт :-)



Страницы: 1 вся ветка

Текущий архив: 2002.07.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
14-70892
Praco
2002-06-24 12:12
2002.07.22
Как назвать дочку? Молодые папы и мамы, помогите :- )


1-70722
Ivan61
2002-07-10 23:46
2002.07.22
Калькулятор!?


3-70644
NNH
2002-07-01 19:19
2002.07.22
Как считать String из Memo до символа # ?


1-70739
antoniz
2002-07-09 15:02
2002.07.22
Как узнать высоту панели задач Windows


6-70852
GatesBill
2002-05-12 15:55
2002.07.22
как передать параметры исполняемому файлу