Avatar billede kinginkvong Nybegynder
04. august 2006 - 20:38 Der er 5 kommentarer

Data fra et array fra en anden Unit.

Hvordan henter jeg data ud af et array fra en anden Unit end den hvor arrayet er blevet initialiseret?

morten
Avatar billede hrc Mester
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?
Avatar billede arne_v Ekspert
05. august 2006 - 01:04 #2
kræver vist en del RAM i maskinen ...
Avatar billede kinginkvong Nybegynder
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?
Avatar billede hrc Mester
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;
Avatar billede hrc Mester
05. august 2006 - 22:10 #5
Blive ikke forskrækket over størrelsen af mit svar. Det er bare fordi jeg har kopieret 3 filer over i det. Det fylder.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester