Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
3-70667
Oleon
2002-06-28 12:49
2002.07.22
Как програмно обработать ошибку.


1-70727
Helen
2002-07-11 16:19
2002.07.22
Содание текстового файла с расширением отличным от *.txt


1-70726
avr555
2002-07-10 20:47
2002.07.22
Поиск и замена в Word е


14-70904
shagen
2002-06-25 10:02
2002.07.22
ИскИн


1-70749
Turalyon
2002-07-09 14:08
2002.07.22
Делаем CGI приложение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский