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.
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.
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;
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;
Blive ikke forskrækket over størrelsen af mit svar. Det er bare fordi jeg har kopieret 3 filer over i det. Det fylder.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.