Newsgroup: it.comp.lang.delphi
Titolo: help per un newbe abituato al vb

salve a tutti, dopo anni di programmazione in vb mi sto avvicinando al
delphi, ma ho trovato un ostacolo che non riesco a superare: in vb se ad
esempio dichiaravo una procedura come pubblica all'interno del codice di un
form, poi potevo richiamarla dal codice di un altro form, oppure, se
inserivo delle procedure o delle variabili o delle strutture dati in un
modulo, poi potevo richiamarle da qualsiasi punto del codice. Purtroppo,
data la suddivisione in unit del delphi, questo non è possibile. La mia
domanda è: c'è un altro modo per farlo? So che potrei inserire il
riferimento alla unit che mi serve nella unit che la deve richiamare, ma se
dovessi contemporaneamente fare il contrario? Grazie mille a chiunque mi
aiuterà...
Kyle

 data la suddivisione in unit del delphi, questo non è possibile. 
Certo che e' possibile.
In Delphi, ogni "unit" puo' avere una sezione "interface" e 
una sezione "implementation".  Qualsiasi cosa definita nella
sezione "interface" di una "unit" e' visibile in tutte quelle
che la includono (dati/funzioni/form, ecc..).
I form, in piu', hanno la possibilita' di conservare nella
propria sezione public, delle funzioni/strutture dati/proprieta' 
che sono quindi visibili e utilizzabili da chiunque.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 che sono quindi visibili e utilizzabili da chiunque.
Purtroppo non è ciò di cui ho bisogno: avendo ad esempio due form dichiarati
in due unit separate, mi serve poter richiamare il primo dal codice del
secondo, ma anche il secondo dal codice del primo, quindi ciò di cui avrei
bisogno è porli sullo stesso livello, come se appartenessero ad uno stesso
blocco di codice e non fossero inseriti nella struttura gerarchica del
delphi. Grazie comunque per il consiglio
Kyle

 delphi. Grazie comunque per il consiglio
Se specifichi 'uses unit2' nella unit1, ed 'uses unit1' nella unit2, incorri
in un riferimento circolare, e delphi (giustamente) non te lo consente.
Se non definisci classi (al di fuori della form) in entrambe le unit, la
soluzione è quella di utilizzare la clausola 'uses' non nella interface, ma
nella implementation.
In questo caso puoi tranquillamente utilizzare tutto ciò che ti serve.
Ti allego un progetto, due unit e due form di esempio (D6).
Ciao.
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.
-------------------------------------------
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.ListBox1.Items.Add('Inserito dalla unit1');
end;
procedure TForm1.FormShow(Sender: TObject);
begin
 Form2.Show;
end;
end.
-----------------------------------
object Form1: TForm1
  Left = 387
  Top = 146
  Width = 199
  Height = 217
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object ListBox1: TListBox
    Left = 0
    Top = 36
    Width = 191
    Height = 154
    Align = alBottom
    Anchors = [akLeft, akTop, akRight, akBottom]
    ItemHeight = 13
    TabOrder = 0
  end
  object Button1: TButton
    Left = 8
    Top = 4
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
--------------------------
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm2 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
uses unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
 Form1.ListBox1.Items.Add('Inserito dalla unit2');
end;
end.
--------------------------
object Form2: TForm2
  Left = 599
  Top = 135
  Width = 218
  Height = 224
  Caption = 'Form2'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object ListBox1: TListBox
    Left = 0
    Top = 33
    Width = 210
    Height = 164
    Align = alBottom
    Anchors = [akLeft, akTop, akRight, akBottom]
    ItemHeight = 13
    TabOrder = 0
  end
  object Button1: TButton
    Left = 8
    Top = 4
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
end

delphi. 
Delphi non crea *alcuna* struttura gerarchica.
Esattamente come ti ho spiegato, quando crei un form, la
variabile FormX (dove X e' il numero assegnato da Delphi, in
automatico) e' resa pubblicamente visibile per tutte le unit
che includono quella di FormX.  Delphi, cioe', pone FormX
nella sezione interface della unit.
// ---------------------- CODICE PRIMO FORM
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;
// ---------------------- CODICE SECONDO FORM
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.Show;
end;
end.
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]


Scusa: avevo franinteso le tue parole, anche perché pensavo che un
collegamento "reciproco" tra unit non fosse consentito. Adesso mi č tutto
chiaro, grazie!
Kyle
P.S. per struttura gerarchica (come avrai notato non sono affatto pratico di
delphi e sono andato un po' a spanne per i termini sperando di farmi capire
^__^) intendevo cose del tipo:
  progetto
  ^        ^
unit     unit
 ^
unit
ecc. quello che volevo sapere era appunto se era l'unica relazione
possibile. Grazie ancora per la delucidazione (e per la pazienza).


Esattamente ciò che volevo sapere, grazie!
Ciao
Kyle