我的Delphi6出现一个怪现象:编译错误提示条不是出现在真正出错的地方!哪位给个理由?(100分)

  • 主题发起人 主题发起人 GipsyCN
  • 开始时间 开始时间
G

GipsyCN

Unregistered / Unconfirmed
GUEST, unregistred user!
重新安装Delphi不行,用Pack1升级也不行,很是奇怪???
 
你的代码肯定是有两个相同的PAS文件,而你打开的那个是过时的文件,我也见到过这种情况,
你再找一找,是否有同名的文件?
 
有些地址的錯誤就是這樣的,通常會跳到程序的最後!!!
 
hpretty说的没错,我也见过。
 
如果你没有把DEBUG路径(默认仅仅查当前PROJECT里的)加上你使用到的其他UNIT路径,
这时如果是那些UNIT里有地方出现问题了,DELPHI是直接跳到最后,而没到那具体UNIT中
 
感谢各位的热心!
我一般把所有.pas放在一个路径下,每天下班前做一次备份,而备份前是先把.dsk删除的。
备份的路径是在另一个分区上,所有不会编译象hpretty朋友所说的"过时的文件"。
我调试出是因为下面的函数有问题,可我实在不知道什么原因。

function TfmDataBackup.BackupATab(const asDstDBName, asTabName: string;
abIsCoverOld, abIsTableExist: Boolean; const aiRecCnt: Integer): Boolean;
var
sFullDstTabName, sFullTabName, sTabKey, sSQL, sFields, sFieldsWithAlias: string;
i: Integer;
ssFields, ssSQLs: TStrings;
bHasIndentity: Boolean;
begin
//下例为表employees的 startdate 列解除规则绑定。EXEC sp_unbindrule 'employees.startdate'
//Get fields string like: string1,string2,string3...
sFields := '';
ssFields := TStringList.Create;
try
ssFields.Clear;
dmDTMMain.ADOConnSQLSVR.GetFieldNames(asTabName, ssFields);
for i := 0 to ssFields.Count - 1 do
begin
sFields := sFields + ssFields + ',';
sFieldsWithAlias := sFieldsWithAlias + 'B.' + ssFields + ',';
end;
Delete(sFields, Length(sFields), 1);
Delete(sFieldsWithAlias, Length(sFieldsWithAlias), 1);
finally
ssFields.Free;
end;

sTabKey := dmDTMMain.GetTablePrimaryKey(asTabName);
sFullTabName := dmDTMMain.ADOConnSQLSVR.DefaultDatabase + '.DBO.' + asTabName;
sFullDstTabName := asDstDBName + '.DBO.' + asTabName;
bHasIndentity := dmDTMMain.TableHasIdentity(sFullTabName);

ssSQLs := TStringList.Create;
try
if sTabKey <> '' then
begin
if abIsTableExist then
begin
if bHasIndentity then
ssSQLs.Add(Format('SET IDENTITY_INSERT %S ON', [sFullDstTabName]));

if abIsCoverOld then
begin
if aiRecCnt = 0 then
begin
//DELETE GPS_GIS.DBO.S_FUNCList WHERE GPS_GIS.DBO.S_FUNCList.FuncID IN (SELECT FuncID FROM AAA.DBO.new_table
sSQL := Format('DELETE %S WHERE %S.%S IN (SELECT %S FROM %S)',[sFullTabName, sFullTabName, sTabKey, sTabKey, asDstDBName + '.DBO.' + asTabName]);
ssSQLs.Add(sSQL);
sSQL := Format('INSERT %S(%S) SELECT DISTINCT %S FROM %S A, %S B',[sFullDstTabName,sFields,sFieldsWithAlias,sFullDstTabName,sFullTabName]);
ssSQLs.Add(sSQL);
end else
begin
sSQL := Format('DELETE %S WHERE %S.%S IN (SELECT TOP %D %S FROM %S)',[sFullTabName, sFullTabName, sTabKey, aiRecCnt, sTabKey, sFullDstTabName]);
ssSQLs.Add(sSQL);
sSQL := Format('INSERT %S(%S) SELECT DISTINCT TOP %D %S FROM %S A, %S B',[sFullDstTabName,sFields,aiRecCnt,sFieldsWithAlias,sFullDstTabName,sFullTabName]);
ssSQLs.Add(sSQL);
end;
{ INSERT AAA.DBO.new_table(FuncID, FuncName, FormName, Tag) SELECT DISTINCT B.FuncID, B.FuncName, B.FormName, B.Tag
FROM AAA.DBO.new_table A, GPS_GIS.DBO.S_FUNCList B WHERE B.FuncID NOT IN (SELECT FuncID FROM AAA.DBO.new_table)}
end else //if abIsCoverOld then
begin
if aiRecCnt = 0 then
sSQL := Format( 'INSERT %S(%S) SELECT DISTINCT %S FROM %S A, %S B WHERE B.%S NOT IN(SELECT %S FROM %S)',[sFullDstTabName,sFields,sFieldsWithAlias,sFullDstTabName,sFullTabName,sTabKey,sTabKey,sFullDstTabName])
else
sSQL := Format( 'INSERT %S(%S) SELECT DISTINCT TOP %D %S FROM %S A, %S B WHERE B.%S NOT IN(SELECT %S FROM %S)',[sFullDstTabName,sFields,aiRecCnt,sFieldsWithAlias,sFullDstTabName,sFullTabName,sTabKey,sTabKey,sFullDstTabName]);

ssSQLs.Add(sSQL);
end;

