tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
847
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Mausi Mausi ist offline Rookie
    Registriert seit
    Mar 2004
    Beiträge
    7
    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;
     

  2. #2
    pfmayr pfmayr ist offline Rookie
    Registriert seit
    Jul 2006
    Beiträge
    5
    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

  1. Verarbeitung des Query Result bei EJB 3.0 und JPA
    Von Cullen im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 09.07.07, 16:51
  2. Ausgabe eines Result Set
    Von ramzymamzy im Forum Java
    Antworten: 1
    Letzter Beitrag: 16.03.05, 16:05
  3. (?-?-?-?) RESULT: NaN
    Von Neurodeamon im Forum Javascript & Ajax
    Antworten: 18
    Letzter Beitrag: 03.03.04, 06:07
  4. Mysql Result
    Von h-brock im Forum PHP
    Antworten: 1
    Letzter Beitrag: 13.04.02, 15:15
  5. ID suchen bis $result=1 ! MySQL
    Von no-fx -> Junge im Forum PHP
    Antworten: 3
    Letzter Beitrag: 05.11.01, 23:04