Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#6

AW: Große Datenmenge in LookupCombo zur Verfügung stellen

  Alt 24. Apr 2017, 21:39
Also beim Programmstart würdest du die 1,4 Mio. Datensätze erst mal einlesen. Das würde natürlich auch zu einer Beeinträchtigung der GUI führen, deswegen wäre es auch dort sinnvoll das ganze über einen Thread zu lösen.

Hier mal ein Threadgerüst (ist nur so zusammengekloppt)

Delphi-Quellcode:
unit LoadLookupDataThread;

interface

uses classes;

Type
  TOnNewSernr=procedure(sender: TObject; SerNr: string) of object;
  TOnThreadFinished=procedure(sender: TObject; MaxID: integer) of object;

  TLoadLookupData=class(TThread)
  private
    FDBHost, FDBUser, FDBPass: string;
    FLastVersionnr: integer;
    FOnNewSernr: TOnNewSernr;
    FOnTheadFinished: TOnThreadFinished;
    procedure DoOnNewSernr(Sernr: string);
    procedure DoOnThreadFinished(MaxID: integer);
  public
    constructor Create(suspended: boolean; DBHost, DBUser, DBPass: string;
      LastVersionNr: Integer);
  protected
    procedure Execute; override;
  published
    property OnNewSerNr: TOnNewSernr read FOnNewSernr write FOnNewSernr;
    property OnThreadFinished: TOnThreadFinished read FOnTheadFinished write FOnTheadFinished;
  end;

implementation

{ TLoadLookupData }

constructor TLoadLookupData.Create(suspended: boolean; DBHost, DBUser,
  DBPass: string; LastVersionNr: Integer);
begin
  inherited Create(suspended);
  Self.FreeOnTerminate:=True;
  Self.NameThreadForDebugging('LoadLookupDataThread');
  FDBHost:=DBHost;
  FDBUser:=DBUser;
  FDBPass:=DBpass;
  FLastVersionnr:=LastVersionNr;
end;

procedure TLoadLookupData.DoOnNewSernr(Sernr: string);
begin
  if Assigned(FOnNewSernr) then
    Synchronize(procedure
      begin
        FOnNewSernr(self, Sernr);
      end);
end;

procedure TLoadLookupData.DoOnThreadFinished(MaxID: integer);
begin
  if Assigned(FOnTheadFinished) then
    Synchronize(procedure
      begin
        FOnTheadFinished(self, MaxID);
      end);
end;

procedure TLoadLookupData.Execute;
var
  FDBConnection: TDBConnection;
  FDBQuery: TDBQuery;
  MaxID: integer;
begin
  MaxID: FLastVersionnr;
  FDBConnection:=TDBConnection.Create(nil);
  FDBQuery:=TDBQuery.Create(nil);
  try
    FDBConnection.Host:=FDBHost;
    FDBConnection.User:=FDBUser;
    FDBConnection.Password:=FDBPass;
    FDBConnection.connect;
    if FDBConnection.connected then
    begin
      FDBQuery.Connection:=FDBConnection;
      FDBQuery.SQL.Text:='Select Sernr, Id from Seriennummern where ID>:id';
      FDBQuery.Params.parseSQL(FDBQuery.SQL.Text, True);
      FDBQuery.Params.paramValue['id']:=FLastVersionnr;
      FDBQuery.Active:=True;
      while not FDBQuery.Eof do
      begin
        DoOnNewSernr(FDBQuery.Fieldbyname('Sernr').AsString);
        if FDBQuery.Fieldbyname('id').asInteger>MaxID then
          MaxID:=FDBQuery.Fieldbyname('id').AsInteger;
        FDBQuery.Next;
      end;
      FDBQuery.Active:=False;
    end;
  finally
    FDBConnection.Free;
    FDBQuery.Free;
    DoOnThreadFinished(MaxID);
  end;
end;

end.
aufruf:

Delphi-Quellcode:
var
  LastID: Ingeger=-1; //irgendwo definieren

procedure TForm1.LadeLookupDaten;
var
  tld: TLoadLookupData;
begin
  ComboBox1.Items.clear;
  tld:=TLoadLookupData.create(false, Hostname, Username, Password, MaxID);
  tld.OnNewSernr:=NewSernr;
  tld.OnThreadFinished:=Einlesenfertig
  tld.Resume;
end;

procedure TForm1.NewSernr(sender: TObject; Sernr: string);
begin
  ComboBox1.Items.Add(Sernr);
end;

procedure TForm1.Einlesenfertig(Sender: TObject; MaxID: integer);
begin
  LastID:=MaxID
  ShowMessage('Alle Lookup-Daten eingelesen';
end;
Bevor nun die Form angezeigt wird, wo dann das Lookup benötigt wird, rufst du den Thead erneut auf, übergibts dann aber mit LastID eben die letzte zurückgelieferte LastID.
Ist natürlich nur ein Beispiel, dass du jetzt nach deinen Anforderungen anpassen musst.
Und die Lookupdaten solltest du natürlich sortieren, sonst nützt das blättern natürlich auch nichts, dass ansonsten ja alle neuen Sernr hinten angefügt würden.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (24. Apr 2017 um 21:44 Uhr)
  Mit Zitat antworten Zitat