![]() |
Erscheinen
Wie kann ich in Delphi, Editfelder usw. erscheinen lassen, ohne das ich "caption" verwende?
|
DP-Maintenance
Dieses Thema wurde von "Phoenix" von "Multimedia" nach "VCL / WinForms / Controls" verschoben.
Falsche Sparte.. hier gehts um Controls |
Re: Erscheinen
wie meinst du erscheinen lassen ohne caption, versuch einmal Komponente.Visible:= true (false, wenn du sie verschwinden lassen willst)
|
Re: Erscheinen
Bitte gebe Deinem Titel durch den Button 'Edit' rechts oben noch einen passenderen Titel.
Es ist aussagekräftiger, wenn dort auch steht was genau wann wie erscheinen soll. Dann kann man sich unter der Frage auch was vorstellen und Du wirst schneller Antwort erhalten. Edit: Tippfehler :oops: |
Re: Erscheinen
Er meint wahrscheinlich einen Fade In - Fade Out Effekt !
Zuerst einmal musst du eine Komponente ALphaBlend-fähig machen Dann erreichst du das Fading, indem du den BlendValue um jede Zeiteinheit X um Y erhöhst ! ;) |
Re: Erscheinen
Oder die
![]() |
AW: Re: Erscheinen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Zitat:
Ich habe mal meinen Beispielcode angefügt. In diesem wird das MainForm einmal mit meiner Routine aus- und per Timer wieder eingeblendet und ein weiteres Mal mit ![]() Da ich nicht weiß, ob es am Code oder meinem Compiler (TurboDelphi) liegt, ist die exe auch mit dabei. AnimateWindow wäre mir - da kürzer und wegen API resourcenschonender - lieber. Wie kann ich das Problem mit den Controls lösen? Gruß und Dank, Alex |
AW: Erscheinen
Versuch doch nach Ende der Animation mal ein Refresh.
|
AW: Erscheinen
Zitat:
Ich habe hier noch ein altes Delphi 6. Wenn ich den Code damit compiliere, dann klappt es. Allerdings verstehe ich das insoweit nicht, als sowohl Turbodelphi als auch Delphi 6 für AnimateWindow die API-Funktionen benutzen und laut Quellcode beide dieselbe Routinen mit denselben Parametern benutzen :roll: Gruß, Alex |
AW: Erscheinen
Tja, merkwürdig. Ich bin nur auf das Refresh gekommen, da die Controls nach einem Verschieben des Fensters außerhalb des sichtbaren Bildschirmbereiches und wieder zurück dann sichtbar waren.
|
AW: Erscheinen
Zitat:
Danke für das Probieren! Hast Du die exe probiert oder auch den Quelltext mal compiliert? Wie gesagt: mich deprimiert, dass es mit Delphi 6 anstandslos klappt. Ich wollte aber gern in ein bestehendes, großes Projekt ein- und ausblendende Fenster einbauen. In diesem werden viele Funktionen verwendet, die es anno Delphi 6 nicht gab. Ich kann das daher nicht einfach mit Version 6 compilieren :wall: Gruß, Alex |
AW: Erscheinen
Ich hatte nur das Kompilat laufen lassen. Im Moment bin ich unter Linux on, kann aber morgen gern einmal das Projekt kompilieren und dann noch einmal schauen (Delphi 2007).
|
AW: Erscheinen
Guten Morgen!
Hattest Du das Kompilat unter Linux/Wine laufen lassen? Bzgl. des Kompilierens kann ich warten. Ich habe jetzt eine neue Version angehängt. Hier irgendwo im Forum hatte ich den Tipp gefunden, es über einen Timer flüssiger zu machen. Das habe ich getan. Es ist aber nicht komfortabel und ich möchte es daher gern in ein Object/eine Komponente kapseln. Die Idee hatte ich schon gestern morgen. Allerdings bin ich daran gescheitert. Ich fand keine Lösung dazu, einem zur Laufzeit angelegten TTimer erfolgreich das Ereignis OnTimer zuzuweisen. Und bei SetTimer/KillTimer weiß ich nicht, ob/wie ich innerhalb eines Aufrufs den Timer platt machen kann. Bei einem TTimer genügt dazu ja, wenn ich im Ereignis OnTimer Timer.Enabled:=False; setze... Vielleicht kann mir dazu jemand/Du noch einen Tipp geben. Gruß, Alex |
AW: Erscheinen
Liste der Anhänge anzeigen (Anzahl: 1)
Neuer Rechner, neues Glück! Ich hoffe, es klappt diesmal mit dem Dateianhang.
|
AW: Erscheinen
Ich habe gerade die "alte" Version kompiliert und da ist mir aufgefallen, dass man nicht das Fenster an sich, sondern die enthaltenen Controls neu zeichnen muss, dann klappt es auch.
Delphi-Quellcode:
Procedure TForm1.TimerAnimateTimer(Sender: TObject);
Begin TimerAnimate.Enabled:=False; if AnimateWindow(self.Handle, 1000, AW_BLEND Or AW_ACTIVATE) then begin BtnAnimate.Repaint; BtnOut.Repaint; end; End; |
AW: Erscheinen
Danke für den Tipp. Es funktioniert super, was die Anzeige nach dem vollständigen Wiederherstellen anbelangt.
Unter Delphi 6 sieht man aber schon während des Einblendens die Controls auf dem Form. Zudem habe ich in meinem Programm eine ganze Menge davon und das wird mir dann zu aufwendig. Wie man das mit einer Schleife löst, ist mir nicht so richtig geläufig. Aber das geht wohl mit ComponentCount oder so? Müsste ich mir ansehen. Ich habe aber eine für mich vernünftige Lösung gefunden. Ich mache es über einen Thread. Ich probiere es mal auf anderen, leistungsärmeren Rechnern aus. Bin gespannt, ob es auch da flüssig fadet. Leider habe ich bislang noch keine Möglichkeit gefunden, auf die Zeit Einfluss zu nehmen, wie das eben bei AnimateWindow() möglich ist :-(. [EDIT]Schaden: auf langsamen Rechnern (PIII 800 MHz) läuft es nicht. Das Ausblenden per Thread braucht mehr als 2 Sekunden. Man könnte jetzt zwar Alpha um mehr als 1 erhöhen oder verringern. Dann ist es aber auf schnellen Rechnern (bei mir AMD 64 3700+) zu schnell. Auf AMD XP 1800+ sogar noch zu langsam auf Intel Atom N600 (?) grenzwertig. Am besten ist die Methode nur über Timer, die aber im Code später sehr unübersichtlich wird und mich daher zurück zur Frage bringt, wie kann ich TTimer.OnTimer zur Laufzeit eine Procedure zuweisen?[/EDIT] Gruß, Alex |
AW: Erscheinen
Irgendwie stehe ich im Moment auf dem Schlauch! Kann mir bitte mal jemand sagen, warum mein Fenster beim Aufruf von Fadeout() bei diesem Code nicht verschwindet, sich zwar verschieben aber nicht mehr beenden lässt:
Delphi-Quellcode:
Idee := Brain.Activate(self); bringt bei mir im Moment eine Exception erster Güte ;-)
Unit Fading2;
Interface Uses Forms; Procedure FadeOut(FadeForm: TForm; Const dwTime: Integer = 200; Const Close: Boolean = True); Implementation Uses Windows; Const Interval = 5; Procedure FadeOut(FadeForm: TForm; Const dwTime: Integer = 200; Const Close: Boolean = True); Var Done : Boolean; Alpha : Double; Step : Double; Procedure TimerProc(Wnd:HWnd; Msg, TimerID, dwTime: DWORD); Stdcall; Begin If Done Then Exit; Alpha:=Alpha - Step; If (Alpha < 0) Then Done:=True Else FadeForm.AlphaBlendValue:=Round(Alpha); End; Var oldAlpha : Integer; hTimer : Cardinal; Begin Done:= False; oldAlpha:=FadeForm.AlphaBlendValue; Alpha:= oldAlpha; Step:= Alpha / (dwTime / Interval); SetTimer(0, hTimer, Interval, @TimerProc); Repeat Application.ProcessMessages; Until Done; KillTimer(0, hTimer); If Close Then FadeForm.Close Else FadeForm.Visible:=False; FadeForm.AlphaBlendValue:=oldAlpha; End; End. Guß und Dank, Alex |
AW: Erscheinen
Ich habe gerade mal etwas ausprobiert (dieses Timer-Gedöns stört mich irgendwie):
Delphi-Quellcode:
Während der Animation ist zwar auch der Button nicht zu sehen, dafür aber danach, und das ganz ohne Refresh.
procedure TFormBla.btnWuppdiClick(Sender: TObject);
begin if AnimateWindow(Handle,2000,AW_BLEND or AW_HIDE) then begin sleep(500); AnimateWindow(Handle,2000,AW_BLEND or AW_ACTIVATE); end; end; |
AW: Erscheinen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DeddyH,
der Code funktioniert bei mir nicht. Ich habe es mit Deinem Code wieder probiert. Abgesehen davon, dass die Controls beim Einblenden nicht sichtbar sind, sind sie es auch danach nicht. Ich habe es aber nun mit TTimer hinbekommen und die Datei angehängt; für Leidensgenossen. Diesmal ohne exe nur mit Quellcode zum Selbercompilieren. Gruß, Alex |
AW: Erscheinen
Delphi-Quellcode:
Procedure TForm1.BtnAnimateClick(Sender: TObject);
Begin self.AlphaBlend:=False; AnimateWindow(self.Handle, 1000, AW_BLEND Or AW_HIDE); AnimateWindow(self.Handle, 1000, AW_BLEND Or SW_SHOW);; invalidate; End; |
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 |
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:
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.
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; 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. |
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:
Hier wird jetzt für Form2 OnActivate ausgeführt. Beim Wechsel zwischen den Forms wird für das jeweilige Form OnActivate ausgeführt.
{ Form1 ist MainForm }
Form2.Show;
Delphi-Quellcode:
Hier wird nur für Form2 OnActivate ausgeführt und dann ist Ruhe (auch beim Schließen von Form2)
{ Form1 ist MainForm }
Form2.ShowModal; Diese Vorgehensweise ist für mich auch logisch, denn beim
Delphi-Quellcode:
wird der Kontext von Form1 ja nicht verlassen. Bei
Form2.ShowModal
Delphi-Quellcode:
können aber beide Fenster aktiv sein und bei jedem Wechsel wird eben der Event ausgelöst.
Form2.Show
Auch das Auslösen von OnActivate bei
Delphi-Quellcode:
kann ich hier auch nicht nachvollziehen. Da kommt nur das Event
TForm2.Create( nil )
Delphi-Quellcode:
und mehr würde ich auch nicht erwarten
OnCreate
|
AW: Erscheinen
Zitat:
Zitat:
Delphi-Quellcode:
ein
OnActivate
Delphi-Quellcode:
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.
ShowMessage('SubForm.OnActivate()');
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 |
AW: Erscheinen
Zitat:
![]() Da geht das Darum der Hinweis, schau nach der Rubrik wo dir das aufgefallen ist |
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 22:56 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 by Thomas Breitkreuz