if bHasIndentity then
ssSQLs.Add(Format('SET IDENTITY_INSERT %S OFF', [sFullDstTabName]));

end else //if abIsExist then...
begin
if aiRecCnt = 0 then
sSQL := Format('SELECT * INTO %S FROM %S WHERE 1<>2', [sFullDstTabName,sFullTabName])
else
sSQL := Format('SELECT TOP %D * INTO %S FROM %S WHERE 1<>2', [aiRecCnt,sFullDstTabName,sFullTabName]);

ssSQLs.Add(sSQL);
end;
end else //如果表没有主键...
begin
if abIsTableExist then
begin
if aiRecCnt = 0 then
begin
sSQL := Format( 'INSERT %S(%S) SELECT DISTINCT %S FROM %S A, %S B',
[sFullDstTabName,sFields,sFieldsWithAlias,sFullDstTabName,sFullTabName])
end else
sSQL := Format( 'INSERT %S(%S) SELECT DISTINCT TOP %D %S FROM %S A, %S B',
[sFullDstTabName,sFields,aiRecCnt,sFieldsWithAlias,sFullDstTabName,sFullTabName]);
end else
begin
if aiRecCnt = 0 then
begin
sSQL := Format('SELECT * INTO %S FROM %S WHERE 1=2', [sFullDstTabName,sFullTabName])
end else
sSQL := Format('SELECT TOP %D * INTO %S FROM %S WHERE 1=2', [aiRecCnt,sFullDstTabName,sFullTabName]);
end;
ssSQLs.Add(sSQL);
end;
Result := dmDTMMain.ExecBatSQL(ssSQLs);
finally
ssSQLs.Free;
end;
end;
 
P.S:
上面的代码执行无误!运行结果和我想的一样。只是这个怪现象不知怎么解决。
如果在再在这个.pas中增加函数或者控件事件,我必须把这个函数体放在当前.pas单元
的最后,否则,很难调试新加的代码。
 
我原先使用的操作系统是win2000 Prefession版,安装Win2000 Server版后再重新安装Delphi
还是出现这个问题,不知道是不是我用的Delphi有问题。
 
GipsyCN:
delphi采用的是全编译手段,你看到的代码和实际执行的代码有一些差别。delphi的错误
都是跟踪到底层。所以在编译中饱错误的地方,一般不都不在实际的错误代码行。
 
同意jinzuo007。

这两天又做了个新程序,Delphi又出现这种情况。很是奇怪。
从D1用到D6,还是第一次遇到这种怪现象,不知怎么回事?
 
这样的情况我也见过,明明是下一行或是上一行出错,代码出错的反显总是与它错一行,不
知是怎么回事,以前好像没有这样的情况,我想大概是装了一些第三方控件所致吧。
 
终于有类似遭遇的朋友了,这个帖子放了好久了。
我的不单单是错过一行,是很多行,调试程序特别不方便。
我现在的做法是把那段代码放在最后。每次增加代码时,都要往后移那段代码,很不方便。

不会是第三方控件的问题。除非万不得已,我不用第三方控件。
所以我的Delphi很“干净”。
 
一般来说这种时候你Build All试试!可能是没有重新编译新改的源文件造成的!
 
同意hpretty 和 aizb 两位大哥的看法。
 
出现这样的情况有三种可能 //我认为
IF 你忘记了把该单元.PAS加入到路径或者工程 THEN
加入工程
IF 你不相信 THEN
TRY
DELETE .DCU
REBUILD
EXCEPT
原来少了文件,这个文件应该在其中.
END;
END
ELSE IF USE PROJECT GROUP THEN
ASSERT(你一定是用到了PROJECT GROUP) //我认为
ASSERT(你一定在两个PROJECT里都使用了相同的单元) //我假定
ASSERT(并且两个PROJECT引用同一单元但是有IFDEFINE之类的条件编译或者PROJECT设置不一样) //想象
ASSERT(这样两个PROJECT BUILD出来的DCU应该是不同的,DEBUG INFO也不相同)
这样,你要么不REBUILD ALL,只BUILD你想调试的单个程序
ELSE IF USE DLL THEN
你使用了DLL,并且DLL和EXE使用了同样的单元
也许你使用的单元的条件编译条件或者PROJECT的编译选项不同
你最好不要这样做,除非你不想调试这段代码,这样DELPHI不知道该如何对照符号信息
ELSE
SEND THE SOURCE CODE IN DFW OR SEND MAIL TO ME
END
 
感谢各位的参与。
wenyue朋友,我拜读了您回复的所有问题,很敬佩您对软件技术的参悟。
这个问题已经困扰了我很久。我打算把我的源代码发给你,
不知道能否告知我您的邮箱?如果在这里不方便的话,可以把邮箱地址发到month18@163.net。
或者通过OICQ29216300和我联系,工作时间我一般隐身在线。感谢!
 
在wenyue朋友的帮助下,问题终于得以解决,非常感谢wenyue朋友,
同时也感谢各位的参与。
原因如下:
Delphi中编辑器的行按照0D分,而编译器的行按照0D0A分,
在我的程序中有一行只有0D没有0A,但是在DELPHI编辑器里看不出来,所以会导致这种情况。
我估计那一行中的“乱码”是我把SQL语句放到MS SQL查询分析器中调试后拷贝过来时带来的。
希望大家引以为戒。

同时wenyue朋友还提出:
这个BUG其实可以POST给BORLAND
1,//没理会后面的0D
2,编辑器的行按照0D分,而编译器的行按照0D0A分
 
后退
顶部