OK, I will do the things you have suggested, much appreciated.
Chris
Christopher Crowe (Software Developer)
Microsoft MVP, MCP
Adrock Software
Byte Computer & Software LTD
P.O Box 13-155
Christchurch
New Zealand
Phone/Fax (NZ) 03-3651-112
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]On Behalf Of
> Myles Penlington
> Sent: Thursday, 27 May 1999 08:27
> To: '[EMAIL PROTECTED]'
> Subject: RE: [DUG]: Very Intermitent Access Violations during
> Notification message.
>
>
> Notification is called during the destructor - see TComponent.Destroy.
> You should check for nil, and in your destructor after a .Free
> assign nil to the local object variable if it is being referenced
> in Notification.
>
> Myles.
>
>
> -----Original Message-----
> From: Chris Crowe [SMTP:[EMAIL PROTECTED]]
> Sent: Thursday, May 27, 1999 8:02 AM
> To: Multiple recipients of list Delphi
> Subject: [DUG]: Very Intermitent Access Violations during
> Notification message.
>
> HI,
> I have a set of controls which just allow you to add a label to
> the main edit control by using a class I wrote called
> TAdrockWhenFocused. When the control gets the input focus, it
> changes the background color of itself, and it sets the label's
> font to bold (by Default). Very simple.
>
> I have an install of an application which is on a large number of
> computers, but on a couple of computers which I have never seen,
> when the application is terminated it stops with an access violation.
>
> I am told it does it all the time on these two computers.
>
> The message from the AV states this:
>
> Exception EAccessViolation in module CALLCENTRAL.EXE at 0016751b.
> Access Violation at address 0056751b in module 'CALLCENTRAL.EXE'.
> Read of address 00f40010
>
> Now I used the Delphi Debugger to goto 0056751b and I get this in
> the CPU window (I wish you could copy and paste from there)
>
> push ebx
> push esi
> push edi
> mov ebx, ecx
> mov esi, edx
> mov edi, eax
> mov ecx, ebx
> mov edx, esi
> mov eax, edi
>
> Call TControl.Notification
> bmp bl,$01
> jnz TAdrockCustomCheckBox.Notification + $3d
>
> mov eax, [edi+$00000204]
> cmp dword ptr [eax+$28],$00 <------- Point of AV
> jz TAdrockCustomCheckBox.Notification + $3d
>
> mov eax, [edi+$00000204]
> cmp esi, [eax+$28]
> jnz TAdrockCustomCheckBox.Notification + $3d
>
> xor edx, edx
> mov eax, [edi+$00000204]
> Call TAdrockWhenFocused.SetFocusLabel
>
> pop edi
> pop esi
> pop ebx
> ret
>
> Which is the assembler for the code below.
>
> procedure TAdrockCustomCheckBox.Notification(AComponent:
> TComponent; Operation: TOperation);
> begin
> inherited Notification(AComponent, Operation);
> if (Operation = opRemove) and (WhenFocused.FocusLabel <> nil) and
> (AComponent = WhenFocused.FocusLabel) then
> WhenFocused.FocusLabel := nil;
> end;
>
> Can anyone see where this problem might arise from?. I am
> thinking maybe the WhenFocused class is nil at the point when the
> WhenFocused.FocusLabel code is being checked, as it looks to be
> there from the ASM above.
>
> Does the Notification code get called duration a destructor?, if
> so that could point to the fact that the WhenFocused is nil, and
> cause an AV. But if that was the case, you would expect it to be
> causing AV's all the time.
>
> The WhenFocused class is actually configured as a property in the
> particular edit control, so it is declared as
>
> fWhenFocused : TAdrockWhenFocused
>
> Property WhenFocused : TAdrockWhenFocused
> Read fWhenFocused
> Write fWhenFocused;
>
> Constructor TAdrockCustomCheckBox.Create(Aowner : TComponent);
> begin
> Inherited Create(AOwner);
> {$ifdef WIN32}
> ControlStyle := ControlStyle + [csReplicatable];
> {$endif}
> fWhenFocused := TAdrockWhenFocused.Create(Self);
> Width := 133;
> end;
>
> Destructor TAdrockCustomCheckBox.Destroy;
> begin
> fWhenFocused.Free;
> Inherited Destroy;
> end;
>
> So maybe I need to change the code to this, which checks for the
> WhenFocused class being nil.
>
> procedure TAdrockCustomCheckBox.Notification(AComponent:
> TComponent; Operation: TOperation);
> begin
> inherited Notification(AComponent, Operation);
> if (Operation = opRemove) and (WhenFocused <> nil) and
> (WhenFocused.FocusLabel <> nil) and
> (AComponent = WhenFocused.FocusLabel) then
> WhenFocused.FocusLabel := nil;
> end;
>
> Should I change the destroy class to force the label to be NIL,
> when the WhenFocused class is being freed?
>
> Destructor TAdrockCustomCheckBox.Destroy;
> begin
> fWhenFocused.FocusLabel := NIL; { Do I need to do this? }
> fWhenFocused.Free;
> Inherited Destroy;
> end;
>
> This problem with the TAdrockCustomCheckBox has never come up for me
winmail.dat