ERLEDIGT
NEIN
NEIN
ANTWORTEN
1
1
ZUGRIFFE
847
847
EMPFEHLEN
-
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
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.
Ähnliche Themen
-
Verarbeitung des Query Result bei EJB 3.0 und JPA
Von Cullen im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 09.07.07, 16:51 -
Ausgabe eines Result Set
Von ramzymamzy im Forum JavaAntworten: 1Letzter Beitrag: 16.03.05, 16:05 -
(?-?-?-?) RESULT: NaN
Von Neurodeamon im Forum Javascript & AjaxAntworten: 18Letzter Beitrag: 03.03.04, 06:07 -
Mysql Result
Von h-brock im Forum PHPAntworten: 1Letzter Beitrag: 13.04.02, 15:15 -
ID suchen bis $result=1 ! MySQL
Von no-fx -> Junge im Forum PHPAntworten: 3Letzter Beitrag: 05.11.01, 23:04





Zitieren
Login





