![]() |
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:
Ich hab grad festgestellt, dass ich das auch alles in einer extra prozedur machen kann, aber des ist ja erstmal wurst!
.
. . . 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; Hoffe mein Problem ist klar geworden!! Danke soweit! |
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! |
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.... |
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:
Hab allerdings noch nicht ausprobiert für das zeichnen selbst einen Thread zu starten!
.
. . . . 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; . . . . . . . Mach ich aber gleichmal! |
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.
|
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 09:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz