在delphi中,是否有可能在没有被调用的情况下触发过程?
我有两个完全不同的程序。首先是点击弹出菜单。第二个是我定义为分割字符串的函数。
我不会在点击弹出式菜单中调用我的分割方法,但无论如何它都会触发,我无法找到原因。调试器只是说他无法阅读地址00000001,但我甚至不想让他阅读,因为我不会在任何弹出选项中调用此程序。有没有人知道为什么它可以自己发射?
如果你愿意,我可以编辑代码,但是idk它会很有用,因为两个程序都没有联系x)
procedure TBDDTool.pmDeleteColumnClick(Sender: TObject);
var
i: integer;
sListColNames : string;
begin
fileModified := true;
sListColNames := '';
//Increment undo number
Inc(undoNum);
if undoNum = 11 then
begin
for i := 0 to Length(UndoArray) - 1 do
begin
if i < Length(UndoArray)-1 then
UndoArray[i] := UndoArray[i+1];
end;
undoNum := UndoNum -1;
end;
//Add action to the array of undo actions
undoArray[undoNum] := 'Deleted column:' + IntToStr(sgFilePreview.Col)
+'$'+aSourceData[0,sgFilePreview.Col] + '#deleted';
pmUndo.Enabled := true;
if (Pos('#primarykeypk', aSourceData[0, sgFilePreview.Col]) <> 0) then
begin
aSourceData[0,sgFilePreview.Col] := COPY(aSourceData[0,sgFilePreview.Col], 0, Pos('#primarykey', aSourceData[0, sgFilePreview.Col])-1);
pmPrimaryKey.Enabled := true;
end;
if (Pos('#', aSourceData[0, sgFilePreview.Col]) <> 0) then
aSourceData[0,sgFilePreview.Col] := COPY(aSourceData[0,sgFilePreview.Col], 0, Pos('#', aSourceData[0, sgFilePreview.Col])-1);
for i := 0 to Length(aSourceData[0])-1 do
begin
if aSourceData[0,i] = sgFilePreview.Cells[sgFilePreview.Col, 0] then
begin
aSourceData[0,i] := aSourceData[0,i] + '#deleted';
Break;
end;
end;
//just set col width to 0 to hide it but we need the index
sgFilePreview.ColWidths[sgFilePreview.Col] := 0;
end;
//Custom split method
function TBDDTool.Explode(const Separator, s: String;
Limit: Integer): TStringDynArray;
var
SepLen: Integer;
F, P: PChar;
ALen, Index: Integer;
begin
SetLength(Result,0);
//if the word passed is empty there's no need to continue
if (S = '') or (Limit < 0) then Exit;
if Separator = '' then
begin
SetLength(Result, 1);
Result[0] := S;
Exit;
end;
//Set to the length of the separator
SepLen := Length(Separator);
ALen := Limit;
SetLength(Result, ALen);
Index := 0;
P := PChar(s);
While P^ <> #0 do
begin
F := P;
P := AnsiStrPos(P,PChar(Separator));
if (P = nil) OR ((Limit > 0) AND (Index = Limit -1)) then P := StrEnd(F);
if Index >= ALen then
begin
Inc(ALen,5);
SetLength(Result, ALen);
end;
SetString(Result[Index], F, P-F);
INC(Index);
if p^ <> #0 then Inc(P,SepLen);
end;
if index < ALen then SetLength(Result, Index);
end;
当我单击delet选项(从弹出菜单中)时,将调用explode函数。但我不会在删除过程中调用爆炸功能。中断发生在while P^ <> #0
行
答案 0 :(得分:2)
在delphi中,是否有可能在没有被调用的情况下触发过程?
一般来说,这是不可能的。如果代码执行,系统中的某些东西使它执行。
但是,您可能会以某种方式损坏内存。这反过来可能会导致您调用一个函数,并导致调用不同的函数。
为了调试这个,我建议你首先检查意外函数开始执行时的调用堆栈。这应该告诉你执行是如何达到这一点的。如果这还不足以解释事情,请将代码缩减到产生问题的最低限度。当有很多代码时,很难找到问题。通过减少到最低限度,您可以更容易地看到出错的地方。