Zitat von
Christopher:
Was heißt generisch? Kenne den Ausdruck leider nicht.
Du meinst warscheinlich "allgemein mit Variablen" oder?
Generisch bedeutet "allgemein gehalten".
Zitat von
Christopher:
Aber dann brauche ich doch eine Variable die zu TJob UND
zu TCustomer "kompatibel" ist. Oder hab ich das jetzt falsch
verstanden?
Pointer ist kompatibel.
Zitat von
Christopher:
Heul... Was ist eine CallBack-Funktion? Ist das um im Code zurückzuspringen?
Wenn ja, wie macht man das? Ich kenne das nur mit Labels im Code.
Also, stell dir vor du willst eine Textdatei auslesen (ist ja hier ganz ähnlich). Nun hast du die Aufgabe, daß du zwar für das Auslesen zuständig sein sollst (und auch für das Trennen der Token), aber daß ein weiterer Programmierer ohne Kenntnis deines Codes in die Lage versetzt werden soll die Konfigurationstextdatei zu parsen. Was tust du also? Genau, du gibst einen Prototypen für eine Funktion vor, Beispiel:
type TFNMyCallback=function(Identifier:PChar; Value:PChar);
Deine generische Funktion welche durch den Code geht, sieht nun zB folgendermaßen aus:
function ReadMyFile(fName:PChar; FNcallback:TFNMyCallback);
Ist der Funktionspointer, welcher als Parameter übergeben wurde, NIL, tust du nichts. Sonst rufst du die Callbackfunktion ganz normal auf und übergibst die Daten aus Kernfunktion die du benötigst (sagen wir mal Recordgröße und Pointer zu Puffer o.ä.)
if Assigned(FNcallback) FNcallback(Identifier, Value);
Zitat von
Christopher:
Na und da verstehe ich nur noch Bahnhof. Array of Struct konnte mir die Delphi-Hilfe auch nicht erläutern. Man so ein Mist, bi ich wirklich so doof, dass ich das alles nicht verstehe?
Nennen wir es Array of Record, okay? Nun verstanden. Sorry, bin derzeit etwas zu sehr in meine C++-Programmierung vertieft
Template-Funktionen funktioniern unabhängig vom Typ. Beispiel (Funktion welche Maximalwerte herausfindet):
Code:
template <class T> T Max(T Wert1, T Wert2);
Beim Aufruf tust du nun dies:
Code:
double d = Max<double>(d1, d2);
int i = Max<int>(i1, i2);
unsigned char u = Max<unsigned char>(c1, c2);
Wie du siehst, mußt du den Prototypen (und konsequenterweise auch den Rumpf) nur einmal schreiben und kannst ihn dann für verschiedene Typen (nicht nur, wie oben, Basistypen) nutzen. Wäre hier für dich ideal.