AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Projektpfad in der IDE-Titelzeile anzeigen?

Projektpfad in der IDE-Titelzeile anzeigen?

Ein Thema von PeterPanino · begonnen am 27. Jun 2018 · letzter Beitrag vom 1. Jul 2018
Antwort Antwort
Seite 3 von 4     123 4   
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 28. Jun 2018, 22:39
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#22

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 30. Jun 2018, 08:26
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.

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.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#23

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 30. Jun 2018, 08:54
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 ...
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#24

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 30. Jun 2018, 09:29
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?

Geändert von PeterPanino (30. Jun 2018 um 09:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 30. Jun 2018, 09:54
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:screenshot-30_06.jpg
Angehängte Dateien
Dateityp: 7z ShowPath.7z (2,5 KB, 2x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 30. Jun 2018, 10:50
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.
Angehängte Dateien
Dateityp: 7z ShowPath_Hook.7z (2,9 KB, 2x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (30. Jun 2018 um 17:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#27

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 30. Jun 2018, 18:11
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
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

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.
Angehängte Dateien
Dateityp: 7z ShowPath_Hook.7z (2,9 KB, 4x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (30. Jun 2018 um 19:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 30. Jun 2018, 20:44
*entfernt, Beitrag war schädlich/gefährlich*
Gruß vom KodeZwerg

Geändert von KodeZwerg (30. Jun 2018 um 21:27 Uhr)
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#29

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 1. Jul 2018, 11:56
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.

Geändert von PeterPanino ( 1. Jul 2018 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Projektpfad in der IDE-Titelzeile anzeigen?

  Alt 1. Jul 2018, 12:56
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 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!
Angehängte Dateien
Dateityp: 7z ShowPath_Hook.7z (4,3 KB, 1x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
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:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.
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