Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Ich brauch eine Mischung zwischen Show und ShowModal (https://www.delphipraxis.net/79498-ich-brauch-eine-mischung-zwischen-show-und-showmodal.html)

gsh 23. Okt 2006 22:13


Ich brauch eine Mischung zwischen Show und ShowModal
 
Hi DPler

Also ich hab in meinem projekt ein Hauptfenster und wenn man da jetzt eine aktion ausführt dann will ich das ein zweites kleines Fenster angezeigt wird wo der fortschritt von der Aktion dargestellt wird. Nun hab ich aber das Problem das man wenn ich das Formular mit schow anzeige man zur Hauptform zurück klicken kann und unter umständen fehler verursachen könnte, aber wenn ich es mit ShowModal aufrufe dann wartet er solange bis ich es wieder schliesse und das ist auch sehr ungut.

Also brauch ich einen Mittelweg das der code zwar weiter ausgeführt wird man aber nicht zum Hauptformular zurück klicken kann.

PS: Die ganze Aktion in einen Thread auszulagern wäre sehr komplitziert und aufwändig

alzaimar 23. Okt 2006 22:15

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Geht nicht Hauptformular.Enabled := False?

Flare 23. Okt 2006 22:16

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Reicht es, wenn das 2. Formular StayOnTop ist?

Aber ansonsten wäre ein Thread wirklich die Lösung und so umständlich ist das echt nicht.


Flare

gsh 23. Okt 2006 22:28

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Zitat:

Zitat von alzaimar
Geht nicht Hauptformular.Enabled := False?

stimmt danke. an das enabled hab ich gar nicht getacht
Hab des jetzt so gelöst und des funkt super:
Delphi-Quellcode:
procedure TfrmFortschritt.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  frmHaupt.Enabled := true;
end;

procedure TfrmFortschritt.FormShow(Sender: TObject);
begin
  frmHaupt.Enabled := false;
end;
Zitat:

Zitat von Flare
Reicht es, wenn das 2. Formular StayOnTop ist?

Aber ansonsten wäre ein Thread wirklich die Lösung und so umständlich ist das echt nicht.

ne hätte nicht gereicht ... außerdem wäre es für mich nicht eine sehr schöne lösung gewesen
und in meinem Fall ist des ganze in einem Thread bzw. in mehere Threads einzubauen eher schwieriger gewesen

Trotzdem danke :cheers:

Flare 23. Okt 2006 23:51

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Zitat:

Zitat von gsh
ne hätte nicht gereicht ... außerdem wäre es für mich nicht eine sehr schöne lösung gewesen

Hätte ja sein können, dass du wirklich nur ein einfaches Anzeigefenster haben möchtest was immer zu sehen ist...


Flare

alzaimar 24. Okt 2006 06:45

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Zitat:

Zitat von gsh
... außerdem wäre es für mich nicht eine sehr schöne lösung gewesen
und in meinem Fall ist des ganze in einem Thread bzw. in mehere Threads einzubauen eher schwieriger gewesen

DAS glaube ich nicht. :mrgreen: Vor allen Dingen, weil Du ein Anzeigefenster benötigst...

hoika 24. Okt 2006 12:12

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Hallo

Delphi-Quellcode:
function TForm_PEP__Main.LoadData: Boolean;
var
  FrmStatus : TForm_Status;
  WindowList : Pointer;
begin
  Result:= False;

  try
    FrmStatus:= CreateStatusForm;

    try
     { to make form "semimodal" }
      WindowList:= DisableTaskWindows(frmStatus.Handle);
      try
        // Formular anzeigen
        FrmStatus.Show;

        // Schleifenverarbeitung
        Repeat
         { 6957, "Daten werden geladen"
           6958, "Bitte haben Sie einen Moment Geduld" }
          FrmStatus.iCaption := 6957;
          FrmStatus.iInfo   := 6958;

          // Nachrichtenverarbeitung zulassen
          Application.ProcessMessages;
       // hier passiert das wichtige

          Result:= InternalLoad(FrmStatus);

          break;
        // bis Verarbeitung fertig oder Benutzerabbruch
        until False;
      finally
        // Semi-Modalität aufheben
        EnableTaskWindows(WindowList);
        // Fenster verstecken
        FrmStatus.Hide;
      end;
    finally
      // Fenster wieder freigeben
      FrmStatus.Free;
    end;
  except
  end;
end; { LoadData }
Heiko

NaPsTeRforever 18. Aug 2009 20:39

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
wie genau muss ich das genza verwenden?!

Habe eine procedure die ca. 5-10 sec läuft, in der Zeit würde ich gerne einen wait-screen anzeigen lassen!

Bei der function kommen bei mir Fehler:
Undefinierter Bezeichner: 'CreateStatusForm'
Undefinierter Bezeichner: 'iCaption'
usw

hoika 18. Aug 2009 21:11

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Hallo,

ahhhh, meins !!!


FrmStatus:= CreateStatusForm;

einfach nen
FrmStatus:= TFrmStatus.Create(Self)

oder

FrmStatus:= TFrmStatus.Create(NIL)



TFrmStatusist das "Info"-Form.
Das kann z.B. auch sowas wie nen Progressbar haben ...


iCaption ist ein property

property iCaption: Integer
write SetCaption

SetCaption
Caption:= LoadString(XXX)


das macht es einfacher, eine Info als String-Ressource
im Caption anzuzeigen.
Es kapselt nur das LoadString



Heiko

NaPsTeRforever 18. Aug 2009 21:37

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
hmm ich verstehe nur Bahnhof :D

Ich habe eine procedure die einige listviews mit Werten füllt, dauert einige Sekunden!
In der Zeit würde ich gerne ein Ladescreen anzeigen, ist das mit deiner function möglich und wenn ja wie genau :D

alzaimar 19. Aug 2009 05:02

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Erstelle Dir einfach ein Formular ('FormLadeAnzeige') und zeige es zu Beginn des Ladevorganges mit 'FormLadeAnzeige.Show' an. Beim Beenden verbirgst Du das Formulat mit 'FormLadeAnzeige.Hide'.

Wenn Du weisst, wie viele Daten Du einliest, kannst du auch noch eine Progressbar auf der FormLadeAnzeige unterbringen, und die Position des Fortschrittsbalkens inn deiner Schleife erhöhen.

Frage: Wieso braucht das Einlesen einer Listbox so lange? Mehr als 10-50 Einträge sollten dort doch nicht drin stehen, denn wer scrollt schon 100000 Einträge durch?

Weiterhin kann man das Laden durch Verwendung der 'ListBox.Items.BeginUpdate/EndUpdate' wesentlich beschleunigen.

hoika 19. Aug 2009 07:11

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Hallo,

die Variante mit dem Show hat den Nachteil,
dass mit dem darunterliegenden Form auch noch gearbeitet werden kann,
Hide versteckt, OK, sieht aber manchmal doof aus ;)
Deswegen mein Ansatz mit dem "semimodal".

