Newsgroup: it.comp.lang.delphi
Titolo: Tanti TTable o uno solo

Che differenza c'e' se ad ogni form aggiungo un oggetto TTable oppure ne
creo uno solo dentro la maschera predefinita DataModulo ?
Quello che ho trovato di negativo nel caso della maschera DataModulo è che
se intervengo su di un evento della TTable, non posso fare riferimento nel
codice a nessun oggetto della form che è attiva !!! perchè la unitform ha
come riferimento uses unitDM, ma non posso fare l'opposto.
Stefano

 come riferimento uses unitDM, ma non posso fare l'opposto.
se ho capito bene quello che vuoi dire....
mi sa che ti sbagli, vedi l'esempio sotto, l'avevo preparato per un altro
amico del news group ma lo modificato per te.
crea un nuovo progetto
1 form e 1 dataModule
e vedi il codice sotto, ho scritto del codice all'interno del evento
ADOConnection1AfterConnect e dico alla label1 (che sta nel form1) di
cambiare caption in 'DB Connesso'
nota che in dataModule2 sotto la parola *implementation* c'č scritto: Uses
Form1
in pratica un dataModule č un form come tutti gli altri solamente che non č
visibile.
ciao
spero di esserti stato utile, e sopratutto spero di aver capito il problema.
roberto
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB;
type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
  nomeTabellaDaEliminare : String;
  isTabellaEsiste        : boolean;
  j                      : integer;
begin
  nomeTabellaDaEliminare := 'tblAziende2';   // per esempio
  isTabellaEsiste := false;
  DataModule2.ADOConnection1.Connected := true;
  DataModule2.ADOConnection1.GetTableNames(ListBox1.Items, false);
  DataModule2.ADOConnection1.Connected := false;
  for j:=0 to ListBox1.Items.Count-1 do
    if ListBox1.Items.Strings[j] = nomeTabellaDaEliminare then
      isTabellaEsiste := true;
  if isTabellaEsiste then
    ShowMessage('la tabella esiste quindi elimino la tabella')
  else
    ShowMessage('la tabella non esiste perciň non faccio niente');
end;
end.
----------------------- unit 2 -----------------------------------------
unit Unit2;
interface
uses
  SysUtils, Classes, DB, ADODB;
type
  TDataModule2 = class(TDataModule)
    ADOConnection1: TADOConnection;
    procedure ADOConnection1AfterConnect(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  DataModule2: TDataModule2;
implementation
uses Unit1;
{$R *.dfm}
procedure TDataModule2.ADOConnection1AfterConnect(Sender: TObject);
begin
  Form1.Label1.Caption := 'DB Connesso';
end;
end.

codice a nessun oggetto della form che è attiva !!!
E' appunto questo il problema del datamodule.
-- 
Morde. 
morde[at]programmer[.]net

 E' appunto questo il problema del datamodule.
? specificare meglio ?
Saluti
Paolo Arosio

Non è responsabilità del data module e degli oggetti in esso contenuti
cambiare lo stato del form.
E' il form che, in base a quanto rivece dal datamodule, decide come cambiare
il proprio stato.
Immaginiamo che sulla tua form hai una taction associata ad un pulsante che
deve essere attiva solo se il campo xx ha un valore True...
come dici tu:
procedure ttuodatamodule.qualcosa(....);
begin
  form1.tuaaction.enabled := Dataset.FieldByName('xx').AsBoolean
end;
Io uso un metodo diverso.
Il datamodule espone un metodo:
function TTuoDataMoudle.AttivaTuoPulsante: boolean;
begin
  Result := Dataset.FieldByName('xx').AsBoolean
end;
Poi, nel form, puoi mettere nell'evento OnUpdate della Action il seguente
codice:
TAction(Sender).Enabled := TuoDataModule.AttivaTuoPulsante.
In questo modo, il form vede il data module ma il data module non sa chi lo
sta interpellando in un particolare momento.
Questo separa nettamente la logica dalla interfaccia che è poi lo scopo
della esistenza dei data module.
Bye
A.

? specificare meglio ?
Mi ricollegavo al discorso iniziale, e cioe' di gestire degli eventi della
tabella presente nel datamodule.
Io spesso per le mie applicazioni utilizzo l'evento onchange del datasource
associato ad una tabella, ed in questo evento metto il codice che
abilita/disabilita i bottoni nuovo, modifica,elimina, ecc....
Ora, questo modo di lavorare mi impedisce di poter usare la stessa tabella
anche in altri form.
Preferisco quindi mettere tante tabelle uguali su tanti form, ed ognuna in
base ai propri eventi gestisce i bottoni del form in cui e' contenuta.
Ciao,
