Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Projektpfad in der IDE-Titelzeile anzeigen? (https://www.delphipraxis.net/196886-projektpfad-der-ide-titelzeile-anzeigen.html)

KodeZwerg 28. Jun 2018 21:39

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1406074)
OTA-Lösungen basieren in der Regel nicht auf Message-Hooks sondern auf Notifications der IDE. Mir ist aber keine bekannt, die für diesen Zweck geeignet wäre.

Danke dafür, das bestätigt irgendwie auch meine Recherche. Man kann ja vieles aber doch nicht alles, mir fehlt da jedenfalls das nötige knoffhoff.
Ich spiele noch ein wenig mit AllocWnd()/AllocateHWnd() herum, vielleicht passt da ne hook rein die Delphi nix böses antut. Falls ich da Erfolg haben sollte sag ich hier bescheid, hier ist sonst Endstation für mich und TE hat Pech:oops:

PeterPanino 30. Jun 2018 07:26

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1406011)
Unabhängig davon wird aber auch ohne so ein Plugin der vollständige Pfad des Projekts in der Fußzeile der Projektverwaltung angezeigt, wenn das Projekt in der Struktur selektiert ist.

Meistens ist das Panel mit der Projektverwaltung irgendwo angedockt, sodass dort nicht viel Platz zum Anzeigen eines längeren Pfades vorhanden ist. Die Titelzeile ist der ideale Platz zum Anzeigen eines Pfades.

Zitat:

Zitat von Uwe Raabe (Beitrag 1406011)
Alternativ würde ich auch eher eine separate Toolbar empfehlen, in der diese Information dann angezeigt wird. Das ist zukunftssicherer, als irgendein Hack in die IDE, der bei der nächsten Version dann womöglich nicht mehr funktioniert oder sogar was kaputt macht.

Also wenn das mit einer Toolbar geht, die nur minimalen Platz wegnimmt, dann würde es ebenso seinen Zweck erfüllen. In der Titelzeile würde es halt gar keinen Platz wegnehmen.

PeterPanino 30. Jun 2018 07:54

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1406019)
Hier ein mini Update

Danke! Wenn ich (in 10.2.3) ein Projekt lade, wird für kurze Zeit der Pfad dieses Projektes angezeigt, aber dann gleich von der Default-Caption überschrieben. Wenn man die Default-Caption in einer Variable speichern könnte, dann müsste man nur den Pfad dieser Variable HINZUFÜGEN (anstatt die Default-Caption zu ersetzen). Von irgendwo muss die IDE ja die Default-Caption holen. Wenn man also diese Default-Caption ersetzen könnte ...

PeterPanino 30. Jun 2018 08:29

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1406061)
Ich habe mal einen SetTimer() eingebaut, darauf reagiert die IDE allergisch und forciert sofort ein Caption-Refresh, also diese Möglichkeit scheidet damit aus.

Wie wäre es, wenn man eine Message an sich selbst sendet und dann im Message-Handler die Caption setzt?
TApplication.HookMainWindow?

KodeZwerg 30. Jun 2018 08:54

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier ein mini Update für Messages, nun haben die Ihren Eigenen Reiter (Tab).
Jetzt werden keine Messages mehr durcheinander gewürfelt, und falls Messages nicht sichtbar sind schaltet die das Plugin an.
Vorschau:Anhang 49417

KodeZwerg 30. Jun 2018 09:50

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist eine NICHT funktionierende Version mit Deinem Hook Vorschlag.
Es funktioniert NICHT oder ich mache es falsch.
Den Hook habe ich ausgeschaltet damit die IDE heile bleibt.
Delphi-Quellcode:
constructor TShowPath.Create;
begin
  inherited Create;
//  Application.HookMainWindow(MessageHook);
//  Application.OnMessage := AppMessage;
//  fHWnd := AllocateHWnd(WndMethod);
end;

destructor TShowPath.Destroy;
begin
//  Application.UnhookMainWindow(MessageHook);
//  DeallocateHWnd(fHWnd);
  inherited Destroy;
end;
die // Zeichen entfernen damit der Hook wirksam wird.
Delphi-Quellcode:
function TShowPath.MessageHook(var Msg: TMessage): Boolean;
begin
  Result := False;
  if (Msg.Msg = WM_SETTEXT) then
  begin
    (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(
     'WM_SETTEXT', MyGroup);
    if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption))
      then Application.MainForm.Caption := NewTitle;
    Msg.Result := 0;
    Result := True;
  end;
end;

procedure TShowPath.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
   Handled := False;
   if (Msg.Message = WM_SETTEXT) then
   begin
     (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(
      'WM_SETTEXT', MyGroup);
     if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption))
      then Application.MainForm.Caption := NewTitle;
     Msg.message := 0;
     Handled := True;
   end;
end;

procedure TShowPath.WndMethod(var Msg : TMessage);
var
  Handled: Boolean;
begin
  Handled := True;
  case Msg.Msg of
    WM_SETTEXT: if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption))
      then Application.MainForm.Caption := NewTitle;
    else
      Handled := False;
  end;
  if Handled then
    Msg.Result := 0
  else
    Msg.Result := DefWindowProc(fHWnd, Msg.Msg,
      Msg.WParam, Msg.LParam);
end;
Das sind die eigentliche Hooks, funktioniert so nicht oder ich habe da gänzlich was falsch gemacht.

Ps: In dieser Version habe ich die Messages ein klein wenig verändert, nun werden Sie nicht mehr in den Vordergrund forciert.
Ich bin mit meinem Latein am Ende.

edit
Dieser Anhang ist nur für experimentier freudige!
Habe den Anhang aktualisiert mit drei Hook Varianten, alle sind ausgeklammert beim kompilieren da es nicht das gewünschte Resultat bietet.
Die Timer Methode kann man im initialization & finalization anschalten.

Mehr Hook Methoden fallen mir wirklich nicht mehr ein. Wie Uwe sagte, es klappt so nicht da dafür keine Notification existiert.

KodeZwerg 30. Jun 2018 17:11

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist eine Version die tatsächlich die Titelzeile (leider flackernd) up-to-date hält.
Das ist praktisch das gleiche wie oben nur total radikal da bei jeder Msg die Caption ein Update erhält sofern die nicht den Inhalt der letzten Datei entspricht.
Ich empfehle es nicht zu benutzen, Source kannst Du ja nach belieben noch verbessern/verschlimmern :lol:
Man sieht mehr den Pfad+Namen als das was Delphi da reinschreiben will, also es macht schon irgendwie das was Du in Post #1 wolltest.

Aber irgendwo ist der Wurm drinnen, wenn man Delphi beenden will stürzt Delphi ab.
Also da musst Du mithelfen den Fehler zu lokalisieren, ich entdecke ihn nicht :pale:

Nachtrag:
Dank dieses Projekts ist mir was aufgefallen was ich so vorher auch noch nicht wusste.
Die HookMainWindow Methode wird ausgelöst nachdem Delphi Messages verarbeitet hat.
Die OnMessage Methode wird ausgelöst bevor Delphi Messages verarbeitet.
Die AllocateHWnd Methode funktioniert gar nicht, ob nur in diesem Kontext oder generell ist ungewiss, bei Forms klappt es meist.

Also wenn man bei OnMessage das richtige Ereignis abfängt sollte es immer das machen was Du möchtest ohne das momentane geflackere.
Damit wäre auch der Delphi beenden bug eleminiert.

KodeZwerg 30. Jun 2018 19:44

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
*entfernt, Beitrag war schädlich/gefährlich*

PeterPanino 1. Jul 2018 10:56

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Die Caption bei jedem Aufruf von TShowPath.MessageHook zu ändern ist natürlich keine Option.

Die Filterung nach WM_SETTEXT in TShowPath.MessageHook ist letztlich unwirksam, weil die IDE das nach kurzer Zeit wieder überschreibt.

Eine Möglichkeit, die man noch probieren könnte, wäre das Senden einer USER-MESSAGE entweder in TShowPath.FileNotification, oder in TShowPath.MessageHook bei WM_SETTEXT.

Aber das würde ein dauerndes Überschreiben erzeugen, zwar nicht so stark flackernd wie beim ungefilterten TShowPath.MessageHook, aber es wäre - um eine Metapher zu verwenden - wie ein ständiges Aufwischen ständig verschütteter Milch. Besser wäre es, es gar nicht erst so weit kommen zu lassen, dass überhaupt Milch verschüttet wird.

Das eigentliche "Problem" ist ja, dass die IDE selbst nur den Projektnamen in die Titelzeile schreibt anstatt den ganzen Pfad des Projektes. Ich weiß nicht, ob es möglich ist, den Code der IDE so zu patchen, dass einfach statt des Projektnamens der ganze Pfad geschrieben wird. Das wäre die sauberste Lösung. Am einfachsten wäre es natürlich, wenn man den Code der IDE zur Verfügung hätte. Embarcadero müsste ausschließlich den UI-Teil der IDE als Open Source zur Verfügung stellen, die man nach eigenem Belieben anpassen kann. Wenn Embarcadero gescheit wäre, würden sie das tun. Denn das Ziel sollte es sein, die Weiterentwicklung der IDE AUF EINE BREITERE BASIS ZU STELLEN, um die IDE aus der Steinzeit in die Moderne zu führen.

