2014-09-29 3 views
-2

델파이에서 프로 시저가 호출되지 않고 실행되는 것이 가능합니까?절차가 호출되지 않고 실행됩니다.

두 가지 완전히 다른 절차가 있습니다. 첫 번째는 팝업 메뉴를 클릭하는 것입니다. 두 번째는 문자열을 분리하기 위해 정의한 함수입니다.

그리고 팝업 메뉴를 클릭 할 때 내 분할 방법을 호출하지는 않지만 어쨌든 발생하며 이유를 찾을 수 없습니다. 디버거는 단지 그가 00000001 주소를 읽을 수 없다고하지만 나는 그에게 나의 팝업 옵션 중 하나에서이 프로 시저를 호출하지 않기 때문에 그를 읽으 려하지 않는다고 말한다. 누구든지 왜 스스로 발사 할 수 있는지에 대해 알고 있습니까?

나는 당신이 원하는 경우 코드를 편집하지만 두 절차는 X를 연결이 arent으로 내가 팝업에서 (옵션을 delet 클릭하면이

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; 

폭발 함수가 호출 될 때) 유용 할 것이다 나도 몰라 수 있습니다 메뉴). 하지만 내 삭제 절차에서 폭발 기능을 호출하지 않습니다. 중단이 발생합니다 while P^ <> #0 line

+1

불가능합니다. 그리고 그것은 코드없이 당신을 도울 수 없습니다 .... – bummi

+0

거기, 나는 버그를 만드는 코드를 게시했습니다. 삭제 옵션은 alsmot 모든 케이스에서 잘 작동합니다. 하지만 때때로 Explode 함수를 발생시키지 않습니다. 심지어 내 deleteClick 옵션에서도 호출하지 않습니다. – user28470

+0

버그가 P^<> # 0에 발생했습니다. – user28470

답변

2

델파이에서는 프로 시저가 호출되지 않고 실행될 수 있습니까?

일반적으로 말해서 불가능합니다. 코드가 실행되면 시스템에서 무언가가 실행됩니다.

그러나 메모리가 손상된 것일 수 있습니다. 그 결과로 하나의 기능과 부패가 호출되어 다른 기능이 호출 될 수 있습니다.

이 디버깅하려면 먼저 예기치 않은 함수가 실행될 때 호출 스택을 검사하는 것이 좋습니다. 실행이 어떻게 그 시점에 도달했는지 알려 주어야합니다. 이것이 사물을 설명하기에 충분하지 않다면 문제를 일으키는 최소한의 코드로 줄이십시오. 많은 코드가있을 때 문제를 찾는 것이 더 어렵습니다. 최소한으로 줄이면 무엇이 잘못되었는지 쉽게 알 수 있습니다.

+0

' kernel32.RaiseExcepetion + 0x52' 인터넷에서 어셈블리가 누락되었음을 의미합니까? 그리고 델파이를 열지 못했습니다. 뭔가로드 할 수 없다고합니다. 그럴 수 있니? delete 메서드는 전반적으로 잘 작동합니다. 특정 열을 삭제할 때이'explode' 함수가 실행됩니다 :/ – user28470

+0

델파이를 열 때 IDE 패키지를로드 할 수 없다고 말합니다. 이것은 kernel32.RaisException과 공통점이 있습니까? '예외? – user28470

+0

'kernel32.RaiseExcepetion'는 어셈블리가 누락되었음을 의미하지 않으며 예외를 발생시키는 데 사용되는 시스템 함수입니다. 예외를 울리십시오. 당신이해야 할 일은 제가 제 대답에 묘사 한 것입니다. –

관련 문제