Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fenster ausfahren (https://www.delphipraxis.net/194295-fenster-ausfahren.html)

EWeiss 7. Nov 2017 01:11


Fenster ausfahren
 
Ich erstelle ein Fenster und möchte dieses ausfahren und zwar so das es an der Top Position stehen bleibt.

Irgendwie will das mal wieder nicht.
Wie kann ich das am besten bewerkstelligen.

So ist meine Vorgehensweise.

Delphi-Quellcode:
    WM_NCMOUSEMOVE:
      begin
        GetClientRect(WinHandle, rc);
        GetCursorPos(p);
        ScreenToClient(WinHandle, p);

        if (p.y > 40) and (p.y < 128) then
        begin
          if Prop.Panel = 0 then
            Prop.Panel := CreatePanel(Prop.MainHandle);

          Prop.PanelHeight := 128;
          Prop.HeightOffset := Prop.PanelHeight;

          GetWindowRect(WinHandle, rc);

          MoveWindow(Prop.Panel, rc.left, rc.Top + 40,
            (rc.right - rc.left), Prop.PanelHeight, False); // << Das passt nicht möchte hier das Fenster rausfahren nicht komplett Anzeigen.

          ShowWindow(Prop.Panel, SW_SHOW);
          Prop.bPanel := True;
        end else
        begin
          if Prop.bPanel then
            SetTimer(Prop.MainHandle, SKAERO_ANIM_TIMER, 16, nil);
        end;
      end;
Delphi-Quellcode:
    WM_TIMER:
      begin
        if wP = SKAERO_ANIM_TIMER then
        begin
          if Prop.Panel <> 0 then
          begin
            GetWindowRect(Prop.Panel, rc);
            if (Prop.HeightOffset > 0 ) then
            begin
              MoveWindow(Prop.Panel, rc.Left, rc.Top, rc.right - rc.left, Prop.HeightOffset, true);
              Prop.HeightOffset := Prop.HeightOffset - 10; // sollte umgekehrt sein das Fenster soll reinfahren bis es nicht mehr sichtbar ist.
            end
            else
            begin
              ShowWindow(Prop.Panel, SW_HIDE);
              KillTimer(WinHandle, SKAERO_ANIM_TIMER);
              Prop.bPanel := False;
              DestroyWindow(Prop.Panel);
            end;
          end;
        end;
Es geht um den Bereich wo die Thumbnails zu sehen sind.

gruss

TiGü 7. Nov 2017 08:01

AW: Fenster ausfahren
 
1. Es wäre immer schön, wenn du uns zeigst, als welchen Typ deine Variablen deklariert sind, weil man so sonst immer raten muss (rc, p, Prop.MainHandle, Prop.Panel etc.).
2. Du hast deine Erwartungshaltung zwar beschreiben, aber nicht den aktuellen Ist-Zustand. Was genau will denn nicht? Was passiert? Wie sieht es zur Zeit aus? Oder um mit Textaufgaben aus der Schule zu sprechen: du hast das "Gesucht" geschrieben, aber nicht das "Gegeben".
3. Wieder mal völliges fehlen der Auswertung der Rückgabewerte der Windowsfunktionen, die alle gut in der MSDN dokumentiert sind. Stichwort: Fehlerbehandlung! Du wurdest darauf schon sehr oft hingewiesen. Auf jeden Fall sowas schreiben wie
Delphi-Quellcode:
 if not MoveWindow(...) then
  RaiseLastOSError;
oder
Delphi-Quellcode:
Win32Check(MoveWindow(...));


4. MoveWindow hat als letzten Parameter
Delphi-Quellcode:
_In_ BOOL bRepaint
. Wie ist es, wenn du hier mal TRUE schreibst?

EWeiss 7. Nov 2017 08:14

AW: Fenster ausfahren
 
Zitat:

Du hast deine Erwartungshaltung zwar beschreiben, aber nicht den aktuellen Ist-Zustand.
1.// << Das passt nicht möchte hier das Fenster rausfahren nicht komplett Anzeigen. (Der ist zustand liest sich heraus (Das Fenster wird komplett angezeigt beim start)
2.// sollte umgekehrt sein das Fenster soll reinfahren bis es nicht mehr sichtbar ist. (Der ist zustand liest sich heraus(Das Fenster soll in umgekehrter weise sliden)

Zitat:

Es wäre immer schön, wenn du uns zeigst, als welchen Typ deine Variablen deklariert sind, weil man so sonst immer raten muss (rc, p, Prop.MainHandle, Prop.Panel etc.).
Die Namensgebung sollte das schon verständlich machen.
MainHandle das Fensterhandle der Anwendung muss überlegen glaube
Delphi-Quellcode:
HWND = type LongWord;
//The LongInt type is the equivalent 32 bit type for signed integers (-2147483648 to 21474783647).
Prop.PanelHeight irgendwas mit Höhe Integer.

Ok sorry aber das war nicht die Frage.
Zitat:

Wieder mal völliges fehlen der Auswertung der Rückgabewerte der Windowsfunktionen.
MoveWindow..
Habe noch nie Rückgabewerte für solche triviale Dinge definiert und ist auch nicht nötig.
Zeige mir einen sinnvollen Win32Api Code in dem die Rückgabe von MoveWindow ausgewertet wird.

Auch hier hat nichts mit meiner Fragestellung zu tun.

Zitat:

Wie ist es, wenn du hier mal TRUE schreibst?
Nein ich will kein neu zeichnen.
Zitat:

Indicates whether the window is to be repainted. If this parameter is TRUE, the window receives a message. If the parameter is FALSE, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of moving a child window.
Werde mir mal die Funktion von Zacherl anschauen. Danke
http://www.delphipraxis.net/1381702-post24.html

gruss

TiGü 7. Nov 2017 08:58

AW: Fenster ausfahren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Probiere mal kleinere Schrittweiten beim rausfahren:
Delphi-Quellcode:
MoveWindow(Prop.Panel, rc.left, rc.Top + 2, //<----


Zitat:

Zitat von EWeiss (Beitrag 1385435)
Zitat:

Wieder mal völliges fehlen der Auswertung der Rückgabewerte der Windowsfunktionen.
MoveWindow..
Habe noch nie Rückgabewerte für solche triviale Dinge definiert und ist auch nicht nötig.

Klar ist das trivial, aber so kannst du doch einfach mal die grundlegenden Fehlerquellen ausschließen, wie bspw. ungültiges Handle oder sowas.
Keine Angst, das wird dein Code auch nur um 2 Nanosekunden langsamer machen. :shock:

Zitat:

Zitat von EWeiss (Beitrag 1385435)
Zitat:

Wie ist es, wenn du hier mal TRUE schreibst?
Nein ich will kein neu zeichnen.

Hast du denn bRepaint = True einfach mal schnell ausprobiert oder magst du jetzt aus Dickköpfigkeit nicht mehr?
Wenn ich in einen kleinen Test das mal ausprobiere, sehe ich schon, dass ein Neuzeichnen nicht verkehrt wäre (siehe Bildanhang).

Delphi-Quellcode:
procedure TForm5.Panel1Click(Sender: TObject);
var
  bRepaint: BOOL;
begin
  bRepaint := True; //False
  Panel1.Caption := 'bRepaint is ' + BoolToStr(bRepaint, True);
  Win32Check(MoveWindow(Panel1.Handle, Panel1.Left + 10, Panel1.Top + 10, Panel1.Width + 10, Panel1.Height + 10, bRepaint));
end;
PS: rc und p sind keine guten Beispiele für sinnvolle Namensgebung.

EWeiss 7. Nov 2017 09:28

AW: Fenster ausfahren
 
erst mal Danke.

Zitat:

Probiere mal kleinere Schrittweiten beim rausfahren:
Das Problem ist nicht die Schrittweise das funktioniert immer egal welche Value ich dort übergebe.

Mein Problem ist das nicht das ganze Fenster rausgefahren wird sondern dieses nur in der Höhe verändert wird.
Das hat einen faden Visuellen Beigeschmack.

Ich habe aber keine Idee wie ich das sonst machen könnte.
Das Fenster ist kein Parent von der Main Form deshalb muss ich es beim Start in der Höhe auf 0 setzen und diese pixelweise auf die end höhe vergrößern.
Das ist mein eigentliches Dilemma.

Zitat:

Hast du denn bRepaint = True einfach mal schnell ausprobiert oder magst du jetzt aus Dickköpfigkeit nicht mehr?
Wenn ich in einen kleinen Test das mal ausprobiere, sehe ich schon, dass ein Neuzeichnen nicht verkehrt wäre (siehe Bildanhang).
Nein ich tue es deshalb nicht weil es nicht von Nöten ist es gibt keine schlieren weil es kein Parent der Main Form ist.
Dein Panel ist Parent deshalb must du bRepaint auf TRUE setzen damit der Hintergrund sich neu zeichnet beim verschieben.

Ein Neuzeichnen ist nicht nötig das ist der einzige Grund. (Es sei denn ich will den Desktop aktualisieren) :)

Zitat:

PS: rc und p sind keine guten Beispiele für sinnvolle Namensgebung.
Dem kann ich nicht widersprechen.

Zitat:

Keine Angst, das wird dein Code auch nur um 2 Nanosekunden langsamer machen.
Kein Problem habe ich nicht;)

