![]() |
Invalid Pointer TObjectList
Hi Leute,
Ich checks einfach nicht wo der Fehler liegen kann: Ich möchte meine Objekte und Listen alle freigeben, weil sich das Programm sonst extrem aufbläht. Hier ein Auszug meines Codes:
Delphi-Quellcode:
Das Programm läuft trotz des Fehlers aber den Fehler möchte ich natürlich wegbekommenFList := TObjectList.Create; FCSearch := Model.TComputerSearch.Create; FMyCCriteria := Model.TComputerAttributes.Create; //... FList := FCSearch.DBSearch('vague',FMyCCriteria); // FList wird mit "TComputer"-Objekten befüllt I := 0; while (I<FList.Count-1) do begin FMyComputer := Model.TComputer.Create; FMyComputer := FList[I] as Model.TComputer; // Fill the Grid with the information of the FMyComputer object Grid.Cells[0,Grid.RowCount-1] := IntToStr(FMyComputer.GetAttributes.GetID); Grid.Cells[1,Grid.RowCount-1] := FMyComputer.GetAttributes.GetName; Grid.Cells[2,Grid.RowCount-1] := FMyComputer.GetAttributes.GetComment; Grid.Cells[3,Grid.RowCount-1] := FMyComputer.GetAttributes.GetModel; Grid.RowCount := Grid.RowCount +1; FMyComputer.Free; Inc(I); end; FList.Clear; // UNGÜLTIGE ZEIGEROPERATION FList.Free; // UNGÜLTIGE ZEIGEROPERATION FCSearch.Free; FMyCCriteria.Free; Weiß einer Rat ? |
Re: Invalid Pointer TObjectList
TObjectList gibt alle Objekte die es enthält selber frei - außer man instantiiert es mit AOwnsObjects = False :wink:
[edit]Parametername korrigiert.[/edit] |
Re: Invalid Pointer TObjectList
Ok Vielen Dank, wusste ich nicht.
|
Re: Invalid Pointer TObjectList
FMyCompuer musst du auch nicht erzeugen, bevor du auf die Liste zugreifst. Sonst hast du ein Speicherleck.
|
Re: Invalid Pointer TObjectList
Hmm ok danke schonmal guter Anfang die Lecks zu finden. Ich weiß sonst echt nicht mehr wo die 3KB pro DB abfrage herkommen :/
|
Re: Invalid Pointer TObjectList
Zitat:
PS: Try-finally nutzen :wink: |
Re: Invalid Pointer TObjectList
Zitat:
|
Re: Invalid Pointer TObjectList
Zitat:
Delphi-Quellcode:
eine Adressverletzung bekommen... ?
FList := TObjectList.Create;
|
Re: Invalid Pointer TObjectList
Hi,
Delphi-Quellcode:
FList := TObjectList.Create;
FCSearch := Model.TComputerSearch.Create; FMyCCriteria := Model.TComputerAttributes.Create; //... Sollte hier zwischen nicht mit FList gearbeitet werden dann ist obiges Create überflüssig und erzeugt ein Speicherleck // WENN hier mit FList gerarbeitet wird, dann muss es aber vor der Zeile hier unten wieder freigegeben werden. // Sonst gibts ebenfalls ein Speicherleck! FList := FCSearch.DBSearch('vague',FMyCCriteria); // FList wird mit "TComputer"-Objekten befüllt |
Re: Invalid Pointer TObjectList
Zitat:
|
Re: Invalid Pointer TObjectList
Ich hab extreme Performance- und Speicherprobleme, sprich ich weiß nicht wie genau ich mit den Objekten umgehen soll. Hier mal ein Auszug aus meinem Code:
MONITOR SUCH FUNKTION
Delphi-Quellcode:
WORKSTATION SUCH FUNKTION
function TMonitorSearch.DBSearch(Modus: String='vague'; ID: Integer=0;
Model: String=''; InventoryNumber: String=''): TObjectList; var FMList: TObjectList; I: Integer; FMyMonitor: TMonitor; begin FMList := TObjectList.Create; // Search in the database for monitors by using the criteria FMQuery.Close; FMQuery.SQL.Text := 'SELECT '; //etc FMQuery.Open; while not FMQuery.EOF do begin FMyMonitor := TMonitor.Create; // Use search result to create a new monitor object FMyMonitor.SetID(FMQuery.FieldByName('MonitorID').AsInteger); FMyMonitor.SetModel(FMQuery.FieldByName('Modell').AsString); //etc // Add monitor to a list of monitor ojects FMList.Add(FMyMonitor); FMQuery.Next; end; Result := FMList; // DIE FUNKTION LIEFERT ALSO EINE LISTE VON MONITOR OBJECTS ZURUECK end;
Delphi-Quellcode:
function TWorkstationSearch.DBSearch(Modus: String='vague'; ID: Integer=0; Computername: String=''; Model: String=''; InventoryNumber: String=''; Room: String=''; Username: String=''): TObjectList; var FWSList: TObjectList; FMList: TObjectList; FMyWorkstation: TWorkstation; I: Integer; begin FWSList := TObjectList.Create; // Search in the database for workstations by using the criteria FWQuery.Close; FWQuery.SQL.Text := 'SELECT'; //etc FWQuery.Open; while not FWQuery.EOF do begin // Use search result to create a new workstation object FMyWorkstation := TWorkstation.Create; FMyWorkstation.SetID(FWQuery.FieldByName('ArbeitsplatzID').AsInteger); FMyWorkstation.SetMonitor1ID(FWQuery.FieldByName('MonitorID').AsInteger); //etc // Add workstation to a list of workstation ojects FWSList.Add(FMyWorkstation); FWQuery.Next; end; FWQuery.Free; Result := FWSList; // DIE FUNKTION LIEFERT ALSO EINE LISTE VON WORKSTATION OBJECTS ZURUECK end; Workstation Suche; Beinhaltet die Funktionsaufrufe
Delphi-Quellcode:
//procedure BTNCLICK
//etc FWSearch := Model.TWorkstationSearch.Create; FMSearch := Model.TMonitorSearch.Create; //etc else if (RBtnWorkstation.Checked) then {$REGION RBTNWorkstation} begin Grid.ColWidths[0] := 25; Grid.ColWidths[1] := 60; //etc Grid.Cells[0,0] := 'ID'; Grid.Cells[1,0] := ''; //etc FWList := FWSearch.DBSearch('vague',FMyID,FMyComputername,FMyModel, FMyInventoryNumber,FMyRoom,FMyUsername); // FWList wird mit WORKSTAION objects befüllt durch den Funktionsaufruf // Alle Workstation Objekte nun durchlaufen: I := 0; while (I<FWList.Count) do begin FMyWorkstation := FWList[I] as TWorkstation; // Fill the Grid with the information of the FMyWorkstation object Grid.Cells[0,Grid.RowCount-1] := IntToStr(FMyWorkstation.GetID); Grid.Cells[1,Grid.RowCount-1] := FMyWorkstation.Getname; //etc // Get Monitor Information FMyMonitorID := FMyWorkstation.GetMonitor1ID; FMList := FMSearch.DBSearch('vague',FMyMonitorID); FMyMonitor := FMList[0] as Model.TMonitor; Grid.Cells[3,Grid.RowCount-1] := FMyMonitor.GetModel; FMyMonitor.Free; Grid.RowCount := Grid.RowCount +1; Inc(I); end; end Wäre jemand so freundlich und würde das kurz verstehen und mir sagen wo die Probleme liegen, dass die Workstation Datenbank abfrage so viel Zeit und Speicher in Anspruch nimmt ? Würde es naemlich sehr gerne objektorientiert lösen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz