델파이에서 프로 시저가 호출되지 않고 실행되는 것이 가능합니까?절차가 호출되지 않고 실행됩니다.
두 가지 완전히 다른 절차가 있습니다. 첫 번째는 팝업 메뉴를 클릭하는 것입니다. 두 번째는 문자열을 분리하기 위해 정의한 함수입니다.
그리고 팝업 메뉴를 클릭 할 때 내 분할 방법을 호출하지는 않지만 어쨌든 발생하며 이유를 찾을 수 없습니다. 디버거는 단지 그가 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
불가능합니다. 그리고 그것은 코드없이 당신을 도울 수 없습니다 .... – bummi
거기, 나는 버그를 만드는 코드를 게시했습니다. 삭제 옵션은 alsmot 모든 케이스에서 잘 작동합니다. 하지만 때때로 Explode 함수를 발생시키지 않습니다. 심지어 내 deleteClick 옵션에서도 호출하지 않습니다. – user28470
버그가 P^<> # 0에 발생했습니다. – user28470