Nochmal der Code.

Delphi-Quellcode:
function TForm_PEP__Main.LoadData: Boolean;
var
  FrmStatus : TForm_Status;
  WindowList : Pointer;
begin
  Result:= False;

  try
    FrmStatus:= TForm_Status.Create(NIL);

    try
     { to make form "semimodal" }
      WindowList:= DisableTaskWindows(frmStatus.Handle);
      try
        // Formular anzeigen
        FrmStatus.Show;

        // Schleifenverarbeitung
        Repeat
          FrmStatus.Caption := 'Lade Daten';
          FrmStatus.Label1.Caption:= 'Daten 1';
          // Nachrichtenverarbeitung zulassen
          Application.ProcessMessages;
       // hier passiert das wichtige Daten 1

          FrmStatus.Label1.Caption:= 'Daten 2';
          // Nachrichtenverarbeitung zulassen
          Application.ProcessMessages;
       // hier passiert das wichtige Daten 2

          break;
        // bis Verarbeitung fertig oder Benutzerabbruch
        until False;
      finally
        // Semi-Modalität aufheben
        EnableTaskWindows(WindowList);
        // Fenster verstecken
        FrmStatus.Hide;
      end;
    finally
      // Fenster wieder freigeben
      FrmStatus.Free;
    end;
  except
  end;
end; { LoadData }
Definiere eine Form (TForm_Status).
Packe, wenn du willst ein Label drauf (Label 1).

Und dann in deinem Form (hier TForm_PEP__Main), den obigen Code.


Heiko

NaPsTeRforever 19. Aug 2009 13:38

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Zitat:

Zitat von alzaimar
Frage: Wieso braucht das Einlesen einer Listbox so lange? Mehr als 10-50 Einträge sollten dort doch nicht drin stehen, denn wer scrollt schon 100000 Einträge durch?

Es werden mehrere Listviews gefüllt mit Daten aus dem Internet!

@hoika
Habe nun eine Form und die Funktion ins Hauptpogramm gepackt!
Jetzt habe ich eine Button procedure (login) die eben nach erfolgreichem login die ganzen Listviews füllt.
Wo wie schreib ich da jetzt was rein um deine Function zu nutzen?!

