AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Fenster ausfahren

Ein Thema von EWeiss · begonnen am 7. Nov 2017 · letzter Beitrag vom 10. Nov 2017
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
4.329 Beiträge
 
Delphi 2010 Architect
 
#1

Fenster ausfahren

  Alt 7. Nov 2017, 02:11
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
Miniaturansicht angehängter Grafiken
07.11.jpg  

Geändert von EWeiss ( 7. Nov 2017 um 02:15 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
1.418 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Fenster ausfahren

  Alt 7. Nov 2017, 09:01
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
Win32Check(MoveWindow(...));

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

Geändert von TiGü ( 7. Nov 2017 um 09:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
4.329 Beiträge
 
Delphi 2010 Architect
 
#3

AW: Fenster ausfahren

  Alt 7. Nov 2017, 09:14
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
Panel geschmeidig ein- und ausblenden?

gruss

Geändert von EWeiss ( 7. Nov 2017 um 09:33 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
1.418 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Fenster ausfahren

  Alt 7. Nov 2017, 09:58
Probiere mal kleinere Schrittweiten beim rausfahren:
MoveWindow(Prop.Panel, rc.left, rc.Top + 2, //<----

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.

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.
Miniaturansicht angehängter Grafiken
movewindow.png  
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
4.329 Beiträge
 
Delphi 2010 Architect
 
#5

AW: Fenster ausfahren

  Alt 7. Nov 2017, 10:28
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

Geändert von EWeiss ( 7. Nov 2017 um 17:57 Uhr)
  Mit Zitat antworten Zitat
Nathan

Registriert seit: 6. Nov 2003
Ort: Birmensdorf / Zürich
7 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Fenster ausfahren

  Alt 7. Nov 2017, 10:36
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.
Nathan Chanan Thurnreiter
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
4.329 Beiträge
 
Delphi 2010 Architect
 
#7

AW: Fenster ausfahren

  Alt 7. Nov 2017, 10:38
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

Geändert von EWeiss ( 7. Nov 2017 um 17:57 Uhr)
  Mit Zitat antworten Zitat
Glados

Registriert seit: 10. Jul 2017
546 Beiträge
 
#8

AW: Fenster ausfahren

  Alt 7. Nov 2017, 13:12
Wenn ich das richtig verstehe meinst du nicht Fenster sondern einen Teil (Panel?) im Fenster.

Geändert von Glados ( 7. Nov 2017 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
4.329 Beiträge
 
Delphi 2010 Architect
 
#9

AW: Fenster ausfahren

  Alt 7. Nov 2017, 13:17
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
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
4.329 Beiträge
 
Delphi 2010 Architect
 
#10

AW: Fenster ausfahren

  Alt 9. Nov 2017, 16:16
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf