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

Jan.R 25. Aug 2008 17:17


Erscheinen
 
Wie kann ich in Delphi, Editfelder usw. erscheinen lassen, ohne das ich "caption" verwende?

DP-Maintenance 25. Aug 2008 17:20

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Multimedia" nach "VCL / WinForms / Controls" verschoben.
Falsche Sparte.. hier gehts um Controls

STS301 25. Aug 2008 17:20

Re: Erscheinen
 
wie meinst du erscheinen lassen ohne caption, versuch einmal Komponente.Visible:= true (false, wenn du sie verschwinden lassen willst)

Phoenix 25. Aug 2008 17:22

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:

mr_emre_d 26. Aug 2008 03:17

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 !

;)

Mackhack 26. Aug 2008 08:13

Re: Erscheinen
 
Oder die MSDN-Library durchsuchenAnimateWindow Funktion nutzen!

Schwedenbitter 20. Okt 2010 14:14

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

Zitat:

Zitat von Mackhack (Beitrag 816714)
Oder die MSDN-Library durchsuchenAnimateWindow Funktion nutzen!

da ich genau mit dieser Funktion Probleme habe, nehme ich das Thema mal wieder auf.

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 MSDN-Library durchsuchenAnimateWindow. Es besteht das Problem, dass bei Verwendung von AnimateWindow die Controls nach dem Einblenden nicht zu sehen sind.
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

DeddyH 20. Okt 2010 14:53

AW: Erscheinen
 
Versuch doch nach Ende der Animation mal ein Refresh.

Schwedenbitter 20. Okt 2010 17:25

AW: Erscheinen
 
Zitat:

Zitat von DeddyH (Beitrag 1056719)
Versuch doch nach Ende der Animation mal ein Refresh.

Danke für die Antwort. Leider klappt das auch nicht. Ich habe Refresh/Repaint/Update probiert; leider alles ohne Erfolg.

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

DeddyH 20. Okt 2010 17:28

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.

Schwedenbitter 20. Okt 2010 20:06

AW: Erscheinen
 
Zitat:

Zitat von DeddyH (Beitrag 1056764)
... die Controls (waren) nach einem Verschieben des Fensters außerhalb des sichtbaren Bildschirmbereiches und wieder zurück dann sichtbar ...

Das hatte ich auch schon festgestellt, bin aber nicht auf Refresh & Co. gekommen.

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

DeddyH 20. Okt 2010 20:11

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).

Schwedenbitter 21. Okt 2010 00:47

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

Schwedenbitter 21. Okt 2010 09:28

AW: Erscheinen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Neuer Rechner, neues Glück! Ich hoffe, es klappt diesmal mit dem Dateianhang.

DeddyH 21. Okt 2010 09:36

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;

Schwedenbitter 21. Okt 2010 10:37

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

Schwedenbitter 21. Okt 2010 14:27

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:
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.
Idee := Brain.Activate(self); bringt bei mir im Moment eine Exception erster Güte ;-)

Guß und Dank, Alex

DeddyH 21. Okt 2010 14:39

AW: Erscheinen
 
Ich habe gerade mal etwas ausprobiert (dieses Timer-Gedöns stört mich irgendwie):
Delphi-Quellcode:
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;
Während der Animation ist zwar auch der Button nicht zu sehen, dafür aber danach, und das ganz ohne Refresh.

Schwedenbitter 21. Okt 2010 16:10

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

Bummi 21. Okt 2010 16:35

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;

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 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