04. august 2006 - 21:49
#1
Unit1;
interface
var
Data : array[longword] of char; // For nu at lave den stor nok..
implementation
// Initialisér array her
------------
Unit2;
interface
uses
Unit1;
implementation
procedure EtEllerAndet;
begin
for i := low(Data) to High(Data) do
writeln(Data[i]);
end;
Er det det du mener?
05. august 2006 - 11:33
#3
Lad mig opstille problemet.
Jeg har en Unit hvor jeg har en variabel af en typen record som jeg selv har defineret til at indeholde et array af Integerværdier.
Denne Unit kalder jeg Unit1, og her sætter jeg arrayets længde og initialisere det med ”tilfældige” tal under en procedure, som jeg så køre ved hændelsen Formcreate.
Derudover indeholder Unit1 en knap med hændelsen onclick der så viser den anden form som er til knyttet Unit2.
Under Unit 2, hvil jeg så gerne kunne ”arbejde” med værdierne i arrayet fra Unit1. lad os bare sige at jeg vil hente dem ind i en ListBox når Formen der er tilknyttet Unit2 vises.
Hvordan kan det gøres?
05. august 2006 - 22:07
#4
For nu at terminologien på plads: De units du nævner er ikke units; De er forme (skærmbilleder). En unit er noget bagvedliggende logik, såsom rutiner der skriver til registreringsdatabasen, lister eller noget helt tredje. Det er en defacto standard at gøre det således.
Hvis du går ind i projektets opsætning (shift-ctrl-f11) skal du sikre dig at kun form1 oprettes automatisk.
Måden jeg plejer at gøre det på er, at modificere form2 constructor så den også kaldes med array'en fra Form1.
Du opretter en tredje fil - denne gang en unit:
unit UDataRecord;
interface
type
TDataRecord = record
Data : array[0..99] of integer;
end;
implementation
end.
// Den refererer både Form 1 og 2 til. På den måde undgår du cirkulære referencer.
------------------------
Form1 ser således ud:
unit FMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, UDataRecord;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
fDataRecord : TDataRecord;
public
end;
var
Form1: TForm1;
implementation
uses
FForm2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(self,fDataRecord) do
try
ShowModal;
finally
Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
Randomize;
for i := low(fDataRecord.Data) to high(fDataRecord.Data) do
fDataRecord.Data[i] := Random(100);
end;
end.
------------------------
I Form2 ser det således ud:
unit FForm2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UDataRecord, StdCtrls;
type
TForm2 = class(TForm)
lbData: TListBox;
private
fDataRecord : TDataRecord;
public
constructor Create(aOwner : TComponent; var aDataRecord : TDataRecord); reintroduce;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
constructor TForm2.Create(aOwner: TComponent; var aDataRecord: TDataRecord);
var
i : integer;
begin
inherited Create(aOwner);
// Flytter bare pointeren så retter du noget her, så ses det også i form1
fDataRecord := aDataRecord;
lbData.Items.Clear;
for i := low(fDataRecord.Data) to high(fDataRecord.Data) do
lbData.Items.Add(IntToStr(fDataRecord.Data[i]));
end;
end.
På den måde får du data sendt med over. Du kunne også bare lave en procedure i Form2 der kopierede eller flyttede pointeren over:
with TForm2.Create(self,fDataRecord) do
try
SetDataRecord(fDataRecord); // Procedure i Form2
ShowModal;
finally
Free;
end;