Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Invalid Pointer TObjectList (https://www.delphipraxis.net/119010-invalid-pointer-tobjectlist.html)

bl3nder 19. Aug 2008 15:13


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:

    FList := 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;
Das Programm läuft trotz des Fehlers aber den Fehler möchte ich natürlich wegbekommen

Weiß einer Rat ?

Deep-Sea 19. Aug 2008 15:17

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]

bl3nder 19. Aug 2008 15:25

Re: Invalid Pointer TObjectList
 
Ok Vielen Dank, wusste ich nicht.

Apollonius 19. Aug 2008 15:30

Re: Invalid Pointer TObjectList
 
FMyCompuer musst du auch nicht erzeugen, bevor du auf die Liste zugreifst. Sonst hast du ein Speicherleck.

bl3nder 19. Aug 2008 15:31

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 :/

Deep-Sea 19. Aug 2008 15:32

Re: Invalid Pointer TObjectList
 
Zitat:

Zitat von bl3nder
Hmm ok danke schonmal guter Anfang die Lecks zu finden. Ich weiß sonst echt nicht mehr wo die 3KB pro DB abfrage herkommen :/

Autsch, na dann mal viel Glück beim Suchen ...
PS: Try-finally nutzen :wink:

Neutral General 19. Aug 2008 16:53

Re: Invalid Pointer TObjectList
 
Zitat:

Zitat von Apollonius
FMyCompuer musst du auch nicht erzeugen, bevor du auf die Liste zugreifst. Sonst hast du ein Speicherleck.

Das Gleiche gilt für FList ;)

bl3nder 20. Aug 2008 10:18

Re: Invalid Pointer TObjectList
 
Zitat:

Zitat von Neutral General
Zitat:

Zitat von Apollonius
FMyCompuer musst du auch nicht erzeugen, bevor du auf die Liste zugreifst. Sonst hast du ein Speicherleck.

Das Gleiche gilt für FList ;)

Kann ich nicht bestätigen. Habe durch das Weglassen von

Delphi-Quellcode:
FList := TObjectList.Create;
eine Adressverletzung bekommen... ?

Neutral General 20. Aug 2008 10:20

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

Deep-Sea 20. Aug 2008 10:22

Re: Invalid Pointer TObjectList
 
Zitat:

Zitat von bl3nder
Habe durch das Weglassen von

Delphi-Quellcode:
FList := TObjectList.Create;
eine Adressverletzung bekommen... ?

Vlt. weil du zwischen "FList := TObjectList.Create;" und "FList := FCSearch.DBSearch('vague',FMyCCriteria);" auf FList zugreifst?! Sry, wir kennen deinen Code ya nicht :wink:

bl3nder 26. Aug 2008 09:55

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:
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;
WORKSTATION SUCH FUNKTION
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