Code: Alles auswählen
PROCEDURE TMenueManager.Inhalt(Zeiger: PMEintrag; VAR Eintrag: TEintrag);
{$IFDEF DOS} VAR Temp: PEintrag; {$ENDIF}
BEGIN
{$IFDEF DOS} Temp := Zeiger^.Data; Eintrag := Temp^; {$ELSE} Eintrag := Zeiger^.Data; {$ENDIF}
END;
FUNCTION TMenueManager.FindeMenuepunkt(M1, M2, M3: INTEGER): BOOLEAN;
VAR Zeiger: PMEintrag;
Eintrag: TEintrag;
ok: BOOLEAN;
BEGIN
ok := False;
Zeiger := Gesamt.Head;
WHILE (Zeiger <> NIL) AND NOT ok DO BEGIN
Inhalt(Zeiger, Eintrag);
IF (Eintrag.M1 = M1) AND (Eintrag.M2 = M2) AND (Eintrag.M3 = M3) THEN BEGIN
Punkt := Eintrag; ok := True;
END;
Zeiger := Zeiger^.Next;
END;
FindeMenuepunkt := ok;
END;
Mein Versuch mittels
Code: Alles auswählen
TMenueManager = OBJECT
Gesamt, Auswahl: TMListe;
Aktuell, Punkt: TEintrag;
MenueStapel: {$IFDEF DOS} TStack {$ELSE} specialize TStack<TEintrag> {$ENDIF};
Angezeigt: BOOLEAN;
PROCEDURE Init;
PROCEDURE Freigeben;
PROCEDURE LoadCSV(CONST FileName: STRING);
PROCEDURE ZeigeMenue;
FUNCTION BearbeiteAuswahl: BOOLEAN;
FUNCTION FindeMenuepunkt(M1, M2, M3: INTEGER): BOOLEAN;
FUNCTION HatNachfolge(N1, N2: INTEGER): BOOLEAN;
FUNCTION AktuelleMenuepunkte: BOOLEAN;
PROCEDURE MenueAusfuehren;
PRIVATE
TYPE TFuncEintrag = FUNCTION(VAR Entry: TEintrag): BOOLEAN;
PROCEDURE Traverse(List: TMListe; Func: TFuncEintrag);
PROCEDURE Inhalt(Zeiger: PMEintrag; VAR Eintrag: TEintrag);
FUNCTION FindeMenuepunktFunc(VAR Entry: TEintrag): BOOLEAN;
FUNCTION HatNachfolgeFunc(VAR Entry: TEintrag): BOOLEAN;
FUNCTION AktuelleMenuepunkteFunc(VAR Entry: TEintrag): BOOLEAN;
FUNCTION ZeigeMenueFunc(VAR Entry: TEintrag): BOOLEAN;
END;
PROCEDURE Init_Eintrag(VAR eintrag: TEintrag);
BEGIN
WITH Eintrag DO BEGIN
M1 := 0; M2 := 0; M3 := 0; N1 := 0; N2 := 0; L1 := 0;
PROG := ''; CODE := ''; BEZEICHNER := '';
END;
END;
PROCEDURE TMenueManager.Inhalt(Zeiger: PMEintrag; VAR Eintrag: TEintrag);
{$IFDEF DOS} VAR Temp: PEintrag; {$ENDIF}
BEGIN
{$IFDEF DOS} Temp := Zeiger^.Data; Eintrag := Temp^; {$ELSE} Eintrag := Zeiger^.Data; {$ENDIF}
END;
PROCEDURE TMenueManager.Traverse(List: TMListe; Func: TFuncEintrag);
VAR
Zeiger: PMEintrag;
Eintrag: TEintrag;
BEGIN
Zeiger := List.Head;
WHILE Zeiger <> NIL DO BEGIN
Inhalt(Zeiger, Eintrag);
IF Func(Eintrag) THEN Break;
Zeiger := Zeiger^.Next;
END;
END;
FUNCTION TMenueManager.FindeMenuepunktFunc(VAR Entry: TEintrag): BOOLEAN;
BEGIN
FindeMenuepunktFunc := (Entry.M1 = Aktuell.M1) AND (Entry.M2 = Aktuell.M2) AND (Entry.M3 = Aktuell.M3);
IF FindeMenuepunktFunc THEN Punkt := Entry;
END;
FUNCTION TMenueManager.FindeMenuepunkt(M1, M2, M3: INTEGER): BOOLEAN;
BEGIN
Aktuell.M1 := M1; Aktuell.M2 := M2; Aktuell.M3 := M3;
Traverse(Gesamt, @FindeMenuepunktFunc);
FindeMenuepunkt := Punkt.M1 = M1; //??? muß noch untersuchen
END;
Warum? Und wie kann ich das lösen. Abgesehen davon, dass es zwar eleganter aussehen könnte aber deutlich mehr Code ist.