Delphi 4 Variablen als Array ansprechen

Gast #200166
Lesenswert?
• ▲
▼
Hallo zusammen,

erstelle gerade eine Visualisierung der Portzustände meines Mega16.
Funktioniert soweit, habe mangels Kenntnisse /längerer Abstinenz alles
straightforward programmiert und möchte jetzt die Portabfrage in ein
Schleife packen.

Meine Ports a-d sind als integer deklariert. diese möchte ich nun als
Array ansprechen. wobei PORTs[0] porta represäntieren soll und ich via
PORTs[3] auf portd zugreifen möchte.
Die 4 Variablen sind bereits mit werten(0-255) gefüllt, die den
aktuellen Zuständen am AVR entsprechen.
So wirds ja wohl eher nichts:
...
var
  Form1: TForm1;
  porta,portb,portc,portd: Integer;
  ports:array[porta,portb,portc,portd] of integer;
...
wäre ja nett, wenn ich hier eine Richtung gewiesen bekäme.
Wenn alles fertig ist, wirds auch veröffentlicht...

Danke
AxelR.
Gast #200167
Lesenswert?
• ▲
▼
Habe gerade kurz telefoniert:

ich verwerfe die Portvariablen porta,portb usw. und verwende von
vornherein PORT[0..3] zu zuweisen der Werte. Hätt' ich ja gleich drauf
kommen können.

Aber wie iss das nun? wenn ich mehrere Variablen habe, die vorgegeben
seien. Kann ich da mit TYPE o.ä. ein Konstukt erstellen, um auf diese
Variablen über einen Index zuzugreifen?

AxelR.
Gast #200168
Lesenswert?
• ▲
▼
klar geht das!


zuerst einen eigenen datentyp definieren:

  type MyType = record
  feld1:integer;
  feld2:string;
  feld3:boolean;
  end;

dann ein array davon anlegen:
Myarray: array[1..10] of MyType;

auf die Arraykomponenten kann dann zugegriffen werden:

myarray[0].feld1:=10;
myarray[0].feld2:='Hallo Welt';
etc...



-----------
www.loetstelle.net
Forum, Projekte, Shop.
Gast #200169
Lesenswert?
• ▲
▼
Wenn die verwendeten Variablen feste Register im Prozessor sind (was das
Beispiel mit den Ports nahelegt), dann sollte das ganze mit Pointern
funktionieren:


  Port : array[0..3] of Pointer;

und die Pointer müssten entsprechend initialisiert werden:

  Port[0] = @Porta;
  Port[1] = @Portb;
  Port[2] = @Portc;
  Port[3] = @Portd;


Ich mag mich mit der genauen Syntax vertun, da ich schon lange kein
Pascal/Delphi mehr programmiere - aber das Konzept sollte klar werden.
Gast #200171
Lesenswert?
• ▲
▼
Noch ein Nachtrag: Vergesst I/O-Register und Adressen, mir fällt gerade
auf, daß es ja um die Programmierung eines PCs geht, und nicht um
Pascal auf irgendeiner anderen Zielhardware.

Habe wohl heute zu wenig Kaffee getrunken.
Sorry.
Gast #200174
Lesenswert?
• ▲
▼
nehme das Array das ist am einfachsten

type
  TPorts = array[0..3] od Byte;

  TForm1 = class(TForm)
  private
    FPort: TPorts;
  end;


Du kannst aber auch die Objectorientierten Weg gehen und über
Properties arbeiten.

type
  TForm1 = class(TForm)
  private
    FPort: array[0..3] of Byte;
    function GetPortValue(Index: Integer): Byte;
    procedure SetPortValue(Index: Integer; Value: Byte);
  public
    property Port[Index: Integer]: Byte read GetPortValue write
SetPortValue;
    property PortA: Byte index 0 read GetPortValue write SetPortValue;
    property PortB: Byte index 1 read GetPortValue write SetPortValue;
    property PortC: Byte index 2 read GetPortValue write SetPortValue;
    property PortD: Byte index 3 read GetPortValue write SetPortValue;
  end;

function TForm1.GetPortValue(Index: Integer): Byte;
begin
  Result := FPort[Index];
end;

procedure TForm1.SetPortValue(Index: Integer; Value: Byte);
begin
  if FPort[Index] <> Value then
  begin
    FPort[Index] := Value;
 // hier kannst du ein Event auslösen, zb.
 // if Assigned(FOnPortChanged) then FOnPortChanged(Self, Index);
  end;
end;

Du kannst nun auf 2 Arten zugreifen:

begin
  Port[0] := $12;
  if Port[3] = 0 then ;

  PortA := $12;
  if PortC = 0 then ;
end;

Und über die Getter/Setter Methoden .GetPortValue() und .SetPortvalue()
kannst du sogar noch auf Veränderungen der Ports direkt reagieren und
zb. Zeichroutinen aktualisieren oder andere Event aufrufen.

Gruß Hagen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren