Einzelnen Beitrag anzeigen

bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#11

Re: Invalid Pointer TObjectList

  Alt 26. Aug 2008, 08:55
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.
  Mit Zitat antworten Zitat