Aber warum ich es nicht mache will ich noch erläutern.
MoveWindow ist ein Visuelle Funktion die man Visuell gegenprüfen kann, entweder das Window verschiebt sich oder halt nicht.
Und das kann man sehen (Visuell also)
Ich weis\sehe also ohne einer Rückgabe Auswertung ob die Funktion erfolgreich war oder nicht.
Daher kann ich mir diese sparen.

gruss

Nathan 7. Nov 2017 09:36

AW: Fenster ausfahren
 
Ich verwende in älteren VCL Projekten die WinAPI Funktion AnimateWindow().

Für TForm z.B.
Delphi-Quellcode:
  Form2.BringToFront;
  AnimateWindow(Form2.Handle, 250, AW_BLEND);
  Form2.Show;
In einem alten Projekt für ein TPanel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Panel1.Visible then
    ClosePanel
  else
    OpenPanel;
end;

procedure TForm1.OpenPanel;
begin
  AnimateWindow(Panel1.Handle, 250, AW_ACTIVATE or AW_VER_NEGATIVE);
  Panel1.Visible := True;
end;

procedure TForm1.ClosePanel;
begin
  AnimateWindow(Panel1.Handle, 250, AW_ACTIVATE or AW_VER_NEGATIVE);
  Panel1.Visible := False;
end;
Ist nur Pseudocode aus einer einfach erstellten VCL Anwendung mit 2 TForms. Vielleicht hilf es dir.

EWeiss 7. Nov 2017 09:38

AW: Fenster ausfahren
 
Zitat:

Ist nur Pseudocode aus einer einfach erstellten VCL Anwendung mit 2 TForms. Vielleicht hilf es dir.
Danke nein das Hilft nicht.

Ich muss das Komplette Window scrollen nicht in der Höhe pixelweise verändern.

gruss

Glados 7. Nov 2017 12:12

AW: Fenster ausfahren
 
Wenn ich das richtig verstehe meinst du nicht Fenster sondern einen Teil (Panel?) im Fenster.

EWeiss 7. Nov 2017 12:17

AW: Fenster ausfahren
 
Zitat:

Wenn ich das richtig verstehe meinst du nicht Fenster sondern einen Teil (Panel?) im Fenster.
Nein falsch verstanden ich meine Fenster und habe es auch geschrieben ;)

gruss

EWeiss 9. Nov 2017 15:16

AW: Fenster ausfahren
 
Woran kann es liegen das sich mein Fenster nicht in den Negativen "Top" Bereich verschieben lässt?
Das müsste doch eigentlich gehen.

Ein 0 -y funktioniert nicht das Child Window bleibt immer bei 0 stehen.
tssss...

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 Uhr.
Seite 1 von 2  1 2      

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