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 Fenster mit Titel verschieben, nur bei best. Komponenten (https://www.delphipraxis.net/51812-fenster-mit-titel-verschieben-nur-bei-best-komponenten.html)

DevilsCamp 19. Aug 2005 12:29


Fenster mit Titel verschieben, nur bei best. Komponenten
 
Ich habe folgendes Problem:
Ich möchte gerne mein Fenster mit Titel durch Mausklick im Client-Bereich verschieben können.

Dazu habe ich mich Luckies Code aus der Code-Library bedient:

Allerdings habe ich nun das Problem, dass evtl. der Client-Bereich durch ein Panel (oder andere Komponenten) verdeckt ist, wodurch diese Methode nicht mehr dazu geeignet ist um das Fenster zu verschieben.

Daher möchte ich mir gerne eine Komponente schreiben, die mir die Möglichkeit gibt Komponenten anzugeben, bei denen das funktioniert.

Mein Versuch, ein Array mit den Namen der Komponenten zu erstellen und diese dann mit Hilfe von SetWindowLong auf WS_EX_TRANSPARENT zu stellen schlug leider fehl:
Delphi-Quellcode:
procedure TMoveEveryWhere.MoveExceptOn(KompArray: array of const);
var
  i : Integer;
  inde : Integer;
begin
  for i := 0 to High(FKompArray) do
  begin
    inde := setWindowLong(((Owner.FindComponent(FKompArray[i].Name)) as TWinControl).Handle, GWL_EXSTYLE,
             getWindowLong(((Owner.FindComponent(FKompArray[i].Name)) as TWinControl).Handle, GWL_EXSTYLE) and not WS_EX_TRANSPARENT);
  end; // for i := 0 to High(FKompArray)

  FKompArray := nil;

  for i := 0 to High(KompArray) do

    with KompArray[i] do
    begin
      case VType of
        vtString, vtAnsiString:
        begin
          inde := Length(FKompArray);
          SetLength(FKompArray, inde+1);
         
          if VType=vtAnsiString then
            FKompArray[inde].Name := string(VAnsiString)
          else
            FKompArray[inde].Name := VString^;

          inde := ((Owner.FindComponent(FKompArray[inde].Name)) as TWinControl).Handle;
          inde := setWindowLong(inde, GWL_EXSTYLE,
                   getWindowLong(inde, GWL_EXSTYLE) or WS_EX_TRANSPARENT);

          jj := GetLastError;

          inde := 0;

        end;
      end; // case VType

    end; // with KompArray[i]

end;
inde gibt nach Ausführen von setWindowLong 0 zurück (entspricht Fehler). GetLastError liefert mir den Wert 1411 (= "Klasse ist nicht vorhanden").

Hat jemand eine Idee, wie ich dieses Problem lösen kann?

DevilsCamp 19. Aug 2005 13:59

Re: Fenster mit Titel verschieben, nur bei best. Komponenten
 
ich habe noch eine weitere Methode gefunden mit der ich das Verschieben des Forms für jede Komponente Aktivieren kann, die ein OnMouseDown-Ereignis besitzt.

Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  if Button = mbleft then
  begin
    ReleaseCapture;
    Form1.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
  end;
end;
Allerdings schaffe ich es nicht, dies in meine Komponente einzubauen, dass dies dann automatisch verwendet wird. :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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-2025 by Thomas Breitkreuz