ObjectList als Result-Rückgabe?

Mausi

Grünschnabel
Hallo Leute

Ich habe folgendes Delphi Problem:
Meine ObjectListe (Keyliste) wird in der Hauptverarbeitung erstellt. Das Hineinfüllen der einzelne Objecte geht aber über eine Methode, die eine Schleife beinhaltet. Wenn ich nun in der besagten Methode Keyliste.add(Objekt) mache ist es in der oberen Hauptverarbeitung nicht mehr bekannt. (Wenn ich dort dann die Objekte so herauslesen will-->
for index:= 0 to (Keyliste.Count - 1) do steht Count auf 0!
wenn ich allerdings die Objecte mit Keyliste.add in der Hauptverarbeitung mache, habe ich das Problem, dass in der Methode wegen der Schleife die einzelnen Objekte überschrieben werden. d.h ich kriege nur das letzte und Count steht immer auf 1!
Jetzt habe ich versucht es trotzdem in der Methode zu machen und als Rückgabewert die TObjectList zu geben aber da motzt der Compiler (Integer und TObjectlist sind incompatible Datentypen)

Was soll ich tun? bin verzweifelt:confused:

Hier der Code:

in der Hauptverarbeitung (das wesendliche habe ich fett gemacht)

Keyliste:= TObjectList.Create();
anzkommas:= getAnzahlKommas(Fields[FieldIndex]);
getAllKeysFromRegel(Fields[FieldIndex], tmpschluessel); // Methode
strTableName:= Fields[FieldIndex].OberFeld;
for index:= 0 to (Keyliste.Count - 1) do begin //hier lese ich es raus
if tmpschluessel.Table1 = Name then
begin


die methode getAllKeysFromRegel

function TTableModel.getAllKeysFromRegel(Fields: TFieldModel; var tmpschluessel: TSchluessel):TObjectList;
var strIndex, strOrigIndex, strSchluesselpaar : String;
FieldIndex, x, anzkommas : Integer;
Keyliste: TObjectList;
begin
strIndex:= Fields.Beziehung;
strIndex:= strIndex + ',';
anzkommas:= getAnzahlKommas(Fields);

for x:=0 to anzkommas do begin
strSchluesselpaar:= Copy(strIndex, 0 , Pos(',', strIndex)-1);
strIndex:= Copy(strIndex, length(strSchluesselpaar)+2, length(strIndex));
tmpschluessel:= TSchluessel.Create(strSchluesselpaar);
result:= Keyliste.add(tmpschluessel);
end;
end;
 
Hallo Mausi!

1. Die Methode TObjectList.Add liefert den Index (als Integer) des eingefügten Objekts zurück, deshalb meckert der Compiler
2. Die Keyliste in der "Hauptverarbeitung" kann in der Funktion getAllKeysFromRegel nicht gefüllt werden weil dort diese lokal nochmal deklariert ist. Da ist die ObjectList jedoch nicht instantiiert, falls sich das also Programm kompilieren lassen würde, hättest du auf jeden Fall zur Laufzeit eine Zugriffsverletzung.
3. Wenn du an getAllKeysFromRegel tmpschluessel übergibst und dort bei Bedarf den neu erzeugten TSchluessel zuweist, hängen die alten TSchluessel-Instanzen in der Luft und du hast jede Menge schöne Memory-Leaks.

Um die Keyliste in der Hauptverarbeitung zu füllen übergibst du die dort erstellte Keyliste in die Prozedur getAllKeysFromRegel und kannst diese in der Methode füllen:

procedure TTableModel.getAllKeysFromRegel(Fields: TFieldModel; Keyliste: TObjectList);
var strIndex, strSchluesselpaar : String;
x, anzkommas : Integer;
begin
strIndex:= Fields.Beziehung + ',';
anzkommas:= getAnzahlKommas(Fields);

for x:=0 to anzkommas do begin
strSchluesselpaar:= Copy(strIndex, 0 , Pos(',', strIndex)-1);
strIndex:= Copy(strIndex, length(strSchluesselpaar)+2, length(strIndex));
Keyliste.add(TSchluessel.Create(strSchluesselpaar));
end;
end;


In der Hauptverarbeitung iterierst du durch die Keyliste, dabei musst du die Objekte mit TSchluessel casten (ich gehe davon aus, dass die Keyliste nur TSchluessel oder davon abgeleitete Objekte enthält, sonst musst du vorher Typprüfung machen):

Keyliste:= TObjectList.Create();
anzkommas:= getAnzahlKommas(Fields[FieldIndex]);
getAllKeysFromRegel(Fields[FieldIndex], Keyliste); // Methode
strTableName:= Fields[FieldIndex].OberFeld;
for index:= 0 to Keyliste.Count - 1 do begin //hier lese ich es raus
if TSchluessel(Keyliste.Items[index]).Table1 = Name then
begin
........


Du kannst auf die Listenelemente auch mit
if TSchluessel(Keyliste[index]).Table1 = Name then
(ohne Items) zugreifen, da Items die Standardeigenschaft von TObjectList ist.

Wenn du das jeweils aktuelle Objekt öfter brauchst, kannst du es auch einer temporären Variable zuweisen, damit du nicht jedesmal casten musst:
for index:= 0 to Keyliste.Count - 1 do begin //hier lese ich es raus
tmpschluessel := TSchluessel(Keyliste[index]);
if tmpschluessel.Table1 = Name then
begin
........


Wo einige Variablen wie Name, usw. deklariert sind und initialisert werden habe ich mich nicht gekümmert.
Ich hoffe ich hab nichts übersehen und mich nicht vertippt.
 
Zurück