hoika 19. Aug 2009 14:00

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Hallo,

// hier passiert das wichtige Daten 1
// hier passiert das wichtige Daten 2

genau hier packst du das Laden rein.
In meinem ursprünglichen Posting hiess das noch InternalLoad,
weil ich das LV-Füllen nicht in diesen ganzen Form-Code reinpacke,
sondern in eine Extra-Methode.


Heiko

mquadrat 19. Aug 2009 14:13

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Wie wär's damit:

Aktion in eine Klasse packen. Die Klasse instanziieren und mit allen nötigen Daten versorgen. Anschließend das Wait-Form via showModal aufrufen und dort mit der Klasse die eigentliche Funtkion ausführen. Wenn die fertig ist das Form wieder zu machen.

Kann man so ausbauen, dass es eine Art Pseudo-Thread ist. Also beispielsweise mit einer festen run() Methode und Events, an denen man den Fortschritt einer Progressbar festmachen kann.

Gelobt sei OOP :D

hoika 19. Aug 2009 14:21

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Hallo,

dann aber eine Basisklasse mit virtuell/abstrakten Methoden
(die benutzt dann das Info-Form)
und Ableitung der Load-Klasse von dieser Basisklasse.

Oder Interfaces ...


Heiko

mquadrat 19. Aug 2009 14:30

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Stimmt, hätte ich dazu schreiben können. Ich geh halt davon aus, dass Programmierer im Jahr 2009 das OO Paradigma verstanden haben sollten bevor sie Programme schreiben.

NaPsTeRforever 19. Aug 2009 14:53

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Zitat:

Zitat von hoika
Hallo,

// hier passiert das wichtige Daten 1
// hier passiert das wichtige Daten 2

genau hier packst du das Laden rein.
In meinem ursprünglichen Posting hiess das noch InternalLoad,
weil ich das LV-Füllen nicht in diesen ganzen Form-Code reinpacke,
sondern in eine Extra-Methode.


Heiko

ok super soweit verstanden :D
Muss ich halt nur meine procedure irgendwie auseinanderpflücken bzw in gewissen Abständen dieses Application.ProcessMessages; einfügen!
Kann ich anstelle des Labels nicht eine progressbar nehmen, will eigtl eine visuelle Fortschrittsanzeige haben oder mit Prozent irgendwas?!

Den Rest der Beiträge peil ich leider nicht, bin keine Programmierer, nur ein Noob der keine Ahnung hat und Langeweile ;-)

mquadrat 19. Aug 2009 15:08

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Wenn du eh Langeweile hast, dann wäre das der ideale Moment um sich mit dem Begriff "Abstrakte Klassen / Methoden" vertraut zu machen ;

NaPsTeRforever 19. Aug 2009 15:18

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Zitat:

Zitat von mquadrat
Wenn du eh Langeweile hast, dann wäre das der ideale Moment um sich mit dem Begriff "Abstrakte Klassen / Methoden" vertraut zu machen ;

kein Bedarf danke


Habe den waitscreen von heiko jetzt am laufen und brauche nur noch einen kleinen Tipp bzgl einer Progressbar!

mquadrat 19. Aug 2009 15:26

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Wenn du das Füllen mit in die Methode gepackt hast, dann hast du ja Zugriff auf das Form. Also statt dem Setzen der Label Caption setzt du eben Min, Max und Pos der Progressbar. Dann halt in deine Schleife ein ProcessMessages rein, sont wird das Fenster und damit die Bar nicht neu gezeichnet.

NaPsTeRforever 19. Aug 2009 16:02

Re: Ich brauch eine Mischung zwischen Show und ShowModal
 
Zitat:

Zitat von mquadrat
Wenn du das Füllen mit in die Methode gepackt hast, dann hast du ja Zugriff auf das Form. Also statt dem Setzen der Label Caption setzt du eben Min, Max und Pos der Progressbar. Dann halt in deine Schleife ein ProcessMessages rein, sont wird das Fenster und damit die Bar nicht neu gezeichnet.

ok super läuft soweit, etwas rucklig aber naja :D

Delphi-Quellcode:
  FrmStatus.sProgressbar1.Min := 0;
  FrmStatus.sProgressbar1.Max := 100;
  FrmStatus.Label1.Caption:= 'login...';
  FrmStatus.Label2.Caption:= '10%';
  FrmStatus.sProgressbar1.Position := FrmStatus.sProgressbar1.Position + 10;
  Application.ProcessMessages;
  ...usw


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz