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 Form aus DLL. Problem mit JVWaitGradient! (https://www.delphipraxis.net/52024-form-aus-dll-problem-mit-jvwaitgradient.html)

Sillium 22. Aug 2005 20:37


Form aus DLL. Problem mit JVWaitGradient!
 
Hallo,

nachdem ich jetzt schon den halben Tag in verschiedenen Delphi-Foren nach Lösungen gesucht hab frag ich jetzt hier mal nach ner Lösung.

Also mein Problem:

Ich habe mir eine Dll erstell, in der alle meine standart funktionen untergebracht sind. Die funktionieren alle auch ganz fein!!

Eine dieser Funktionen ist etwas Zeitaufwendiger und um diese Zeit zu überbrücken oder zu zeigen, dass was passiert, erstelle ich in der DLL eine Splash-Form mit der Jedi-Komponete JVWaitGradient (quasi eine ProgressBar in der immer ein Balken hin und her läuft) und nachdem die funktion zuende ist wird auf der vorm ein Panel erzeugt, dass darazf hinweist, dass diese fertig ist (kleine Spielerei!!). Die Form, Komponente und Panel wird auch alles sauber angezeigt. Allerdings sollte wie gesagt ein Balken in meinem JVWaitGradient hin und herlaufen, doch der Balken steht und macht nix!

Erst mal die Frage:

WARUM???

Und jetzt ein bißchen Code:

Code:
  .
  .
  .
  .
Splash2:=TSplash2.Create(Application);
      JvWaitingGradient2:=TJvWaitingGradient.Create(nil);
      with JvWaitingGradient2 do
      begin
        Parent:=Splash2.JvPanel1;
        Left := 1;
        Top := 1;
        Width := 248;
        Height := 18;
        Active := True;
        Align := alClient;
        Color := 4479052;
        GradientWidth := 150;
        EndColor := 7391439;
        ParentColor := False;
        AlwaysRestart := True;
        StartColor := 4958149;
      end;
      Splash2.JVLabel1.Font.Size := 10;
      Splash2.JVLabel1.Caption := 'Installing ' + name + '...';
      Splash2.Show;
      Splash2.Update;
             .
             .
      //Mach was!
             .
             .
      JvPanel:=TJvPanel.Create(nil);
      with JvPanel do
        begin
          Parent:=Splash2;
          Caption:='Installing done!';
          Width:=250;
          Height:=50;
          Left:=25;
          Top:=5;
          Font.Color := clWhite;
          Font.Size :=14;
          Font.Style := [fsBold];
          Flatbordercolor := $00556F60;
          Flatborder:= true;
          Color:= $00556F60;
      end;
      Splash2.Update;
      sleep(1000);
      Splash2.Close;
      Splash2.Release;
Ich hab grad festgestellt, dass ich das auch alles in einer extra prozedur machen kann, aber des ist ja erstmal wurst!

Hoffe mein Problem ist klar geworden!!

Danke soweit!

Sillium 4. Sep 2005 12:17

Re: Form aus DLL. Problem mit JVWaitGradient!
 
Bevor ich dieses Problem nochmal poste und hoffe, dass so jemand darüberstopert, der ne Antwort weiß, Antworte ich mir mal selbst und schiebe es so wieder nach vorne!!

Wenn das hier nicht erlaubt ist, dann tut mir mein sträfliches Verhalten leid!

So jetzt hoffe ich nur noch, dass jemand ne Antwort hat!

DGL-luke 4. Sep 2005 19:25

Re: Form aus DLL. Problem mit JVWaitGradient!
 
pushen ist ab 24 Stunden Wartezeit erlaubt ;)

Nun, das Problem ist eigentlich ganz schnell erklärt:
Das ganze läuft im gleichen Thread, und in einem Thread können nicht zwei Dinge gleichzeitig(Laden und Animieren des Gradients) passieren.

Du musst also das anzeigen oder das Laden in einen eigenen thread auslagern.

Es wundert mich allerdings, dass die Komponente das nicht von sich aus macht....

Sillium 5. Sep 2005 18:54

Re: Form aus DLL. Problem mit JVWaitGradient!
 
Danke für die Antwort!


Ich habe den Code der Komponente auch so verstanden, dass diese zu zeichnen einen eigenen Thread startet!

Delphi-Quellcode:
             .
             .
             .
             .
             .
constructor TJvWaitingGradient.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  {(rb) csOpaque included }
  ControlStyle := ControlStyle + [csOpaque];

  FBitmap := TBitmap.Create;

  FStartColor := clBtnFace;
  FEndColor := clBlack;
  FGradientWidth := 50;
  FLeftOffset := -FGradientWidth;
  FSourceRect := Rect(0, 0, FGradientWidth, Height);
  FDestRect := Rect(0, 0, FGradientWidth, Height);
  FFromLeftToRight := True;

  FScroll := TJvImageDrawThread.Create(True); <--------- Thread, der den laufenden Balken zeichnet!!
  FScroll.FreeOnTerminate := False;
  FScroll.Delay := 50;
  FScroll.OnDraw := Deplace;
  // (p3) don't set color: it will set ParentColor to False
//  Color := clBtnFace;

  { (rb) Set the size properties last; will trigger Resize }
  // (rom) also always set the default values
  Height := 10;
  Width := 100;
end;
             .
             .
             .
             .
             .
             .
             .
Hab allerdings noch nicht ausprobiert für das zeichnen selbst einen Thread zu starten!
Mach ich aber gleichmal!

jbg 5. Sep 2005 19:47

Re: Form aus DLL. Problem mit JVWaitGradient!
 
Das eigentliche Zeichnen passiert im Hauptthread, weil die VCL nicht threadsafe ist. Und das TThread.Synchronize fügt eine Botschaft in die MessageQueue des Application.Handles ein. Wenn also kein Application.ProcessMessages, oder Application.Run die Botschaft abarbeitet, steht der Thread.

Sillium 5. Sep 2005 20:29

Re: Form aus DLL. Problem mit JVWaitGradient!
 
Ok,

ich kann dir vom Prinzip her folgen!

Aber was heißt das konkret??

Wie müßte ich dann die Botschaft abarbeiten??

Code-Beispiel?

Oder wo finde ich denn eine kurze zusammenfassung von der Theorie dazu??

Danke!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 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