Delphi-PRAXiS
Seite 3 von 3     123   

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 Erscheinen (https://www.delphipraxis.net/119372-erscheinen.html)

Schwedenbitter 25. Okt 2010 23:12

AW: Erscheinen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

wie gesagt: AnimateWindow() klappt bei meinem TurboDelphi nicht. Aber ich habe 2 Lösungen gefunden. Eine als Object, dass man einfach auf die Form zieht und dann konfigurieren kann. Und eine Lösung als Procedure() mit "Timer-Gedöns". Letzteres könnte man wohl auch durch Sleep() ersetzen. Dazu habe ich aber nun keine Lust mehr :-D

Viel Spaß beim Benutzen.

Gruß, Alex

Schwedenbitter 26. Okt 2010 13:46

AW: Erscheinen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

falls es nicht schon bemerkt wurde. Es gibt noch ein paar kleinere Fehler in der Komponente. Bis auf einen habe ich diese ausgemerzt. Es bleibt aber ein Problem bestehen:

Ich habe einiges aus einer Komponente übernommen, die ursprünglich für Delphi 6 entwickelt wurde. Da ich TurboDelphi benutze, musste ich eine ganze Menge abändern. Am meisten Probleme bereitet mir das Ereignis OnActivate() der MainForm. Dieses wird - wie bei den anderen Forms übrigens auch - bereits beim Anlegen der Forms im Speicher zum Programmstart ausgelöst. Das war bei Delphi 6 noch nicht der Fall und bedurfte damit auch keiner besonderen Behandlung. Das Problem habe ich behoben, indem ich ein Boolean FCanFade definiert habe, dass bei OnCreate() auf False und bei OnShow() auf True gesetzt wird.

Es bleibt aber ein Problem, dass OnActivate() ab (oder nur bei?) TurboDelphi auch dann ausgelöst wird, wenn das MainForm (bei den anderen Forms besteht das Problem eigenartiger Weise nicht) den Focus von einem anderen modal angezeigten Form zurück erhält.
Delphi-Quellcode:
Procedure TTest.ButtonClick(Sender: TObject;
Begin
  SubForm.ShowModal;
  // <- hier kommt jetzt OnActivate() von TTest,
  // wenn TTest das MainForm ist.
End;

...

Procedure TSubForm.ButtonClick(Sender: TObecjt);
Begin
  SubsubForm.ShowModal;
  // <- hier wird KEIN Ereignis ausgelöst
End;
Wie bekomme ich das Activate in diesem Fall weg? Es geht nicht um OnActivat()! Das muss ich entweder nicht zuweisen oder kann das Problem selbst regeln.

Ich habe bereits in der Unit Forms von Delphi 6 und TurboDelphi nachgesehen. Da FOnActivate ausnahmslos an denselben Stellen ausgelöst wird, vertehe ich noch nicht einmal, wo das Problem liegt. Man eh! Ich bin so kurz vor dem Ziel :wall:

Kann mir da bitte jemand helfen?

Neueste Version anbei. Bei der Gelegenheit: Wie machen es die anderen, dass Sie immer gleich auf der ersten Seite die aktuellste Version ihres Codes einstellen? Dann könnte ich nämlich auch den alten raus- und den neuen reinstellen.

Sir Rufo 26. Okt 2010 14:04

AW: Erscheinen
 
Schau doch einfach mal in welcher Rubrik die ihren Thread gestartet haben ;)

Unter D2010 habe ich ein anderes Verhalten, als du beschrieben hast

Delphi-Quellcode:
{ Form1 ist MainForm }
Form2.Show;
Hier wird jetzt für Form2 OnActivate ausgeführt. Beim Wechsel zwischen den Forms wird für das jeweilige Form OnActivate ausgeführt.

Delphi-Quellcode:
{ Form1 ist MainForm }
Form2.ShowModal;
Hier wird nur für Form2 OnActivate ausgeführt und dann ist Ruhe (auch beim Schließen von Form2)

Diese Vorgehensweise ist für mich auch logisch, denn beim
Delphi-Quellcode:
Form2.ShowModal
wird der Kontext von Form1 ja nicht verlassen. Bei
Delphi-Quellcode:
Form2.Show
können aber beide Fenster aktiv sein und bei jedem Wechsel wird eben der Event ausgelöst.

Auch das Auslösen von OnActivate bei
Delphi-Quellcode:
TForm2.Create( nil )
kann ich hier auch nicht nachvollziehen. Da kommt nur das Event
Delphi-Quellcode:
OnCreate
und mehr würde ich auch nicht erwarten

Schwedenbitter 26. Okt 2010 17:32

AW: Erscheinen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1057846)
Schau doch einfach mal in welcher Rubrik die ihren Thread gestartet haben ;)

