Newsgroup: it.comp.lang.delphi
Titolo: Range Check Error

Ciao a tutto il NG.
Ho un problema del C....
Ho in corso lo sviluppo di un'applicazione che ha come finestra Madre 
una finestra di tipo MDI. Volendo disegare su tale finestra ho riportato
nel sorgente il seguente codice (preciso che tale codice funziona, 
anche perchè è stato scritto da un MegaEsperto in Delphi):
type
  TMainForm = class(TForm)
   .
   .
    Image1: TImage;
   .
   .
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    Count: Integer;
    OutCanvas: TCanvas;
    OldWinProc, NewWinProc: Pointer;
    procedure NewWinProcedure (var Msg: TMessage);
  public
    { Public declarations }
  end;
   .
   .  
   .
   .
procedure TMainForm.FormCreate(Sender: TObject);
begin
  NewWinProc := MakeObjectInstance (NewWinProcedure);
  OldWinProc := Pointer (SetWindowLong (
    ClientHandle, gwl_WndProc, Cardinal (NewWinProc)));
  OutCanvas := TCanvas.Create;
end;
procedure TMainForm.NewWinProcedure (var Msg: TMessage);
var
  BmpWidth, BmpHeight: Integer;
  I, J: Integer;
begin
  // default processing first
  Msg.Result := CallWindowProc (OldWinProc,
    ClientHandle, Msg.Msg, Msg.wParam, Msg.lParam);
  // handle background repaint
  if Msg.Msg = wm_EraseBkgnd then
  begin
    BmpWidth := MainForm.Image1.Width;
    BmpHeight := MainForm.Image1.Height;
    if (BmpWidth <> 0) and (BmpHeight <> 0) then
    begin
      OutCanvas.Handle := Msg.wParam;
      for I := 0 to MainForm.ClientWidth div BmpWidth do
        for J := 0 to MainForm.ClientHeight div BmpHeight do
          OutCanvas.Draw (I * BmpWidth,
            J * BmpHeight, MainForm.Image1.Picture.Graphic);
    end;
  end;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
  OutCanvas.Free;
end;
Problema:
  Quando avvio l'applicazione più e più volte, ad un certo punto in una 
parte qualsiasi di tale applicazione viene generato questo "benedetto" 
Range Check Error. E mi trovo costretto a riavviare il sistema.
Ho letto la guida e parla di un'assegnazione di un valore ad una 
variabile intera. L'errore viene generato quando il valore da 
atrribuire supera i limiti consentiti dal tipo di variabile che in 
questo caso é ovviamente Intero;
Una volta generato l'errore mi ritorna il controllo su Deplhi ed il 
cursore si posiziona all'interno della procedura seguente:
procedure TMainForm.NewWinProcedure (var Msg: TMessage);
var
  BmpWidth, BmpHeight: Integer;
  I, J: Integer;
begin
  // default processing first
  Msg.Result := CallWindowProc (OldWinProc,
    ClientHandle, Msg.Msg, Msg.wParam, Msg.lParam);
  // handle background repaint
  if Msg.Msg = wm_EraseBkgnd then
  begin
    BmpWidth := MainForm.Image1.Width;
    BmpHeight := MainForm.Image1.Height;
    if (BmpWidth <> 0) and (BmpHeight <> 0) then
    begin
      OutCanvas.Handle := Msg.wParam;   { qui si posiziona il cursore}
      for I := 0 to MainForm.ClientWidth div BmpWidth do
        for J := 0 to MainForm.ClientHeight div BmpHeight do
          OutCanvas.Draw (I * BmpWidth,
            J * BmpHeight, MainForm.Image1.Picture.Graphic);
    end;
  end;
end;
Ora mi domando e dico: Ma che cazzzzzzzzzo c'è che non và? Cosa genera 
l'errore? All'inizio ho seguito alcuni valori e mi ero accorto che ad 
BmpWidth, all'interno di tale procedura veniva assegnato un valore del 
tipo 344534343 quando la larghezza dell'immagine è 120. Ma io 
all'interno del progetto non la modifico affatto. Chi è che la modifica?
Come mai viene assegnato alla proprietà questo valore?
Capito cosa potesse essere ho modificato tale procedura, ecco la 
modifica:
Procedure TMainForm.NewWinProcedure (Var Msg:TMessage);
Var
   I,J:Integer;
Begin
  Msg.Result := CallWindowProc
(OldWinProc,ClientHandle,Msg.Msg,Msg.WParam,Msg.LParam);
  If MSg.Msg=wm_EraseBkGnd
    Then
      Begin
        OutCanvas := TCanvas.Create;
              OutCanvas.Handle := Msg.WParam; {Vi è sempre l'errore qui}
              For I:= 0 To round(MainForm.ClientWidth Div 102)
                Do
                  For J:= 0 To round(MainForm.ClientHeight Div 102)
                    Do
                      OutCanvas.Draw 
(I*102,J*102,BkImage.Picture.Graphic);
        FreeAndNil(OutCanvas);
      End;
End;
Ma nonostante tale modifica l'errore è sempre presente.
Cosa accade dietro le quinte? Che cazzo fa Windows? Perchè Questo 
errore?
Spero tanto di essere stato molto chiaro nell'esprimere il mio problema.
Vi pregherei soltanto di darmi qualche consiglio, o , se l'avete, la 
risposta a questo problema.
VI ringrazio tanto per aver preso in considerazione questo messaggio.
Grazie
Alessandro Storniolo
-- 
Posted from 195.191.2.199 by way of 
smtp2.libero.it
 [193.70.192.52] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG








Var
   I,J:Integer;


-- 
Posted from 195.191.2.199 by way of 
smtp1.libero.it
 [193.70.192.51] 