---
PS: Das Crashen beim Beenden der IDE kommt offenbar daher, dass wegen der hohen Aufruf-Häufigkeit von TShowPath.MessageHook versucht wird, Methoden von TShowPath auszuführen wenn IDE-Objekte schon nicht mehr existieren.

KodeZwerg 1. Jul 2018 11:56

AW: Projektpfad in der IDE-Titelzeile anzeigen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das was Du möchtest funktioniert nicht. Ich habe gestern Nacht noch ein wenig herum-experimentiert um herauszufinden ob man mit der OnMessage Methode ein passendes Ereignis abfangen, auswerten und verarbeiten kann = Nein man kann nicht bzw ich habe dabei die Geduld verloren.
Bei Interesse, im Anhang ist die OnMessage Variante die gleichzeitig einen neuen Message-Reiter "MyHook" einrichtet.

Hier ist das Herz-Stück davon:
Delphi-Quellcode:
procedure TShowPath.AppMessage(var Msg: TMsg; var Handled: Boolean);
var
  ClassName, WindowName: String;
begin
   Handled := False;

// Hier ist ein Beispiel wie man sich auf eine Message von einer bestimmten Resource festlegt
{
   SetLength(ClassName, 64);
   SetLength(ClassName, GetClassName(Msg.hwnd, PWideChar(ClassName), 64));
   SetLength(WindowName, 64);
   SetLength(WindowName, SendMessage(Msg.hwnd, WM_GETTEXT, 64, lParam(PChar(WindowName))));
   if ((Msg.message = 275) and (ClassName = 'TPUtilWindow')) then
   begin
     if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption))
      then Application.MainForm.Caption := NewTitle;
//     Handled := True; // <- AUF GAR KEINEN FALL TRUE ÜBERGEBEN WENN NICHT ZU 1000% SICHER!!!!
//     Exit; // Das hier aktivieren um Eintrag in die StringList zu unterdrücken
   end;
}

//   if Msg.hwnd = Application.Handle then // So grenzt man das ganze auf seine Eigene Applikation ein, in diesem Falle falsch.
    if ((NewTitle <> '') and (NewTitle <> Application.MainForm.Caption))
      then
      begin
// Hier wird die Caption neu betitelt und gleich danach wieder von Delphi oder WinApi überschrieben
        Application.MainForm.Caption := NewTitle;
        try
        finally
// Wenn man sich auf einen Window/ClassName geeinigt hat kann man auch die Params mit einbeziehen was zu deutlich mehr Ergebnissen führt
// aber wenn man es Perfekt haben will, kann man nur so sich tiefer und tiefer reinbuddeln bis man am Ziel ist.
// dafür existiert ein weiterer Boolean bei der Übergabe
// Anmerkung: hier sieht man auch wie man auf die aktuelle Msg reagiert und nicht die Last-Variablen
//          if ((AddSList(Msg.hwnd, Msg.message, Msg.lParam, Msg.wParam, True, True)) and (SList.Count > 0)) then
// Hier ein Beispiel mit den Last-Variablen
//          if ((AddSList(LastH, LastM, LastL, LastW, True)) and (SList.Count > 0)) then
// Der minimalste Aufruf von AddSList() der auch noch Sinn erfüllt sieht so aus:
          if ((AddSList(Msg.hwnd, Msg.message)) and (SList.Count > 0)) then
           begin
            (BorlandIDEServices as IOTAMessageServices).AddTitleMessage(
             'AppMessage @ '+SList.Strings[SList.Count-1], HookGroup);
//            Handled := True; // <- AUF GAR KEINEN FALL TRUE ÜBERGEBEN WENN NICHT ZU 1000% SICHER!!!!
           end;
        end;
      end;
end;
Je mehr Input Du AddSList() übermittelst um so feiner wird es aber es bezieht auch gleich immer mehr Ergebnisse mit ein.
Du wirst sehen was ich meine sobald du mal
Delphi-Quellcode:
if ((AddSList(Msg.hwnd, Msg.message, Msg.lParam, Msg.wParam, True, True)) and (SList.Count > 0)) then
aufrufst.
Die AddSList() sollte lieber die ganze TMsg mitgeliefert bekommen, wäre einfacher, mir war es in dem Moment egal. Kannst Du ja gerne korrigieren.

Ich mache an diesem Punkt damit nicht weiter, Nadel im Heuhaufen findet man schneller als das Ereignis was für die Caption verantwortlich ist. Ich wünsche Dir auf jeden Fall viel Glück bei dem Vorhaben! Meine Vermutung ist das es schlicht nicht möglich ist das generisch so hinzubekommen das es auf jedem Rechner mit jeder Delphi Version gleich funktioniert.

Du kannst natürlich auch alles was Du selber vorschlägst durchprobieren, ich gehe da auch von einem Scheitern aus.
Ich bin gespannt ob Du da was hinbekommst!:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Seite 3 von 4     123 4      

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