Ich habe keine Ahnung, was Du mir damit sagen willst.

Zitat:

Zitat von Sir Rufo (Beitrag 1057846)
Unter D2010 habe ich ein anderes Verhalten, als du beschrieben hast
...
Auch das Auslösen von OnActivate bei
Delphi-Quellcode:
TForm2.Create( nil )
kann ich hier auch nicht nachvollziehen. Da kommt nur das Event
Delphi-Quellcode:
OnCreate
und mehr würde ich auch nicht erwarten.

Genau das ist ja mein Problem bzw. ein Bestandteil des Problems. Komischer Weise kann ich dass nicht mehr rekonstruieren. Wenn ich mal eben kurz 2 Forms erstelle und auf der 2. Form bei
Delphi-Quellcode:
OnActivate
ein
Delphi-Quellcode:
ShowMessage('SubForm.OnActivate()');
eintrage, kommt das nicht mehr beim Programmstart. Ich habe beim Erstellen meiner Komponente aber zur Kontrolle für alle 5 Events jeweils Messages kommen lassen; und zwar sowohl in der Komponente als auch in den betreffenden Forms. Die Events reiche ich einfach nur durch.
Aber egal...

Da ich das Problem aber mittlerweile habe lösen können, habe ich auch keine Lust, mein Programm wieder zurück zu bauen.
Die Lösung war übrigens so einfach: Am Ende des Einblendens wird das FCanFade aus meinem letzten Beitrag einfach auch auf False und erst beim nächsten OnShow wieder auf True gesetzt. Damit gibt es kein Einblenden mehr, wenn ein nicht-modales Fenster geschlossen wird.

Danke, Alex

Sir Rufo 26. Okt 2010 20:01

AW: Erscheinen
 
Zitat:

Zitat von Schwedenbitter;
Neueste Version anbei. Bei der Gelegenheit: Wie machen es die anderen, dass Sie immer gleich auf der ersten Seite die aktuellste Version ihres Codes einstellen? Dann könnte ich nämlich auch den alten raus- und den neuen reinstellen.

Die erstellen ihren Thread in der Rubrik Software-Projekte der Mitglieder

Da geht das

Darum der Hinweis, schau nach der Rubrik wo dir das aufgefallen ist

Schwedenbitter 8. Nov 2010 11:44

AW: Erscheinen
 
@Sir Rufo

Danke für die doch recht ausführliche Antwort. Endlich habe ich das mit der Aktualisierung der Uploads verstanden. Das Problem ist nur, dass ich ja nicht immer ein Softwareprojekt aus einer Sache machen will.

Ich hoffe insoweit auch, dass meine weitere Frage aber schon zu der aktuellen Rubrik passt:
Ich habe in meinem Code eingebaut, dass das Faden sowohl beim Ein- als auch beim Ausblenden mit dem Alpha-Wert endet bzw. beginnt, den der Entwickler zur Laufzeit oder bereits beim Entwurf festgelegt hat. Der Code soll ja individuell einsetzbar sein. Beim Einblenden gibt es da kein Problem. Ich selbst setze Visible erst auf True. Aus diesem Grunde merke ich mir AlphaBlendValue und ändere diesen von 0 an schrittweise bis zum alten Wert.

Beim Ausblenden flackert es aber. Dies ist bedingt dadurch, dass ich sofort nachdem AlphaBlendValue den Wert 0 erreicht hat, Visible:=False; setze und dann AlphaBlendValue wieder auf den alten Wert. Komischer Weise bewirkt das setzen von Visible aber nur etwas auf langsamen Rechnern. Bei schnellen kommt der alte Alpha-Wert eher an als Visible:=False; Auch ein Application.ProcessMessages; sofort nach dem Setzen von Visible bringt nichts.

Ich habe daher die Idee, den alten Wert nicht in AlphaBlendValue, sondern in TForm.Tag zu speicher. Die Idee für so etwas ist sicher nicht neu.

Meine Frage ist nur, ist das üblich, kann man das bedenkenlos machen oder handelt man sich dann andere Probleme ein?

Ich hoffe, mich verständlich ausgedrückt zu haben. Ansonsten bitte nachfragen.

Gruß, Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 Uhr.
Seite 3 von 3     123   

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 by Thomas Breitkreuz