Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Splashscreen, Programm stürtzt ab


gd0123456 - Mi 22.05.13 21:01
Titel: Splashscreen, Programm stürtzt ab
Hallo,

Folgendes Problem: Ich möchte auf einen Buttonklick einen Splashscreen anzewigen lassen. Dies funktioniert auch soweit. In Form (Splashscreen) sollen dann die Daten aus der Datenbank gelesen werden und genau da liegt dann das Problem, er liest die Daten aus bzw. kopiert auch die Daten, jedoch zeigt er mir die Form dann nicht mehr an bzw. iwann stürtzt das Programm ab. Was mache ich falsch?


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm14.BitBtn1Click(Sender: TObject);
begin
  application.CreateForm(TForm15,form15); //Splashscreen
  form15.ShowModal;
end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
procedure TForm15.FormShow(Sender: TObject);
var
 mandant_alt_id: integer;
 mandant_neu_id: integer;
 mandant_alt_name: string;
 mandant_neu_name: string;
 counter_leistung, counter_vers,counter_summe: integer;
begin
  mandant_alt_id := getMandantId(edit1.Text);
  mandant_neu_id := getMandantid(edit2.Text);

//Auslesen vorhandenere Leistungen  
  adodataset1.CommandText := 'select count(*) from leistung where mandant = '+inttostr(mandant_alt_id);
  adodataset1.Active := true;
  counter_leistung:= strtoint(adodataset1.FieldByName('count(*)').Text);
  adodataset1.Next;
  adodataset1.Close;

  counter_summe := counter_leistung+counter_vers;

  //DIe Summe beider Tabellen soll das Maximum für die Progressbar sein
  progressbar1.Max := counter_summe;

  adodataset1.CommandText := 'select name,kurzname,preis,mandant,nr from leistung where mandant = '+inttostr(mandant_alt_id);
  adodataset1.Active := true;
  while not (adodataset1.Eof) do
  begin
  Application.ProcessMessages;
     adocommand1.CommandText := 'insert into leistung (name,kurzname,preis,mandant,nr) values ("'+adodataset1.FieldByName('name').Text+'","'+adodataset1.FieldByName('kurzname').Text+'",'+stringreplace(adodataset1.FieldByName('preis').Text,',','.',[rfReplaceAll])+','+inttostr(mandant_neu_id)+',"'+adodataset1.FieldByName('nr').Text+'")';
    adocommand1.Execute;
    progressbar1.Position := progressbar1.Position +1;
    adodataset1.Next;
  end;
  adodataset1.Close;

end;


Das Programm reagiert dann nicht mehr, aber es wurden alle DS kopiert. Was mache ich falsch? bzw. wie kann ich den Splashscreen sehen und den Fortschrittsbalken. Danke für die Hilfe.

Edit: bei ein paar Datensätzen funktioniert es auch so wie es soll, wenn es aber immer mehr und mehr werden dann hängt es bzw. erscheint der Splashscreen nicht.


Nersgatt - Do 23.05.13 13:11

Das Problem wird sein, dass Du dem Betriebssystem keine Zeit lässt, das Formular auch anzuzeigen.
Füg mal ganz am Anfang von .FormShow ein Application.ProcessMessages ein. Allerdings ist das nur die "Pfuschlösung". Normalerweise würde ich die Arbeit auslagern und das Formular nur vielleicht zur Statusanzeige benutzen.