程序在未被调用的情况下触发

时间:2014-09-29 07:47:45

标签: delphi procedure execution

在delphi中,是否有可能在没有被调用的情况下触发过程?

我有两个完全不同的程序。首先是点击弹出菜单。第二个是我定义为分割字符串的函数。

我不会在点击弹出式菜单中调用我的分割方法,但无论如何它都会触发,我无法找到原因。调试器只是说他无法阅读地址00000001,但我甚至不想让他阅读,因为我不会在任何弹出选项中调用此程序。有没有人知道为什么它可以自己发射?

如果你愿意,我可以编辑代码,但是idk它会很有用,因为两个程序都没有联系x)

CODE

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

1 个答案:

答案 0 :(得分:2)

  

在delphi中,是否有可能在没有被调用的情况下触发过程?

一般来说,这是不可能的。如果代码执行,系统中的某些东西使它执行。

但是,您可能会以某种方式损坏内存。这反过来可能会导致您调用一个函数,并导致调用不同的函数。

为了调试这个,我建议你首先检查意外函数开始执行时的调用堆栈。这应该告诉你执行是如何达到这一点的。如果这还不足以解释事情,请将代码缩减到产生问题的最低限度。当有很多代码时,很难找到问题。通过减少到最低限度,您可以更容易地看到出错的地方。