Newsgroup: it.comp.lang.delphi
Titolo: Passare una Griglia ad una funzione all'interno di una libreria

Vorrei creare una libreria con all'interno tutta una serie di funzioni che
uso spesso nei miei progetti. Una di queste funzioni richiede un oggetto
TDBGRid e dovrei passare dal programma alla libreria.
Quando eseguo la funzione, ricevo il seguente messaggio:
EXCEPTION CLASS EPRIVILEGE WITH MESSAGE:
"Privileged Instruction"
Se clicco sul messaggio per chiuderlo, il programma va avanti e funziona
comunque ma non riesco ad evitare l'errore.
Vi scrivo di seguito la funzione cosě come l'ho scritta e la sua chiamata
dal programma.
Funzione:
procedure AdattaColonne(Sender: TObject);
  var
  lGriglia: integer;
  x,i:integer;
  lColonna:real ;
  nCampi:integer;
begin
  if TObject(Sender) is TDBGrid then
  begin
  lgriglia := TDBGrid(sender).Width ;
  ncampi:=0;
  for i:= 0 to  TDBGrid(sender).columns.Count-1 do
  begin
     if  TDBGrid(sender).columns[i].Visible then
       ncampi:=ncampi+1;
  end;
  TRY
    lColonna := lgriglia/ncampi;
  EXCEPT
    lColonna := 0
  END;
  for x:= 0 to ncampi -1 do
  begin
   if  TDBGrid(sender).Columns[x].Visible then
       TDBGrid(sender).Columns[x].Width :=  ceil(int(lcolonna))-8;
  end;
  end;
end;
Dichiarazione e Chiamata:
procedure AdattaColonne(Sender: TObject);  stdcall; external 'global.dll';
adattacolonne(dbgrabbattimento);
--- posted by geoForum on 
http://www.delphiedintorni.it

xche farsi male cosi e non  ereditare una nuova griglia da TDbGrid che
include un metodo che fa quanto hai messo nella funzione della dll??
Non hai altri parametri oltre all'oggetto..
Eredita da TDbGrid, aggiungi il metodo ResizeColumns e lo richiami
quando serve, fregandotene di dll etc.
In questo modo, SENZA DLL ESTERNE, qualsiasi app che usi la tua griglia
al posto della dbgrid standard avrà quel metodo; sarai poi tu a
decidere di volta in volta se utilizzarlo o no.
AS

In effetti mi piace farmi del male... ;-D
Sicuramente per il problema della griglia farò come dici tu ma in
generale, come faccio a passare un parametro come la griglia o altro
oggetto ad una dll senza beccarmi l'errore?


prova a fare un typecast appena entri nella funzione:
procedure AdattaColonne(Sender: TObject);
  var
  lGriglia: integer;
  MYGRID: TDBGRID;
  x,i:integer;
  lColonna:real ;
  nCampi:integer;
begin
  if TObject(Sender) is TDBGrid then
  begin
  MYGRID := TDBGRID(SENDER);
  lgriglia := MYGRID.Width ;
  ncampi:=0;
  for i:= 0 to  MYGrid.columns.Count-1 do
...
AS

Ci provo e ti fo sapere!
Grazie.

--- posted by geoForum on 
http://www.delphiedintorni.it

Ciao, ho provato con un typecast come mi hai suggerito ma va peggio perché
mi da un access violation!

--- posted by geoForum on 
http://www.delphiedintorni.it

 mi da un access violation!
dove?
AS

Ciao, va in errore non appena viene invocata la funzione della Dll e solo
quella di funzione perché le altre che non usano oggetti funzionano
correttamente. Tant'è che ho pensato fosse un problema di tutta la DLL ma
poi ho dovuto ricredermi perché per ogni altra funzione più o meno
complessa non ho nessun problema.
Il codice l'ho scritto esattamente come me lo hai mandato tu e non risco
ad uscirne!
Me tapino! Sigh!

--- posted by geoForum on 
http://www.delphiedintorni.it

 Me tapino! Sigh!
Ma dai! per un problemuccio come questo? ;)
Ci metterei la firma ad avere sempre e solo problemi di AV......!
AS