![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток. Помогите кто чем может. Ситуация такая. Поставил самописные компоненты на Delphi 6. Настроил пути к библиотекам, тоже самописные.
На этих компонентах и библиотеках написано около 5ти проектов. И только один из этих проектов не получается откомпилировать из-за возникновения ошибки: Ambiguous overloaded call to ... "iif" Описание "iif": Код:
Function iif(cond:Boolean;vt,vf:String):String;overload; Function iif(cond:Boolean;vt,vf:Integer):Integer;overload; Function iif(cond:Boolean;vt,vf:String):String;overload; Begin if cond then Result := vt else Result := vf; End; //--------------------------------------------------------------------------- Function iif(cond:Boolean;vt,vf:Integer):Integer;overload; Begin if cond then Result := vt else Result := vf; End; Здесь возник какой то не понятный глюк. который не хочет воспринимать перегрузку методов. Может там какие то специфические настройки надо сделать, подскажите пожалуйста Последний раз редактировалось lmikle, 06.03.2013 в 05:10. |
|
#2
|
|||
|
|||
|
Попробуй убрать 'overload' в реализации.
|
|
#3
|
|||
|
|||
|
Цитата:
((( Пишет:Previous declaration of "iif" was not marked with the overload directive |
|
#4
|
||||
|
||||
|
Обычно вызов из библиотеки идёт с директивой stdcall;
|
|
#5
|
|||
|
|||
|
Цитата:
Братан, у меня с Делфи проблемы! Спасибо за попытку |
|
#6
|
||||
|
||||
|
Тебе принципиально оверлоад нужен?
Опять блин не указали версию дельфи, в ХЕ и выше то что ты реализовать пытаешься - уже р5ализовано. Модуль math, ф-я ifthen. Последний раз редактировалось M.A.D.M.A.N., 05.03.2013 в 22:54. |
|
#7
|
||||
|
||||
|
А вызывается как?
|
|
#8
|
|||
|
|||
|
У меня Делфи 6 установлен, в начале темы писал.
Overload нужен, т.к. в проекте куча таких перегружаемых процедур и функций. Пробовал порядок параметров менять. Исправляю одну. Начинает ругаться на следующую перегружаемую проц/функц: Код:
Procedure Wait(msg:String);overload; Procedure Wait;overload; procedure Err(Const Msg:String;Const Cap:String='');overload; procedure Err(Const cond:boolean;Const msg:String;Const cap:String = '');overload; procedure Err(Const cond:boolean;Const Obj:TWinControl;Const msg:String;Const cap:String = '');overload; procedure Err(Const obj:TWinControl;Const msg:String;Const cap:String = '');overload; Интересно то, что другие проекты, которые исп. эту самописную библиотеку нормально компилируются. А именно этот проект не хочет её воспринимать какой она есть. Может это какой-то глюк? Или у проекта какие-то настройки заточены под др.ОС или компьютер? Один из вызовов: Код:
procedure TFormSicReg.bOkClick(Sender: TObject);
Var vBrId,vLN,vFN,vMN,vIIN:String; vTrans,vReb,vIno,vDub,vNameNull:Integer;
begin
// Проверки
Err((Not cbSex1.Checked) and (Not cbSex0.Checked), cbSex1, 'Выберите пол муж/жен' );
eBP.Ok;
eAddr.Ok;
Err((Not cbArea1.Checked) and (Not cbArea0.Checked), cbArea1, 'Выберите местность город/село' );
ePhone.Ok;
//
if eBrId.Visible and eBrId.CanFocus then vBrId := eBrId.AsString else vBrId := prg.BrId;
vLN := U2K(e_RLN.Text);
vFN := U2K(e_RFN.Text);
vMN := U2K(e_RMN.Text);
Trace( 'LN = "' +ReplKZChar2(vLN)+'"' );
Trace( 'FN = "' +ReplKZChar2(vFN)+'"' );
Trace( 'MN = "' +ReplKZChar2(vMN)+'"' );
vIIN := '';
vDub := iif(cbDub.Visible and cbDub.Enabled and cbDub.Checked,1,0);
vNameNull := iif(cbNameNull.Visible and cbNameNull.Enabled and cbNameNull.Checked,1,0);
vTrans := 0; // транзитный СИК
vReb := 0; // несовершеннолетний
vIno := 0; // иностранец
case FRegim of
cARegTra: vTrans := 1; // транзитный с
cARegReb: vReb := 1; // Несовершенолетн
cARegIno: vIno := 1; // Иностр
end;
try
if Not FIsEdit then begin // регистрация
FSicId := StrToInt(App.FunA('sik.Pers.Ins_Sic',[vTrans,vReb,vIno,vDub,vNameNull,vBrId,vLN,vFN,vMN,e_RBD.AsDate,iif(cbSex1.Checked,1,0),
{cbDoc.Field('rfdt_id').AsString}'', eDocDate.AsDate, eDocSer.AsString, eDocNum.AsString, eDocPlace.AsString,
eBP.AsString,eAddr.AsString,iif(cbArea1.Checked,1,0),ePhone.AsString,vIIN,
'','']));
Mes('Регистрация выполнена'#13#10+IntToStr(FSicId));
end else begin
IfRaise(FSicId=0,'Не определен идентификатор');
App.PrcA('sik.Pers.Upd_Sic',[vTrans,vReb,vIno,vDub,vNameNull,
FSicId,{vBrId,}iif(cbSex1.Checked,1,0),'',eDocDate.AsDate,eDocSer.AsString,eDocNum.AsString,eDocPlace.AsString,
eBP.AsString,eAddr.AsString,iif(cbArea1.Checked,1,0),ePhone.AsString,vIIN,'','']);
Mes('Редактирование выполнено'#13#10+IntToStr(FSicId));
end;
finally
end;
//
Close; // закрываем окно
//
end;MAD: учимся пользоваться тегами! Последний раз редактировалось M.A.D.M.A.N., 06.03.2013 в 09:16. |
|
#9
|
||||
|
||||
|
Мой пост видел?
Такой функционал уже реализован в дельфи, ф-я ifthen. |
|
#10
|
|||
|
|||
|
Цитата:
Да я понимаю что функционал реализован. Но у меня проблема в другом. Почему он не хочет воспринимать перегружаемые методы? Просто помимо "iif" есть и другие процедуры и функции, на которые он ругается. Пробовал менять местами параметры, там он успокаивался...но потом на другие перегрузки переключался. |
|
#11
|
|||
|
|||
|
Проблема может быть в том, что такая функция описана в разных модулях.
В одном она без overload. Или в разных модулях с одинаковой сигнатурой. А этот код Код:
Procedure Wait(msg:String);overload; Procedure Wait;overload; |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
MaessstRo (07.03.2013)
| ||
|
#12
|
||||
|
||||
|
все честно:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Function iif(cond:Boolean;vt,vf:String):String; overload;
Function iif(cond:Boolean;vt,vf:Integer):Integer; overload;
implementation
{$R *.dfm}
Function iif(cond:Boolean;vt,vf:String):String;
Begin
if cond then Result := vt else Result := vf;
End;
Function iif(cond:Boolean;vt,vf:Integer):Integer;
Begin
if cond then Result := vt else Result := vf;
End;
end. |
|
#13
|
|||
|
|||
|
Цитата:
Всё как полагается, как в американском фильме )) |
|
#14
|
|||
|
|||
|
Спасибо господа за соучастие. Причину ошибки я нашел. Оказалось что один модуль использовал две библиотеки в которых есть проц/функц - близнецы так сказать... Решил проблему таким образом, так как происходит "Неоднозначное обращение", то я перед каждой ошибочной строкой указывал библиотеку к которой компилятору надо обращаться.
Код:
try
if Not FIsEdit then begin // регистрация
FSicId := StrToInt(App.FunA('sik.Pers.Ins_Sic',[vTrans,vReb,vIno,vDub,vNameNull,vBrId,vLN,vFN,vMN,e_RBD.AsDate,TTls.iif(cbSex1.Checked,1,0),
{cbDoc.Field('rfdt_id').AsString}'', eDocDate.AsDate, eDocSer.AsString, eDocNum.AsString, eDocPlace.AsString,
eBP.AsString,eAddr.AsString,TTls.iif(cbArea1.Checked,1,0),ePhone.AsString,vIIN,
'','']));
Mes('Регистрация выполнена'#13#10+IntToStr(FSicId));
end else begin
IfRaise(FSicId=0,'Не определен идентификатор');
App.PrcA('sik.Pers.Upd_Sic',[vTrans,vReb,vIno,vDub,vNameNull,
FSicId,{vBrId,}iif(cbSex1.Checked,1,0),'',eDocDate.AsDate,eDocSer.AsString,eDocNum.AsString,eDocPlace.AsString,
eBP.AsString,eAddr.AsString,iif(cbArea1.Checked,1,0),ePhone.AsString,vIIN,'','']);
Mes('Редактирование выполнено'#13#10+IntToStr(FSicId));
end; |
|
#15
|
|||
|
|||
|
Цитата:
Благодарю за наводящий вопрос. |