wie auf Lazarus-Fenster zugreifen (Handle)?

Für Fragen rund um die Ide und zum Debugger
Antworten
br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

wie auf Lazarus-Fenster zugreifen (Handle)?

Beitrag von br_klaus »

Hallo,
kann mir jemand sagen, wie ich aus einer laufenden Anwendung heraus auf die Fenster der IDE zugreifen kann? Ich bräuchte eigentich nur den Handle, dann kann ich schon über GetControl(Handle) ( - oder so ähnlich - ) auf die TControl zugreifen.
Konkret geht es mir darum, das Nachrichtenfenster, das unter den unteren Bildschirmrand gerutscht ist (also mit Screen nicht mehr erreichbar), wieder nach oben in den sichtbaren Bereich zu holen.
Weiß jemand eine Hilfe?
Herzlichen Dank!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: wie auf Lazarus-Fenster zugreifen (Handle)?

Beitrag von Socke »

br_klaus hat geschrieben:Konkret geht es mir darum, das Nachrichtenfenster, das unter den unteren Bildschirmrand gerutscht ist (also mit Screen nicht mehr erreichbar), wieder nach oben in den sichtbaren Bereich zu holen.
Dazu brauchst du kein extra Programm: Im Lazarus-Konfigurations-Verzeichnis (unter Windows 7: C:\Users\<username>\AppData\local\lazarus\) findest du die Datei environmentoptions.xml, in der die Dialogpositionen gespeichert sind. Entweder du löschst die ganze Datei (ACHTUNG: ein Großteil deiner Lazarus-Einstellungen ist weg) oder du sucht die Position für das Nachrichtenfenster und änderst/löschst diese. Bei mir sieht das so aus:

Code: Alles auswählen

<MessagesView>
        <WindowPlacement Value="RestoreWindowGeometry"/>
        <CustomPosition Left="277" Top="659" Width="398" Height="274"/>
        <WindowState Value="Normal"/>
        <Caption Value="Nachrichten"/>
      </MessagesView>
br_klaus hat geschrieben:kann mir jemand sagen, wie ich aus einer laufenden Anwendung heraus auf die Fenster der IDE zugreifen kann? Ich bräuchte eigentich nur den Handle, dann kann ich schon über GetControl(Handle) ( - oder so ähnlich - ) auf die TControl zugreifen.
Falls du das immer noch tun willst: Schreib dir ein Package; das installierst du und hast dann über Forms.Application.Forms zugriff auf alle Formulare der IDE (so die Theorie).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: wie auf Lazarus-Fenster zugreifen (Handle)?

Beitrag von theo »

Geht auch in der IDE, ohne Gefummel und für jedes IDE-Fenster:
Dateianhänge
lazwinpos.png

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Re: wie auf Lazarus-Fenster zugreifen (Handle)?

Beitrag von theo »

Für das Nachrichtenfenster benütze ich allerdings den Manual Docker seit Jahren. Völlig Problemlos.

http://wiki.freepascal.org/Manual_Docker" onclick="window.open(this.href);return false;

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: wie auf Lazarus-Fenster zugreifen (Handle)?

Beitrag von br_klaus »

theo hat geschrieben:Geht auch in der IDE, ohne Gefummel und für jedes IDE-Fenster:

Theoretisch müßte das auch bei mir gehen. Nur leider habe ich das Problem, daß CodeTYphon bei der Installation der Big IDE (eine reiche Auswahl an bereits vorinstallierten Packages), diese Optionen (Fenstergröße einstellen) gelöscht hat. Das muß wohl ein Bug bei denen sein, denich vielleicht noch finden werde...

Habe aber eine Möglichkeit gefunden, das Problem in Lazarus selber zu lösen, und zwar in der Unit Main in der Procedure

Code: Alles auswählen

procedure TMainIDE.OnGetLayout(Sender: TObject; aFormName: string; out
  aBounds: TRect; out DockSibling: string; out DockAlign: TAlign);
Da heißt es am Ende:

Code: Alles auswählen

if (aFormName=NonModalIDEWindowNames[nmiwMessagesViewName]) then begin // lädt das Nachrichtenfenster (MessagesView)
    // place messages below source editor
    ScreenR:=IDEWindowCreators.GetScreenrectForDefaults;
    if SourceEditorManager.SourceWindowCount>0 then begin
      SrcEditWnd:=SourceEditorManager.SourceWindows[0];
      aBounds:=GetParentForm(SrcEditWnd).BoundsRect;
      aBounds.Top:=aBounds.Bottom+25;
      aBounds.Bottom:=aBounds.Top+100;
    end else begin
      aBounds:=Rect(ScreenR.Left+250,ScreenR.Bottom-200,ScreenR.Right-250,100); // top = ScreenR.bottom-200, bottom = 100???
// Rect(ScreenR.Left+250,ScreenR.Bottom-200,ScreenR.Right-250,ScreenR.Bottom-100); nicht besser ?
    end;
    if IDEDockMaster<>nil then begin
      DockSibling:=NonModalIDEWindowNames[nmiwSourceNoteBookName];
      DockAlign:=alBottom;
    end;
  end;
(Ich hatte den Code schon einmal angegeben, und da scheint mir noch immer der gleiche Bug zu sein: abounds: Bottom < Top. Kann das vielleicht der Grund sein, dass das Fenster gar nicht angezeigt werden kann? Es muß doch wohl bei bottom statt "100" heißen "ScreenR.bottom-100", oder?)

Um zu verhindern, daß das Fenster beim Laden unterhalb des ScreenBereichs bleibt, füge ich einfach am Ende hinzu:

Code: Alles auswählen

if abounds.top > ScreenR.bottom-100 then abounds.top := ScreenR.bottom-100
Damit sieht der Code folgendermaßen aus (Fensterhöhe = 100 wie auch im Programmcode schon angegeben):

Code: Alles auswählen

if (aFormName=NonModalIDEWindowNames[nmiwMessagesViewName]) then begin // lädt das Nachrichtenfenster (MessagesView)
    // place messages below source editor
    ScreenR:=IDEWindowCreators.GetScreenrectForDefaults;
    if SourceEditorManager.SourceWindowCount>0 then begin
      SrcEditWnd:=SourceEditorManager.SourceWindows[0];
      aBounds:=GetParentForm(SrcEditWnd).BoundsRect;
      aBounds.Top:=aBounds.Bottom+25;
      // aBounds.Bottom:=aBounds.Top+100; --> kann wegfallen, wird noch einmal angegeben
    end else begin
      Rect(ScreenR.Left+250,ScreenR.Bottom-200,ScreenR.Right-250,ScreenR.Bottom-100); 
    end;
    if IDEDockMaster<>nil then begin
      DockSibling:=NonModalIDEWindowNames[nmiwSourceNoteBookName];
      DockAlign:=alBottom;
    end;
   if abounds.top > ScreenR.bottom-100 then abounds.top := ScreenR.bottom-100;
   abounds.bottom := abounds.top+100; 
  end;
So bleibt das Fenster immer im sichtbaren Bereich.

Antworten