Autor Beitrag
gd0123456
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33



BeitragVerfasst: Mi 22.05.13 21:01 
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?

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


ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)