kupferstecher, das Deinige ist mir leider etwas zu ... komplex? Mir fällt da auch keine direkte Anwendungsmöglichkeit ein, was es mir noch schwerer macht, es zu verstehen.
Soner, mir scheint wir haben etwas aneinander vorbei geschrieben. Teils kein Wunder, irgendwie stehe/stand ich, was die tieferen Funktion von Array etc. betraf, auf Kriegsfuß. Viele mir bekannte Beispiele zu Array sind zu einfach, dass es mir teils an Fantasie fehlte, dass in einen Fach/Bereich des Array mehr als nur eine Sache rein kann, und dass obwohl ich öfters Array mit Objekten als Inhalt erstellt habe. Letztendlich habe ich den Ganzen Dreh doch noch heraus bekommen. Musste allerdings eben einiges an meine Prozeduren bzw. Typisierung anpassen.
Code: Alles auswählen
...
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
...
private
public
end;
procedure FarbeRot(); // ** 1 **
procedure FarbeSchwarz();
procedure FarbeGelb();
procedure FarbeBlau();
function ZahlSummieren(Edit1,Edit2:Integer):Integer;
var
Form1: TForm1;
type
TFarbProc=procedure(); // ** 2 **
TZahlFunc=function(Zahl1,Zahl2:Integer):Integer;
var
MeyRec : record
Zahl: Integer;
Wort: String[5];
Proze: TFarbProc;
Funki: TZahlFunc;
end = (Zahl:5; Wort:'Ok'; Proze: @FarbeBlau; Funki: @ZahlSummieren); // ** 3 **
ProzeFarb:Array[0..2] of TFarbProc;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.ProcFuellenBClick(Sender: TObject);
begin
// Prozeduren zuweisen
ProzeFarb[0]:=@FarbeRot;
ProzeFarb[1]:=@FarbeSchwarz;
ProzeFarb[2]:=@FarbeGelb;
end;
procedure TForm1.ButtonRecAusfuehrenClick(Sender: TObject);
begin
MeyRec.Proze;
ShowMessage(IntToStr(MeyRec.Funki(StrToInt(Edit1.Text),StrToInt(Edit2.Text))));
end;
function ZahlSummieren(Edit1,Edit2:Integer):Integer;
begin
Result:=Edit1+Edit2;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ProzeFarb[0];
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ProzeFarb[1];
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ProzeFarb[2];
end;
// Rest eher uninteressant
procedure FarbeRot();
begin
Form1.Color:=clRed;
end;
procedure FarbeSchwarz();
begin
Form1.Color:=clBlack;
end;
procedure FarbeGelb();
begin
Form1.Color:=clYellow;
end;
procedure FarbeBlau();
begin
Form1.Color:=clAqua;
end;
end.
Folgendes musste ich feststellen. Bei Punkt 1, wo die Prozeduren für die Farben sind, diese müssen leider außerhalb von Form1 (der Klasse?) erstellt werden. Nur so kann man es ohne TForm1 verwenden. Mit TForm1 geht es leider nicht. ??
Zu 2) Jetzt wo ich endlich begriff, was ja eigentlich offensichtlich ist, nämlich dass man der Array mitteilen muss, was so alles bei der Prozedur dabei ist, konnte ich es anpassen. Weil Prozeduren haben oft unterschiedliche Variablen. Und dementsprechend muss dann auch die Typisierung erstellt werden. Was in meinem Fall statt 'procedure(FMachFormBlau, FMachFormRot, FMachFormGelb: integer);', einfach nur 'procedure();' heißen muss. Weil meine Prozeduren ja keine Werte verlangen. Aber das '()' muss scheinbar mit dabei sein.
3) Was ich auch wissen wollte, aber nach dem ich das andere Verstand selbst zustande brachte: Wie man so was auch in Records einbauen kann. Muss man halt mit Zeiger dann machen. Jetzt weiß ich endlich, wozu Zeiger gut sind.
Mathias, danke dass Du Dich zu Wort ... Schrift gemeldet hast. Daraufhin habe ich noch mal in Deinem Tread, der ja mein Interesse angestoßen hat, rein geschaut. Und habe da die eine Frage mit der Direkten Zuweisung dann endlich verstanden. Daraufhin habe in inzwischen mein Code etwas umgeändert. Habe die Typisierung raus geworfen. Und also statt ...
Code: Alles auswählen
Proze: TFarbProc; // im Recod
Funki: TZahlFunc; // im Record
ProzeFarb:Array[0..2] of TFarbProc;
gleich so gemacht:
Code: Alles auswählen
Proze: procedure(); // im Record
Funki: function(Zahl1,Zahl2:Integer):Integer; // im Record
ProzeFarb:Array[0..2] of procedure();
Funktionierte ebenfalls wunderbar. Dadurch spare ich mir die Typisierung.
Ich stehe einfach auf Kriegsfuß mit den ... Typen. Liegt einfach auch daran, dass man mir bis jetzt nicht wirklich den Sinn davon erklären konnte. Ja, man kann diese öfters verwenden. Aber in der Regel verwende ich es ja nur einmal. Und da finde ich Umwege oder eben Zwischen-Strecken befremdlich, weil unnötig.
Danke für Eure Hilfe.
Theoretisch wird mir das vieles vereinfachen. ... fragt sich aber wie so oft, ob es auch den Praxistest besteht, oder ich doch mich in was verrannt habe, oder zu Aufwendig ist, etc.